文章目录

反爬措施

上次给大家分享了怎么用爬虫批量的下载插画网站 P 站的图片:终于,我用爬虫批量保存了P站的靓图,后面讲到了反爬措施。第 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 的目标网站。

图片

初始化函数

我们先把几个变量初始化下,测试 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,直接请求的话,我们看下打印的信息。

import requests
from fake_useragent import UserAgent
url='http://httpbin.org/get'

headers={'User-Agent':UserAgent().random}

html=requests.get(url=url,headers=headers).text
print(html)

返回的 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 的值就行。

图片

图片

你也可以把今日、本周、本月、新人模式的值放在列表里,你再用一个循环就搞定。

mode = ['daily', 'weekly', 'monthly', 'rookie']

目前每个模式最多 500 张图片,全部爬取完也就 2000 张图片,也不多,所以代理池里的 ip 少也没事,基本也能爬完,如果你爬取的图片多,比如你还要爬取上月、上上月的图片,那就要更多的代理 ip 放到你的代理池了,上面捕鱼的办法无私分享给大家了,看着这里可以给文章来个三连鼓励下了。

最后,本次分享的免费代理池不适合用来做大的爬虫项目的,大的爬虫项目爬取量比较大,这些免费的代理 IP 显然是不够稳定和不够用的,这就需要你自己去购买付费的了,付费的就没有什么技巧可言了,唯一的技巧就是花钱。所以大家根据自己的需求来决定了。这些反爬措施搞定之后,轻松爬虫就不是难事了,这时候可能我们需要考虑的是怎么让爬虫速度变得更快。这时我们就需要用到异步爬虫和分布式爬虫了,对异步爬虫和分布式爬虫比较感兴趣的,可以在评论区留言,如果对这部分感兴趣比较多的话,下次就单独发文章详细分享一下怎么实现异步爬虫和分布式爬虫。

好了,以上就是今天所有分享的内容啊。有了这些免费的代理IP,你爬取美女靓图时就再也不会被封 IP 而中断爬虫了。觉得不错,麻烦给文章来个三连。