如何应对网站反爬虫策略?如何高效地爬大量数据?

像一些大型的网站会有反爬虫策略…比如我之前在爬淘宝评论后很快就会被封,大概是短时间爬太多…有什么好的策略吗?比如代理?不过感觉代理也不能稳定吧…
1楼(未知网友)

我们生活在信息爆炸的时代,穷尽一个人的一生也无法浏览完万分之一的网络信息。那如果给你猜,你会觉得整个互联网的流量里,非人类的比例有多大?
是20%?
还是30%?
还是40%?
据统计,2013年机器人占互联网访问的比例就已经超过了60%(很遗憾我并没有查到更近时间的数据,但只会多不会少),也就是大部分的互联网流量并不是由人类产生的。这60%孜孜不倦昼夜不息乐此不疲的机器人,我们就称之为爬虫。
爬虫分善良的爬虫和恶意的爬虫。善良的就像搜索引擎蜘蛛,它们扫描整个网络的内容,协助人类索引、保存、组织、排序信息,让人人都成了现代的诸葛亮,足不出户就可以窥探自然宇宙、知道天下兴替。如果你不希望信息被索引,也只需大咧咧写个robot.txt声明,就跟国际法一样神圣不被侵犯。更别说对做数据分析和数据挖掘的,爬虫简直是一门必须学精的手艺。公开的数据、新闻、微博,抓下来输入模型演算一遍,什么趋势、什么分布、什么画像,都尽入掌握,站在大数据之前,你会觉得自己就是这个时代的魔法师,能知前,能知后,能无中生有。
正邪相生。恶意的爬虫远不只偷你的数据那么简单,他们像蝗虫一样盯着用户聚集的地方,忙碌着在你的数据中注入水分,破坏正常用户的体验,损害你服务的处理能力。刷了你的排行榜,让没有价值的信息排到前面去了;打开大厅,游戏玩家看到的满屏都是爬虫留下的广告,或者有害的色情信息;好不容易真金白银做个广告,一群薅羊毛的机器人一拥而上,热心的用户赶了个晚集,反而连渣都没剩下,运营触达的效果大打折扣;竞争对手眼红了,来一波DDOS,利用大量的主机和硬件对你进行流量攻击,网站瘫痪了,正常用户都服务不了。
所以这注定是一场没有硝烟的战争。不管是操纵善良的爬虫攻击,还是阻止恶意的爬虫入侵,都必须要把攻防当成战争看待,一点都大意不得。以下就给一些爬虫战争的Tips:
当你是攻击方时:
了解敌方网站的URL路径
熟悉数据请求和返回的格式(Chrome的控制台和FireBug都是不错的调试工具)
解析目标字段(用BeautifulSoup或者Xpath来提高你的效率)
带上正常的User-Agent,让服务器误以为你是人类
代理IP池,每次轮换不同的IP去请求数据
如果敌方网站是通过JS请求数据,那么可以试试Phantomjs这个小工具(这里2shou叔要卖卖自己基于Phantomjs的爬虫组件,欢迎GitHub搜索PhantomjsFetcher,目前刚破百Star,求继续支持)
遇到要求登陆的,给敌方一个小点心(Cookies)
欲速不达,降低频率慢慢抓,反正可以日夜不停嘛,不妨再设置一个随机的停顿让服务器摸不着头脑
当你是防御方时:
找恶意群体的聚集特征。托尔斯泰说,幸福的家庭是相似的,不幸的家庭则各有不同。区分机器人和人类也是如此,人类多种多样,机器人千人一面。那些IP相同的,那些只索取、不奉献的,那些行为单一的,通通杀个天地间白茫茫真干净
加大关键数据的获取成本,例如使用JS传输(注意这会影响SEO)、先登陆再浏览、JS代码混淆、异或加密甚至非对称加密
涉及到真金白银的,继续加大敌方的获取成本,绑定手机、绑定微信、APP扫码,绑定惟一住址,能上的武器都堆上
防DDOS攻击要从内部做起:不要留无密码或简单密码的Web界面,关注底层组件的漏洞(乌云等平台),关键账号密码不要外泄(GitHub定期扫一扫,看看有没有谁不听话)
有利益在的地方就有战争,企图完全把对方消灭是不可能的,倒不如把恶意的爬虫也作为你的产品生态的一部分,尽可能多掌握这部分人的动态,甚至想方设法让敌方也为你所用,至少能按照你的预测那样去行动。最后一句话说得有点玄乎了,留给懂行的人自己参悟吧。
2楼(未知网友)

