12.1 常用的反爬虫设置
爬取链家经纪人成交数据及应对反爬虫的设置
第 11 章编写的房天下二手房房源爬虫,如果不设置一些应对反爬虫的措施,可能很快就会被房天下服务器发现,从而被禁止。爬虫与反爬虫的斗争,无论手写爬虫还是使用框架,都是无法避免的。那么,Scrapy 爬虫框架可以采取哪些反爬虫的措施呢?下面以上一章房天下爬虫为例,详细介绍 Scrapy 应对反爬虫的常见策略。
1. 设置用户代理
通过设置 User Agent 模仿正常浏览器,是一个常用的应对服务器反爬虫的策略。在 Scrapy 爬虫框架中,可以用 4 种方法设置 User Agent。
(1)在 settings.py 文件中直接设置 User Agent。打开房天下爬虫项目,在 settings.py 找到其默认的 User Agent 设置。
#USER_AGENT = 'pachong3 (+http://www.yourdomain.com)'
把前面的注释去掉,并设置为如下形式。
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) \ AppleWebKit/537.36 (KHTML, like Gecko) \ Chrome/63.0.3239.132 Safari/537.36'
这样就这设置好了 Scrapy 默认使用的 User Agent,无论项目中的爬虫,还是在项目中运行 shell,Scrapy 都会使用这里设置的 User Agent 作为默认的用户代理。
(2)设置 Scrapy 的默认请求 headers。同样是在 settings.py 中,找到其默认的请求 headers。
#DEFAULT_REQUEST_HEADERS = { # 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', # 'Accept-Language': 'en', #}
在这里覆盖 Scrapy 的默认请求 headers,如增加 User Agent 这一项。
DEFAULT_REQUEST_HEADERS = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en', 'USER_AGENT':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) \ AppleWebKit/537.36 (KHTML, like Gecko) \ Chrome/63.0.3239.132 Safari/537.36' }
这样就在默认的请求 headers 中增加了 User Agent 这一项。如果爬虫需要修改默认请求 headers,可以在这里设置。
(3)直接在爬虫代码中为 scrapy.Request 添加 headers 参数。例如将 spider 文件中 Scrapy 请求修改为如下形式。
header={'User-Agent': 'Hello World'} yield scrapy.Request(url='http://example.com', headers=header)
这种修改方式具有最高的优先级,也就是说在这里设置的 headers 优先级,高于 Scrapy 的默认设置。这种做法有个稍微不方便的地方,因为 Scrapy 在开始运行时默认先请求 start-urls 中的网址,需要重写 start_requests 才能修改对 start-urls 的请求头部。
(4)在中间件中自定义 headers。Scrapy 框架为了方便,统一修改爬虫的请求和下载设置,有专门的下载中间件,用户可以通过设置下载中间件,实现对爬虫用户代理的设置,甚至为了更加逼真的模仿很多用户访问,可以通过下载中间件设置随机的 User Agent。下一节将详细讲解具体的设置方法。
2. 设置下载延迟、Cookies 及使用代理 IP
可以通过设置下载延时,限制爬虫的访问速度,避免太快访问服务器,从而防止被反爬虫禁止。设置下载延时是一种非常有效的应对反爬虫措施。网站服务器是为大部分的用户提供服务的,我们应该尽量克制爬取的速度,避免占用过多的服务器资源,以免影响普通用户的使用。可以在 settings.py 中找到#DOWNLOAD_DELAY 这一项,去掉前面的注释,保留 DOWNLOAD_DELAY = 3。
这样就将下载延时设置为 3 秒。DOWNLOAD_DELAY 支持设置为小数。
Scrapy 在设置了 DOWNLOAD_DELAY 情况下,默认启用了 RANDOMIZE_DOWNLOAD_DELAY,也就是随机等待。这样当从相同的网站获取数据时,Scrapy 将会等待一个随机的值(0.5~1.5 之间的一个随机值乘以 DOWNLOAD_ DELAY)。该随机值降低了爬虫被检测到的概率,因为某些网站会分析请求,查找请求之间时间间隔的相似性。
在爬取网站的过程中,Scrapy 会自动处理 Cookies,也就是模仿浏览器去跟踪 Cookies。在爬取量很大的情况下,这样很容易被服务器发现,这时可以设置禁止使用 Cookies。在 settings.py 中找到#COOKIES_ENABLED = False,去掉前面的注释,保留 COOKIES_ENABLED = False,即可禁用 Cookies。
但是在有些情况下,某些网站也会通过检测 Cookies 来反爬虫,第 16 章将详细介绍。
有的网站通过检测 IP 访问情况来反爬虫,可以使用随机轮换的 IP 代理解决这个问题。Scrapy 中可以通过下载中间件设置 IP 代理,12.3 节将详细演示如何设置随机轮换的 IP 代理。
3. 自动限速扩展
上面的 DOWNLOAD_DELAY 是为 Scrapy 设置了一个固定的下载延时,一般很难知道到底设置几秒合适,我们希望既能较快速地爬取又不要被反爬虫禁止,可以通过使用自动限速扩展解决这个问题。该扩展能根据 Scrapy 服务器及爬取的网站的负载,自动限制爬取速度。它可以自动调整 Scrapy 来优化下载速度,使用户不用调节下载延迟及并发请求数来找到优化的值。用户只需指定允许的最大并发请求数,剩下的都交给扩展来完成。
可以通过 settings 设置自动限速扩展,找到 settings 中的#AUTOTHROTTLE_ENABLED = True 这一项,去掉注释,保留 AUTOTHROTTLE_ENABLED = True,即可打开自动限速扩展。
设置自动限速扩展还允许设置初始下载延迟和最大下载延时,一般使用默认值即可。读者可以通过查阅 Scrapy 文档了解这些设置的含义。
上面总结了 Scrapy 中常用的应对反爬虫措施,在实际的项目中,可以尝试综合使用这些措施从而避免被反爬虫禁止。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论