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


下面的例子所用的网页在 http://pythonscraping.com/pages/itsatrap.html 。这个页面包含了两个链接,一个通过 CSS 隐含了,另一个是可见的 。另外,页面上还包括两个隐含字段:
点击可查看大图
这三个元素通过三种不同的方式对用户隐藏:
第一个链接是通过简单的 CSS 属性设置 display:none 进行隐藏
电话号码字段 name=”phone” 是一个隐含的输入字段
邮箱地址字段 name=”email” 是将元素向右移动 50 000 像素(应该会超出电脑显示器的边界)并隐藏滚动条
因为 Selenium 可以获取访问页面的内容,所以它可以区分页面上的可见元素与隐含元素 。通过 is_displayed() 可以判断元素在页面上是否可见 。
例如,下面的代码示例就是获取前面那个页面的内容,然后查找隐含链接和隐含输入字段:
点击可查看大图
Selenium 抓取出了每个隐含的链接和字段,结果如下所示:
点击可查看大图
虽然你不太可能会去访问你找到的那些隐含链接,但是在提交前,记得确认一下那些已经在表单中、准备提交的隐含字段的值(或者让 Selenium 为你自动提交) 。
使用远程服务器来避免 IP 封锁
启用远程平台的人通常有两个目的:对更大计算能力和灵活性的需求,以及对可变 IP 地址的需求 。

  1. 使用可变的远程 IP 地址
建立网络爬虫的第一原则是:所有信息都可以伪造 。你可以用非本人的邮箱发送邮件,通过命令行自动化鼠标的行为,或者通过 IE 5.0 浏览器耗费网站流量来吓唬网管 。
但是有一件事情是不能作假的,那就是你的 IP 地址 。任何人都可以用这个地址给你写信:“美国华盛顿特区宾夕法尼亚大道西北 1600 号,总统,邮编 20500 。”但是,如果这封信是从新墨西哥州的阿尔伯克基市发来的,那么你肯定可以确信给你写信的不是美国总统 。
从技术上说,IP 地址是可以通过发送数据包进行伪装的,就是分布式拒绝服务攻击技术(Distributed Denial of Service,DDoS),攻击者不需要关心接收的数据包(这样发送请求的时候就可以使用假 IP 地址) 。但是网络数据采集是一种需要关心服务器响应的行为,所以我们认为 IP 地址是不能造假的 。
阻止网站被采集的注意力主要集中在识别人类与机器人的行为差异上面 。封杀 IP 地址这种矫枉过正的行为,就好像是农民不靠喷农药给庄稼杀虫,而是直接用火烧彻底解决问题 。它是最后一步棋,不过是一种非常有效的方法,只要忽略危险 IP 地址发来的数据包就可以了 。但是,使用这种方法会遇到以下几个问题 。
IP 地址访问列表很难维护 。虽然大多数大型网站都会用自己的程序自动管理 IP 地址访问列表(机器人封杀机器人),但是至少需要人偶尔检查一下列表,或者至少要监控问题的增长 。
因为服务器需要根据 IP 地址访问列表去检查每个准备接收的数据包,所以检查接收数据包时会额外增加一些处理时间 。多个 IP 地址乘以海量的数据包更会使检查时间指数级增长 。为了降低处理时间和处理复杂度,管理员通常会对 IP 地址进行分组管理并制定相应的规则,比如如果这组 IP 中有一些危险分子就“把这个区间的所有 256 个地址全部封杀” 。于是产生了下一个问题 。
封杀 IP 地址可能会导致意外后果 。例如,当我还在美国麻省欧林工程学院读本科的时候,有个同学写了一个可以在 http://digg.com/ 网站(在 Reddit 流行之前大家都用 Digg)上对热门内容进行投票的软件 。这个软件的服务器 IP 地址被 Digg 封杀,导致整个网站都不能访问 。于是这个同学就把软件移到了另一个服务器上,而 Digg 自己却失去了许多主要目标用户的访问量 。
虽然有这些缺点,但封杀 IP 地址依然是一种十分常用的手段,服务器管理员用它来阻止可疑的网络爬虫入侵服务器 。
Tor 代理服务器
洋葱路由(The Onion Router)网络,常用缩写为 Tor,是一种 IP 地址匿名手段 。由网络志愿者服务器构建的洋葱路由器网络,通过不同服务器构成多个层(就像洋葱)把客户端包在最里面 。数据进入网络之前会被加密,因此任何服务器都不能偷取通信数据 。另外,虽然每一个服务器的入站和出站通信都可以被查到,但是要想查出通信的真正起点和终点,必须知道整个通信链路上所有服务器的入站和出站通信细节,而这基本是不可能实现的 。
Tor 匿名的局限性
虽然我们在本文中用 Tor 的目的是改变 IP 地址,而不是实现完全匿名,但有必要关注一下 Tor 匿名方法的能力和不足 。


推荐阅读