拿到阿里云、腾讯云、新浪云等云机房ip段,来自这些ip段的均复杂验证码伺候。

亲测有效。
3楼(未知网友)

歪楼,做好的防抓方法就是不给提示,一点都不给。爬虫超过你给的界限。直接返回大量随机无效数据。


让他找特点去吧
4楼(未知网友)

“爬”,本身就是一种对抗行为。
要尽量隐匿自己的行为,方法论很多不细讲了,没有屠龙之技。
最重要的是不能影响对方运维的 KPI ,不能严重到对方研发介入。码农都是混口饭过日子的,都不容易,逼的对方加班升级加策略的最终码农和产品经理去PK 直接就把功能下线了。
5楼(未知网友)

首先要明确一点的就是:在爬虫与反爬的对抗中,爬虫最终会获胜,因为爬虫可以模仿人的行为去浏览网页。
那么如何对抗反爬呢?下面是做法。 
1.代理和流控的结合
一般网站检测到一个ip在短时间内多次向本站发出不同的HTTP请求,就会认为这是一个爬虫,并将其ip封一段时间。所以对于单个ip来说,降低发出请求的速率可以较好的逃过反爬的检测,如果有上万个代理ip,同时做流控就会比较快的爬取。至于代理如何快速的获得,可以通过购买高质量的代理服务(比如 快代理 快代理 - 高速http代理ip每天更新),或者自己爬取。 
2.动态修改http head 下面几个字段
随时动态的修改,可以避过反爬策略。

cookie 
refer 
user agent 
以及http 头中的几个常用字段。但是,一个ip不要用多个user agent,用了的话这明显是告诉人家你在用爬虫。。 

如何高效的爬取?下面给出几个建议吧:

构建一个能高效爬取的系统,你还需要:

高带宽的网络:这个你懂,平均一个网页100+kb,小水管的话爬个毛线,那么多代理给你回传数据你接都接不过来
容错机制:代理服务器都是不稳定的,随时可能就不可用了,爬着爬着就会出现很多HTTP错误,所以针对一个爬虫系统需要一个容错机制,没爬下来的url要继续爬,直到爬下来确认数据完整为止。
高速存储:爬虫系统的速度瓶颈主要就在存储和带宽上,至于存储,选用Hbase而不是MySQL,实测过,导出300+GB的数据,Hbase几分钟搞定,MySQL好几个小时。
PhantomJS、cURL等API,验证码识别。
登陆功能:要爬取微博这种需要登陆才能浏览内容的网站,肯定需要写一个登陆功能的,这里就需要注册很多的僵尸账号了,而且还需要维护僵尸账号的cookie池,很麻烦。
采用非人力的方法写爬虫:针对一个网站写爬虫太累了。。来一个任务写一个爬虫,用java写真心累啊。。所以还是想想怎么把爬虫的所有工具和API封装一下吧,用简单的配置和操作就可以完成对当前任务的快速爬取。
嗯,以上。
6楼(未知网友)

对于反爬虫我是比较阴的,通过行为判断出是爬虫来,我是不直接拒绝的,而是提供比较真实的伪数据和真数据混在一起,让他们抓几个月后才发现数据不是全部正确,白白浪费时间,让他们很难发现我的反扒规则。

关于如何通过行为判断是爬虫,这个至关重要,访客和爬虫最大区别是,访客是至少访问你几个页面,每个页面间隔也是比较长的,而且每个页面都是加载解析整个html代码和资源,包括img,js,css。而爬虫只是简单粗暴的获取你的数据,不管你的网页元素。
7楼(未知网友)

如 @朱添一 所说, 反反爬虫策略是依靠定向爬取源的反爬虫策略而定的. 
一般有一下几种

一些常用的方法
IP代理 

对于IP代理,各个语言的Native Request API都提供的IP代理响应的API, 需要解决的主要就是IP源的问题了.
网络上有廉价的代理IP(1元4000个左右), 我做过简单的测试, 100个IP中, 平均可用的在40-60左右, 访问延迟均在200以上.
网络有高质量的代理IP出售, 前提是你有渠道.
因为使用IP代理后, 延迟加大, 失败率提高, 所以可以将爬虫框架中将请求设计为异步, 将请求任务加入请求队列(RabbitMQ,Kafka,Redis), 调用成功后再进行回调处理, 失败则重新加入队列. 每次请求都从IP池中取IP, 如果请求失败则从IP池中删除该失效的IP.
Cookies 

