800819103
在线客服,实时响应qq群
在线客服,实时响应客服电话
13318873961对于一些人来说,写爬虫简单,照着框架写,或者照搬别人写的爬虫,但是因为大家采集的网站不一样,面对的反爬虫机制也不一样,如此一来,是否能突破限制,采集到数据也是一个未知数的,今天精灵代理带大家一起去看看常见的一些限制以及突破限制方法,看看别人是怎么应对反爬虫机制的。
采集不到数据常见原因:
也许是向服务器提交自认为已经处理得很好的表单却被拒绝。
也许是自己的IP地址不知道什么原因直接被网站封杀,无法继续访问。
原因可能是一些最复杂的bug,也可能是这些bug让人意想不到(程序在一个网站上可以正常使用,但在另一个看起来完全一样的网站上却用不了)。
最有可能出现的情况是:对方有意不让爬虫抓取信息。网站已经把你定性为一个网络机器人直接拒绝了,你无法找出原因。
也许还不止上面的原因,应对的方法就是让爬虫采集数据时看起来像人类用户。
网站防采集的前提就是要正确地区分人类访问用户和网络机器人。虽然网站可以使用很多识别技术(比如验证码)来防止爬虫,但还是有一些十分简单的方法,可以让你的网络机器人看起来更像人类访问用户。
1.注意隐含输入字段值
在HTML表单中,“隐含”字段可以让字段的值对浏览器可见,但是对用户不可见(除非看网页源代码)。随着越来越多的网站开始用cookie存储状态变量来管理用户状态,在找到另一个最佳用途之前,隐含字段主要用于阻止爬虫自动提交表单。
用隐含字段阻止网络数据采集的方式主要有两种。第一种是表单页面上的一个字段可以用服务器生成的随机变量表示。如果提交时这个值不在表单处理页面上,服务器就有理由认为这个提交不是从原始表单页面上提交的,而是由一个网络机器人直接提交到表单处理页面的。绕开这个问题的最佳方法就是,首先采集表单所在页面上生成的随机变量,然后再提交到表单处理页面。
第二种方式是“蜜罐”(honeypot)。如果表单里包含一个具有普通名称的隐含字段(设置蜜罐圈套),比如“用户名”(username)或“邮箱地址”(emailaddress),设计不太好的网络机器人往往不管这个字段是不是对用户可见,直接填写这个字段并向服务器提交,这样就会中服务器的蜜罐圈套。服务器会把所有隐含字段的真实值(或者与表单提交页面的默认值不同的值)都忽略,而且填写隐含字段的访问用户也可能被网站封杀。
总之,有时检查表单所在的页面十分必要,看看有没有遗漏或弄错一些服务器预先设定好的隐含字段(蜜罐圈套)。如果你看到一些隐含字段,通常带有较大的随机字符串变量,那么很可能网络服务器会在表单提交的时候检查它们。另外,还有其他一些检查,用来保证这些当前生成的表单变量只被使用一次或是最近生成的(这样可以避免变量被简单地存储到一个程序中反复使用)。
2.提交合理的请求头
虽然网站可能会对HTTP请求头的每个属性进行“是否具有人性”的检查,但是我发现通常真正重要的参数就是User-Agent。无论做什么项目,一定要记得把User-Agent属性设置成不容易引起怀疑的内容,不要用Python-urllib/3.4。另外,如果你正在处理一个警觉性非常高的网站,就要注意那些经常用却很少检查的请求头,比如Accept-Language属性,也许它正是那个网站判断你是个人类访问者的关键。
3.使用可变的远程IP地址
建立网络爬虫的第一原则是:所有信息都可以伪造。你可以用非本人的邮箱发送邮件,通过命令行自动化鼠标的行为,或者通过IE5.0浏览器耗费网站流量来吓唬网管。
但是有一件事情是不能作假的,那就是你的IP地址。任何人都可以用这个地址给你写信:“美国华盛顿特区宾夕法尼亚大道西北1600号,总统,邮编20500。”但是,如果这封信是从新墨西哥州的阿尔伯克基市发来的,那么你肯定可以确信给你写信的不是美国总统。
从技术上说,IP地址是可以通过发送数据包进行伪装的,就是分布式拒绝服务攻击技术(DistributedDenialofService,DDoS),攻击者不需要关心接收的数据包(这样发送请求的时候就可以使用假IP地址)。但是网络数据采集是一种需要关心服务器响应的行为,所以我们认为IP地址是不能造假的。
阻止网站被采集的注意力主要集中在识别人类与机器人的行为差异上面。封杀IP地址这种矫枉过正的行为,就好像是农民不靠喷农药给庄稼杀虫,而是直接用火烧彻底解决问题。它是最后一步棋,不过是一种非常有效的方法,只要忽略危险IP地址发来的数据包就可以了。
4.设置cookie的学问
虽然cookie是一把双刃剑,但正确地处理cookie可以避免许多采集问题。网站会用cookie跟踪你的访问过程,如果发现了爬虫异常行为就会中断你的访问,比如特别快速地填写表单,或者浏览大量页面。虽然这些行为可以通过关闭并重新连接或者改变IP地址来伪装,但是如果cookie暴露了你的身份,再多努力也是白费。
如果你在采集一个或者几个目标网站,建议你检查这些网站生成的cookie,然后想想哪一个cookie是爬虫需要处理的。
5.爬虫通常如何避开蜜罐
虽然在进行网络数据采集时用CSS属性区分有用信息和无用信息会很容易(比如,通过读取id和class标签获取信息),但这么做有时也会出问题。如果网络表单的一个字段通过CSS设置成对用户不可见,那么可以认为普通用户访问网站的时候不能填写这个字段,因为它没有显示在浏览器上。如果这个字段被填写了,就可能是机器人干的,因此这个提交会失效。
这种手段不仅可以应用在网站的表单上,还可以应用在链接、图片、文件,以及一些可以被机器人读取,但普通用户在浏览器上却看不到的任何内容上面。访问者如果访问了网站上的一个“隐含”内容,就会触发服务器脚本封杀这个用户的IP地址,把这个用户踢出网站,或者采取其他措施禁止这个用户接入网站。实际上,许多商业模式就是在干这些事情。
虽然你不太可能会去访问你找到的那些隐含链接,但是在提交前,记得确认一下那些已经在表单中、准备提交的隐含字段的值(或者让Selenium为你自动提交)。
6.正常的时间访问路径
有一些防护措施完备的网站可能会阻止你快速地提交表单,或者快速地与网站进行交互。即使没有这些安全措施,用一个比普通人快很多的速度从一个网站下载大量信息也可能让自己被网站封杀。
因此,虽然多线程程序可能是一个快速加载页面的好办法--在一个线程中处理数据,另一个线程中加载页面--但是这对编写好的爬虫来说是恐怖的策略。还是应该尽量保证一次加载页面加载且数据请求最小化。
合理控制速度是你不应该破坏的规则。过度消耗别人的服务器资源会让你置身于非法境地,更严重的是这么做可能会把一个小型网站拖垮甚至下线。拖垮网站是不道德的,是彻头彻尾的错误。所以请控制采集速度!