但如今作为商业化软件,Web这个平台上的内容信息的版权却毫无保证,因为相比软件客户端而言,你的网页中的内容可以被很低成本、很低的技术门槛实现出的一些抓取程序获取到,这也就是这一系列文章将要探讨的话题—— 网络爬虫 。
基于webgl的检查
基于浏览器的发际线特征检测
基于错误img src属性生成的img对象的检查检查基于错误的img src属性生成的img对象
基于以上一些浏览器特性的判断,市面上绝大多数无头浏览器程序基本上都可以被干掉。至此,其实网页抓取的门槛提高了,这就需要编写抓取程序的开发者修改浏览器内核的C++代码,重新编译一个浏览器。而且以上特点是对浏览器内核的改动不小。
进一步,基于浏览器的UserAgent字段中描述的浏览器品牌、版本和型号信息,我们可以检查js运行时、DOM和BOM的各个原生对象的属性和方法,观察其特性是否符合该版本浏览器的特性。
这种方法被称为浏览器指纹检查技术,它依赖于大型网站收集各种浏览器的api信息。作为编写爬虫程序的攻击者,你可以在无头浏览器运行时注入一些js逻辑来伪造浏览器特性。
此外,当在浏览器端使用js api研究机器人浏览器检测时,我们发现了一个有趣的技巧。您可以将预注入的js函数伪装成本机函数,并查看以下代码:
爬虫攻击者可能提前注入一些js方法,在一些原生api之外包装一层代理函数作为钩子,然后用这个假的js api来覆盖原生api。如果防御者在toString后基于检查函数来检查和判断这一点,它将被绕过。所以我们需要更严格的检查,因为bind的假方法在toString之后没有函数名。
抗爬虫银弹
目前最可靠的防爬行和机器人检测手段是验证码技术。但是验证码并不意味着一定要强制用户输入一系列的字母和数字。基于用户行为的行为验证技术也有很多,比如鼠标、触摸屏等,其中Google reCAPTCHA是最成熟的一种。
基于以上识别和区分用户与爬行动物的技术,网站的防御方最终要做的是禁止该ip地址或对该ip的访问用户应用高强度验证码策略。因此,攻击者必须购买ip代理池来抓取网站信息,否则,单个ip地址很容易被阻止,无法抓取。抢夺和反抢夺的门槛已经上升到知识产权代理人池的经济成本水平。
机器人协议
此外,爬行技术领域还有一种“白色方式”,叫做机器人协议。可以访问网站根目录下的/robots.txt。比如我们来看看github的机器人协议。“允许”和“不允许”为每个UA爬网程序声明爬网授权。
但是,这只是君子协定。虽然有法律上的好处,但只能限制商业搜索引擎的蜘蛛程序,你不能限制那些“野登山者”。
写在最后
如果你能以一英尺的神奇高度和一英尺的高度抓住和反击网络内容,那就注定是一个陷阱。你永远无法用某种技术完全屏蔽爬虫程序。你能做的就是增加攻击者的抓取成本,更准确地了解未经授权的抓取行为。
这个张文提到的验证码的攻防其实是一个很复杂的技术难点,这里留个悬念。如果有兴趣,可以关注一下,期待后续张文详细阐述。
另外,欢迎对爬行感兴趣的朋友关注我的开源项目韦伯斯特。该项目通过将Node.js与chrome headless模式相结合,实现了一个高可用性的爬虫抓取框架,使得chrome可以通过对页面的渲染,对页面中所有js和ajax渲染的异步内容进行抓取;结合redis实现了一个任务队列,使得爬虫程序可以方便地横向和纵向扩展。