有一些网站是基于cookies做反爬虫, 这个基本上就是如 @朱添一 所说的, 维护一套Cookies池
注意研究下目标网站的cookies过期事件, 可以模拟浏览器, 定时生成cookies
限速访问 

像开多线程,循环无休眠的的暴力爬取数据, 那真是分分钟被封IP的事, 限速访问实现起来也挺简单(用任务队列实现), 效率问题也不用担心, 一般结合IP代理已经可以很快地实现爬去目标内容.

一些坑


大批量爬取目标网站的内容后, 难免碰到红线触发对方的反爬虫机制. 所以适当的告警提示爬虫失效是很有必有的.
一般被反爬虫后, 请求返回的HttpCode为403的失败页面, 有些网站还会返回输入验证码(如豆瓣), 所以检测到403调用失败, 就发送报警, 可以结合一些监控框架, 如Metrics等, 设置短时间内, 告警到达一定阀值后, 给你发邮件,短信等.
当然, 单纯的检测403错误并不能解决所有情况. 有一些网站比较奇葩, 反爬虫后返回的页面仍然是200的(如去哪儿), 这时候往往爬虫任务会进入解析阶段, 解析失败是必然的. 应对这些办法, 也只能在解析失败的时候, 发送报警, 当告警短时间到达一定阀值, 再触发通知事件. 
当然这个解决部分并不完美, 因为有时候, 因为网站结构改变, 而导致解析失败, 同样回触发告警. 而你并不能很简单地区分, 告警是由于哪个原因引起的.
8楼(站大爷用户)

Python入门网络爬虫之精华版
Python学习网络爬虫主要分3个大的版块:抓取,分析,存储
另外,比较常用的爬虫框架Scrapy,这里最后也详细介绍一下。
首先列举一下本人总结的相关文章,这些覆盖了入门网络爬虫需要的基本概念和技巧:宁哥的小站-网络爬虫
当我们在浏览器中输入一个url后回车,后台会发生什么?比如说你输入宁哥的小站(fireling的数据天地)专注网络爬虫、数据挖掘、机器学习方向。,你就会看到宁哥的小站首页。
简单来说这段过程发生了以下四个步骤:
查找域名对应的IP地址。
向IP对应的服务器发送请求。
服务器响应请求,发回网页内容。
浏览器解析网页内容。
网络爬虫要做的,简单来说,就是实现浏览器的功能。通过指定url,直接返回给用户所需要的数据,而不需要一步步人工去操纵浏览器获取。
抓取
这一步,你要明确要得到的内容是什么?是HTML源码,还是Json格式的字符串等。
1. 最基本的抓取
抓取大多数情况属于get请求,即直接从对方服务器上获取数据。
首先,Python中自带urllib及urllib2这两个模块,基本上能满足一般的页面抓取。另外,requests也是非常有用的包,与此类似的,还有httplib2等等。
Requests:
import requests
response = requests.get(url)
content = requests.get(url).content
print "response headers:", response.headers
print "content:", content
Urllib2:
import urllib2
response = urllib2.urlopen(url)
content = urllib2.urlopen(url).read()
print "response headers:", response.headers
print "content:", content
Httplib2:
import httplib2
http = httplib2.Http()
response_headers, content = http.request(url, 'GET')
print "response headers:", response_headers
print "content:", content
9楼(未知网友)

我写过一个rss个小工具,https://diy-devz.rhcloud.com/

爬取搜狗微信公众号搜索的非公开接口,没做宣传的时候,流量不大,用的比较好,宣传后,用的人多了,就发现被反爬虫了,一直500

通过chrome的开发者工具分析搜狗页面的请求,发现不是通过ip反爬,而是cookie里的几个关键字段,应对方法就是写个定时任务,维护一个cookie池,定时更新cookie,爬的时候随机取cookie,现在基本不会出现500

所以应对反爬虫,先分析服务器是通过什么来反爬,通过ip就用代理,通过cookie就换cookie,针对性的构建request。
posted on 2016-12-03 12:26  adolfmc  阅读(12764)  评论(1编辑  收藏  举报