爬虫进阶:反爬策略的应对机制

爬虫与反爬虫,这相爱相杀的一对,简直可以写出一部壮观的斗争史。而在大数据时代,数据就是金钱,很多企业都为自己的网站运用了反爬虫机制,防止网页上的数据被爬虫爬走。然而,如果反爬机制过于严格,可能会误伤到真正的用户请求;如果既要和爬虫死磕,又要保证很低的误伤率,那么又会加大研发的成本。

简单低级的爬虫速度快,伪装度低,如果没有反爬机制,它们可以很快的抓取大量数据,甚至因为请求过多,造成服务器不能正常工作。而伪装度高的爬虫爬取速度慢,对服务器造成的负担也相对较小。所以,网站反爬的重点也是那种简单粗暴的爬虫,反爬机制也会允许伪装度高的爬虫,获得数据。毕竟伪装度很高的爬虫与真实用户也就没有太大差别了。

这篇文章主要讨论使用 Scrapy 框架时,如何应对普通的反爬机制。

header 检验

最简单的反爬机制,就是检查 HTTP 请求的 Headers 信息,包括 User-Agent, Referer、Cookies 等。

User-Agent

User-Agent 是检查用户所用客户端的种类和版本,在 Scrapy 中,通常是在下载器中间件中进行处理。比如在 setting.py 中建立一个包含很多浏览器 User-Agent 的列表,然后新建一个 random_user_agent 文件:


  1. class RandomUserAgentMiddleware(object):  
  2.     @classmethod     def process_request(cls, request, spider):         ua = random.choice(spider.settings['USER_AGENT_LIST'])         if ua:             request.headers.setdefault('User-Agent', ua) 

这样就可以在每次请求中,随机选取一个真实浏览器的 User-Agent。

Referer

Referer 是检查此请求由哪里来,通常可以做图片的盗链判断。在 Scrapy 中,如果某个页面 url 是通过之前爬取的页面提取到,Scrapy 会自动把之前爬取的页面 url 作为 Referfer。也可以通过上面的方式自己定义 Referfer 字段。

Cookies

网站可能会检测 Cookie 中 session_id 的使用次数,如果超过限制,就触发反爬策略。所以可以在 Scrapy 中设置 COOKIES_ENABLED = False 让请求不带 Cookies。

也有网站强制开启 Cookis,这时就要麻烦一点了。可以另写一个简单的爬虫,定时向目标网站发送不带 Cookies 的请求,提取响应中 Set-cookie 字段信息并保存。爬取网页时,把存储起来的 Cookies 带入 Headers 中。

X-Forwarded-For

在请求头中添加 X-Forwarded-For 字段,将自己申明为一个透明的代理服务器,一些网站对代理服务器会手软一些。

X-Forwarded-For 头一般格式如下


  1. X-Forwarded-For: client1, proxy1, proxy2 

这里将 client1,proxy1 设置为随机 IP 地址,把自己的请求伪装成代理的随机 IP 产生的请求。然而由于 X-Forwarded-For 可以随意篡改,很多网站并不会信任这个值。

限制 IP 的请求数量

如果某一 IP 的请求速度过快,就触发反爬机制。当然可以通过放慢爬取速度绕过,这要以爬取时间大大增长为代价。另一种方法就是添加代理。

很简单,在下载器中间件中添加:


  1. request.meta['proxy'] = 'http://' + 'proxy_host' + ':' + proxy_port 

然后再每次请求时使用不同的代理 IP。然而问题是如何获取大量的代理 IP?

可以自己写一个 IP 代理获取和维护系统,定时从各种披露免费代理 IP 的网站爬取免费 IP 代理,然后定时扫描这些 IP 和端口是否可用,将不可用的代理 IP 及时清理。这样就有一个动态的代理库,每次请求再从库中随机选择一个代理。然而这个方案的缺点也很明显,开发代理获取和维护系统本身就很费时费力,并且这种免费代理的数量并不多,而且稳定性都比较差。如果必须要用到代理,也可以去买一些稳定的代理服务。这些服务大多会用到带认证的代理。

