反爬措施
第 1 种反爬措施是加随机等待时间,第 2 种是加入随机的 UserAgent,上次漏讲了一点,有一个可以用来生成随机 UserAgent 的第三方库,不用我们自己从 上去复制粘贴 UserAgent。
第 3 个反爬措施是今天要给大家分享的自建代理IP池。 上有很多免费的代理 IP,但是这些免费的代理 IP 可用率都不高,因为可能这一个 IP 很多人同时在用,这样就会导致这个 IP 的存活时间很短。但是,毕竟如果我们只是偶尔的用一下爬虫,去买付费的代理 IP 的话也不是很划算,所以今天的分享呢,是教大家怎么利用好这些免费的 IP 来创建自己的代理 IP 池。
代理池种类
今天跟大家分享的代理池分为两种。一种是创建国内的代理 IP 池,主要用来爬取国内的一些 站。另一种是含有国外的代理 IP,比如我上次爬取的插画 站 pixiv,它是需要用到国外 IP 的。
建立代理 IP 池的步骤无非就两步。
1、提取 IP 信息
从目标 站提取我们需要的代理 IP 和端口信息。
2、检测 IP 是否可用
我们用特定的 站来检测这个代理 IP 是否可用,可用的话就保存起来,不可用的话就继续检测下一个,如此循环。那刚才说的国内和国外的两种代理池的主要代码都是一样的,区别的地方就是爬取代理 IP 的 站不一样而已。导致我们从页面提取 IP 的代码就略有不同。
自建国内代理 ip 池
那我们就以爬取国内免费代理 IP 为例。国外代理 IP 我只讲提取 IP 的那一部分代码。首先,我们找到免费代理 IP 的目标 站。
很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:810735403
初始化函数
我们先把几个变量初始化下,测试 IP 是否可用的 url、获取 IP 的 url、User-Agent 信息和保存 IP 的 txt 文件信息。
然后我们通过分析代理 IP 的目标 站来提取 IP 和端口,一般是把 页信息转换成 lxml 或者 XML 格式,然后用 xpath 或者正则表达式来提取信息,这次我用的是 etree.HTML() 用来解析字符串格式的 HTML 文档对象,然后用 xpath 提取信息。
页面有分页,我们加一个 for 循环就可以控制我们提取的页码。
然后接下来是把这个代理 IP 拼接下,去请求检测 站来检查这个 IP 是否可用,检测国内的 IP 我用到的是 httpbin 站,httpbin 是一个使用 Python Flask 框架编写的 HTTP Request 和 Response 服务。该服务主要用于测试 HTTP 库。你可以向他发送请求,然后他会按照指定的规则将你的请求返回。
我们来测试下 httbin,直接请求的话,我们看下打印的信息。
返回的 origin 就是你的 IP。
如果这个 IP 一直频繁请求一个 站的话,可能就会被封禁了,用一个可用 IP 访问 httpbin。如果返回码是 200 那就是成功的,所以我们爬取的同时判断下返回码,如果是 200 就表示这个代理 IP 是可用的,否则这个 IP 就不可用。
所以建代理池就这些步骤。那我们来爬取国内免费 IP 看一下,我这次爬取的是前 150 页,输出控制台里看到,前 150 页共有 800 多个 IP 但只有 29 个是可用的,可用率很低。
这些可用的也直接保存在了我指定的 txt 文件里,下次获取的话直接从这个文件里获取。
自建国外代理 ip 池
那下面来说说创建国外的代理 IP 池,我找了一个含有国外代理 IP 的 站。
同样的方法,分析一下这个页面,这次我用了正则表达式来提取,它的 IP 和端口很轻松就被提取出来了。
因为这次是用来爬取插画 站 pixiv,所以这次的检测 站就换成了pixiv。其他的步骤几乎一模一样。运行代码结束后,我查看了一下,共爬取 800 多个 IP 但只有 3 个是可用的,这个可用率也是非常低了,那如果你想继续追加保存 IP 的话,你也可以修改那个循环来控制爬取的页面,或者你换一个其他的代理 IP 站,提取 IP 的代码稍加修改下,就可以把代理 IP 提取出来,往 txt 文件里面继续追加。
加入代理池进行爬虫
现在对上次的代码优化下,每次请求时随机使用代理 ip 池里的 ip,我们先写一个读取 txt 文件信息的方法,这个方法把 IP 信息读取后保存为列表,并随机返回列表里的一个 IP,再以字典形式返回。
请求参数里带上上面返回的代理 ip,再用 try 捕捉下异常就可以开始爬取了。
上次爬取的是今日的插画,这次用代理池就不爬今日的了,这次爬取本周、本月、新人模式的,这个在参数里改下 mode 的值就行。
你也可以把今日、本周、本月、新人模式的值放在列表里,你再用一个循环就搞定。
目前每个模式最多 500 张图片,全部爬取完也就 2000 张图片,也不多,所以代理池里的 ip 少也没事,基本也能爬完,如果你爬取的图片多,比如你还要爬取上月、上上月的图片,那就要更多的代理 ip 放到你的代理池了,上面捕鱼的办法无私分享给大家了,看着这里可以给文章来个三连鼓励下了。
最后,本次分享的免费代理池不适合用来做大的爬虫项目的,大的爬虫项目爬取量比较大,这些免费的代理 IP 显然是不够稳定和不够用的
在这里还是要推荐下我自己建的Python开发交流学习(qq)群:810735403,群里都是学Python开发的,如果你正在学习Python ,欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),包括我自己整理的一份2021最新的Python进阶资料和高级开发教程,欢迎进阶中和想深入Python的小伙伴!
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!