返回介绍

12.1 常用的反爬虫设置

发布于 2025-04-21 19:15:29 字数 3340 浏览 0 评论 0 收藏

爬取链家经纪人成交数据及应对反爬虫的设置

第 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。