在 requests 库中添加带认证的代理很简单,


  1. proxies = {  
  2.    "http": "http://user:pass@10.10.1.10:3128/", 

然而 Scrapy 不支持这种认证方式,需要将认证信息 base64 编码后,加入 Headers 的 Proxy-Authorization 字段:

import base64


  1. import base64  
  2.  # Set the location of the proxy proxy_string = choice(self._get_proxies_from_file('proxies.txt')) # user:pass@ip:port proxy_items = proxy_string.split('@') request.meta['proxy'] = "http://%s" % proxy_items[1]  # setup basic authentication for the proxy user_pass=base64.encodestring(proxy_items[0]) request.headers['Proxy-Authorization'] = 'Basic ' + user_pass 

动态加载

现在越来越多的网站使用 ajax 动态加载内容,这时候可以先截取 ajax 请求分析一下,有可能根据 ajax 请求构造出相应的 API 请求的 URL 就可以直接获取想要的内容,通常是 json 格式,反而还不用去解析 HTML。

然而,很多时候 ajax 请求都会经过后端鉴权,不能直接构造 URL 获取。这时就可以通过 PhantomJS+Selenium 模拟浏览器行为,抓取经过 js 渲染后的页面。具体可以参考:Scrapy+PhantomJS+Selenium 动态爬虫

需要注意的是,使用 Selenium 后,请求不再由 Scrapy 的 Downloader 执行,所以之前添加的请求头等信息都会失效,需要在 Selenium 中重新添加


  1. headers = {...}  
  2. for key, value in headers.iteritems():     webdriver.DesiredCapabilities.PHANTOMJS['phantomjs.page.customHeaders.{}'.format(key)] = value 

另外,调用 PhantomJs 需要指定 PhantomJs 的可执行文件路径,通常是将该路径添加到系统的 path 路径,让程序执行时自动去 path 中寻找。我们的爬虫经常会放到 crontab 中定时执行,而 crontab 中的环境变量和系统的环境变量不同,所以就加载不到 PhamtonJs 需要的路径,所以最好是在申明时指定路径:


  1. driver = webdriver.PhantomJS(executable_path='/usr/local/bin/phantomjs') 

本文作者:佚名

来源:51CTO

时间: 2024-07-30 05:34:32

爬虫进阶:反爬策略的应对机制的相关文章

Python网络爬虫反爬破解策略实战

​​作者:韦玮 转载请注明出处 我们经常会写一 些网络爬虫,想必大家都会有一个感受,写爬虫虽然不难,但是反爬处理却很难,因为现在大部分的网站都有自己的反爬机制,所以我们要爬取这些数据会比较难.但是,每一种反爬机制其实我们都会有相应的解决方案,作为爬虫方的我们,重点需要处理这些反爬机制,所以,今天我们在这里就为大家分析常见的反爬策略以及破解的手段. 1. 知己知彼-常见的反爬策略有哪些? 首先,既然要破解这些常见的反爬策略,就首先需要知道常见的反爬策略有哪些,所谓知己知彼,百战百胜. 常见的反爬策

普通反爬虫机制的应对策略

爬虫与反爬虫,这相爱相杀的一对,简直可以写出一部壮观的斗争史.而在大数据时代,数据就是金钱,很多企业都为自己的网站运用了反爬虫机制,防止网页上的数据被爬虫爬走.然而,如果反爬机制过于严格,可能会误伤到真正的用户请求;如果既要和爬虫死磕,又要保证很低的误伤率,那么又会加大研发的成本. 简单低级的爬虫速度快,伪装度低,如果没有反爬机制,它们可以很快的抓取大量数据,甚至因为请求过多,造成服务器不能正常工作.而伪装度高的爬虫爬取速度慢,对服务器造成的负担也相对较小.所以,网站反爬的重点也是那种简单粗暴的

腾讯动漫爬虫与动态随机加载反爬破解技术实战

​​本文作者韦玮原创,转载请注明出处. 项目需求与问题引入 有时,我们想爬取腾讯动漫中的漫画,比如,我们不妨打开腾讯动漫中某一个动漫的网址http://ac.qq.com/Comic/comicInfo/id/539443,如下图所示: 然后,我们点击"开始阅读",出现如下所示界面: ​ 可以看到,在此有一副漫画,我们可以按常规方式尝试进行处理,我们查看该网页对应的源代码,可以发现在源代码中并不能找到这副漫画的图片地址,并且,当我们鼠标往下滑动的时候,才会触发加载后续的漫画,所以,我们

反爬烦的不行?看看这个神级程序员怎么来破解的!

爬虫和反爬的对抗一直在进行着- 为了帮助更好的进行爬虫行为以及反爬, 今天就来介绍一下网页开发者常用的反爬手段. 1. BAN IP :网页的运维人员通过分析日志发现最近某一个IP访问量特别特别大,某一段时间内访问了无数次的网页,则运维人员判断此种访问行为并非正常人的行为,于是直接在服务器上封杀了此人IP. 解决方法:此种方法极其容易误伤其他正常用户,因为某一片区域的其他用户可能有着相同的IP,导致服务器少了许多正常用户的访问,所以一般运维人员不会通过此种方法来限制爬虫.不过面对许多大量的访问,

python-Python 爬虫为什么只爬取到一个html页中的部分内容。

问题描述 Python 爬虫为什么只爬取到一个html页中的部分内容. 在用Python中urlopen和read直接获取到一个网页的HTML,为什么内容与通过浏览器的查看网页源码的方式显示内容不一样呢,获取到的HTML只有原HTML部分内容. 解决方案 页面内容是异步加载的你访问的的是开始部分.浏览器有进行后续处理 解决方案二: 你可以使用selenium,它可以模拟浏览器的webdriver 解决方案三: 谢谢各位!我知道了.

Nodejs爬虫进阶教程之异步并发控制_node.js

之前写了个现在看来很不完美的小爬虫,很多地方没有处理好,比如说在知乎点开一个问题的时候,它的所有回答并不是全部加载好了的,当你拉到回答的尾部时,点击加载更多,回答才会再加载一部分,所以说如果直接发送一个问题的请求链接,取得的页面是不完整的.还有就是我们通过发送链接下载图片的时候,是一张一张来下的,如果图片数量太多的话,真的是下到你睡完觉它还在下,而且我们用nodejs写的爬虫,却竟然没有用到nodejs最牛逼的异步并发的特性,太浪费了啊. 思路 这次的的爬虫是上次那个的升级版,不过呢,上次那个虽

scrapy爬虫不能自动爬取所有页面

问题描述 scrapy爬虫不能自动爬取所有页面 学习scrapy第三天,在爬取wooyun白帽子精华榜的时候,不能爬取所有的页面. items.py # -*- coding: utf-8 -*- # Define here the models for your scraped items # # See documentation in: # http://doc.scrapy.org/en/latest/topics/items.html import scrapy class Wooyu

百度更新反作弊策略效果显著

近日,百度网页搜索反作弊团队更新了部分反作弊策略和特征,对低质量站点在搜索结果中的展现进行了控制.策略升级后,百度进一步提升了用户的搜索体验,提供更高质量.更权威的搜索结果,那些提供原创.优质资源的网站随之获得了更多流量.以知名医疗网站--39健康网为例,在此次策略更新后,其网站从6月底到现在短短半个多月,流量上涨超过20%.近日,百度网页搜索反作弊团队更新了部分反作弊策略和特征,对低质量站点在搜索结果中的展现进行了控制.策略升级后,百度进一步提升了用户的搜索体验,提供更高质量.更权威的搜索结果

百度网页搜索反作弊团队更新部分反作弊策略和特征

中新网7月20日电 近日,百度网页搜索反作弊团队更新了部分反作弊策略和特征,对低质量站点在搜索结果中的展现进行了控制.策略升级后,百度进一步提升了用户的搜索体验,提供更高质量.更权威的搜索结果,那些提供原创.优质资源的网站随之获得了更多流量.以知名医疗网站39健康网为例,在此次策略更新后,其网站从6月底到现在短短半个多月,流量上涨超过20%. 近日,百度网页搜索反作弊团队更新了部分反作弊策略和特征,对低质量站点在搜索结果中的展现进行了控制.策略升级后,百度进一步提升了用户的搜索体验,提供更高质量