为何大量网站不能抓取?爬虫突破封禁的6种常见方法( 三 )


3. 正常的时间访问路径
有一些防护措施完备的网站可能会阻止你快速地提交表单,或者快速地与网站进行交互 。即使没有这些安全措施,用一个比普通人快很多的速度从一个网站下载大量信息也可能让自己被网站封杀 。
因此,虽然多线程程序可能是一个快速加载页面的好办法——在一个线程中处理数据,另一个线程中加载页面——但是这对编写好的爬虫来说是恐怖的策略 。还是应该尽量保证一次加载页面加载且数据请求最小化 。如果条件允许,尽量为每个页面访问增加一点儿时间间隔,即使你要增加一行代码:
time.sleep(3)
(小编:3 + 随机数 是不是更好一些?)
合理控制速度是你不应该破坏的规则 。过度消耗别人的服务器资源会让你置身于非法境地,更严重的是这么做可能会把一个小型网站拖垮甚至下线 。拖垮网站是不道德的,是彻头彻尾的错误 。所以请控制采集速度!
常见表单反爬虫安全措施解密
许多像 Litmus 之类的测试工具已经用了很多年了,现在仍用于区分网络爬虫和使用浏览器的人类访问者,这类手段都取得了不同程度的效果 。虽然网络机器人下载一些公开的文章和博文并不是什么大事,但是如果网络机器人在你的网站上创造了几千个账号并开始向所有用户发送垃圾邮件,就是一个大问题了 。网络表单,尤其是那些用于账号创建和登录的网站,如果被机器人肆意地滥用,网站的安全和流量费用就会面临严重威胁,因此努力限制网站的接入是最符合许多网站所有者的利益的(至少他们这么认为) 。
这些集中在表单和登录环节上的反机器人安全措施,对网络爬虫来说确实是严重的挑战 。
4. 注意隐含输入字段值
在 HTML 表单中,“隐含”字段可以让字段的值对浏览器可见,但是对用户不可见(除非看网页源代码) 。随着越来越多的网站开始用 cookie 存储状态变量来管理用户状态,在找到另一个最佳用途之前,隐含字段主要用于阻止爬虫自动提交表单 。
下图显示的例子就是 Facebook 登录页面上的隐含字段 。虽然表单里只有三个可见字段(username、password 和一个确认按钮),但是在源代码里表单会向服务器传送大量的信息 。
Facebook 登录页面上的隐含字段
用隐含字段阻止网络数据采集的方式主要有两种 。第一种是表单页面上的一个字段可以用服务器生成的随机变量表示 。如果提交时这个值不在表单处理页面上,服务器就有理由认为这个提交不是从原始表单页面上提交的,而是由一个网络机器人直接提交到表单处理页面的 。绕开这个问题的最佳方法就是,首先采集表单所在页面上生成的随机变量,然后再提交到表单处理页面 。
第二种方式是“蜜罐”(honey pot) 。如果表单里包含一个具有普通名称的隐含字段(设置蜜罐圈套),比如“用户名”(username)或“邮箱地址”(email address),设计不太好的网络机器人往往不管这个字段是不是对用户可见,直接填写这个字段并向服务器提交,这样就会中服务器的蜜罐圈套 。服务器会把所有隐含字段的真实值(或者与表单提交页面的默认值不同的值)都忽略,而且填写隐含字段的访问用户也可能被网站封杀 。
总之,有时检查表单所在的页面十分必要,看看有没有遗漏或弄错一些服务器预先设定好的隐含字段(蜜罐圈套) 。如果你看到一些隐含字段,通常带有较大的随机字符串变量,那么很可能网络服务器会在表单提交的时候检查它们 。另外,还有其他一些检查,用来保证这些当前生成的表单变量只被使用一次或是最近生成的(这样可以避免变量被简单地存储到一个程序中反复使用) 。
5. 爬虫通常如何避开蜜罐
虽然在进行网络数据采集时用 CSS 属性区分有用信息和无用信息会很容易(比如,通过读取 id和 class 标签获取信息),但这么做有时也会出问题 。如果网络表单的一个字段通过 CSS 设置成对用户不可见,那么可以认为普通用户访问网站的时候不能填写这个字段,因为它没有显示在浏览器上 。如果这个字段被填写了,就可能是机器人干的,因此这个提交会失效 。
这种手段不仅可以应用在网站的表单上,还可以应用在链接、图片、文件,以及一些可以被机器人读取,但普通用户在浏览器上却看不到的任何内容上面 。访问者如果访问了网站上的一个“隐含”内容,就会触发服务器脚本封杀这个用户的 IP 地址,把这个用户踢出网站,或者采取其他措施禁止这个用户接入网站 。实际上,许多商业模式就是在干这些事情 。


推荐阅读