豆瓣的反爬
我们先来真实地感受一下豆瓣的反爬。假如我们有这样一个豆瓣的爬虫,这个爬虫是要爬取豆瓣上某几个标签页下的图书的数据(像下面这样的页面里的数据)
爬虫的代码如下(这里只是为了展示豆瓣的反爬机制,代码作了简化)
上面的爬虫会爬取SQL、数据分析和计算机这三个标签下的所有图书。每爬取一页数据,我们都会打印出HTTP返回码 r.status_code 和爬取到的图书的数量 len(items) 。
我们在命令行窗口运行这个爬虫,可以看到这样的结果
200 20
200 20
200 20
200 20
200 20
200 20
200 20
200 20
200 20
上面的输出表明爬取的页面都返回了HTTP 200,并且获取到了每一页里面的20条图书信息。
但如果我们多运行几次程序后,结果就变成了下面这样了
2000
2000
2000
HTTP还是返回200的响应,但我们获取不到页面里的图书信息了,因为我们的爬虫被禁了。
要解决爬虫被禁的问题,一个直观的思路就是使用代理池,每次爬取页面我们都使用不同的IP发出请求,这样就可以避免同一个IP频繁发出请求被禁的情况。
代理按照是否匿名,大致可分成这样几类
透明代理
匿名代理
高匿代理
透明代理在HTTP头里设置了你的真实IP,服务器可以通过HTTP头知晓你真实的IP。
匿名代理虽然隐藏了你的真实IP,但服务器还是知道你使用了代理。
高匿代理不仅隐藏了你的真实IP,而且让服务器无法发现你在使用代理,这是我们自建代理池的最佳的选择,我们下一步自建代理池的步骤中用到的也是高匿代理。
自建代理池
西刺代理(https://www.xicidaili.com/)是一个提供免费代理的网站,他的首页是下面这样的
我们通过爬取西刺上可用的免费高匿代理,来建立我们的代理池。
爬取西刺高匿代理的代码如下
上面的get_xici_proxy函数每次获取一个页面的代理。因为豆瓣图书的URL都是HTTPS的,所以我们这里只关心HTTPS的代理,上面的代码中我们筛选出高匿的并且是HTTPS的代理。
爬下了免费代理以后,接下来,我们来验证一下这些代理是不是可用。我们通过代理去访问豆瓣的网页,测试代理的有效性。代码如下
我们获取到这样几个有效的代理
我们把上面测试有效的代理存入到一个叫proxy的文件中。
接下来,我们实现一个Proxy类来获取这个列表中的代理
上面的Proxy是一个Singleton的类。get_proxy方法用于从代理列表中获取代理,每次使用一个代理,如果所有的代理都用过了,我们回到第一个代理,重新开始选择。
好,到这里我们就建立我们自己的代理池,并且创建了一个获取代理的类Proxy。
接下来我们修改我们之前豆瓣爬虫的代码,我们使用代理池中的代理来发出请求。我们将get_books_by_page函数修改成如下
我们再次运行我们的豆瓣爬虫,可以看到如下的输出
20020
20020
20020
20020
...
现在爬虫又重新开始工作,可以获取到图书的信息了。
通过这样的自建代理池,我们破解了豆瓣的反爬。不过需要注意的是,很多免费代理有效时间比较短,毕竟是免费的,稳定性没保障。大家获取免费代理后,还是要趁热尽快使用。如果要追求稳定性,建议大家还是使用付费代理。
网友评论