爬虫抓取网页数据(从爬虫的**角度来讲最简单的爬虫直接访问一个接口)
优采云 发布时间: 2021-10-25 20:03爬虫抓取网页数据(从爬虫的**角度来讲最简单的爬虫直接访问一个接口)
从爬虫的角度
最简单的爬虫是几乎所有服务器端和客户端编程语言都支持的http请求。只要向目标页面的url发起http get请求,浏览器加载这个页面时就可以获取到完整的html文档。我们称之为“同步页面”。
作为防御方,服务器可以根据http请求头中的User-Agent检查客户端是合法的浏览器程序还是脚本爬取程序,从而判断是否改变真实的页面信息内容发送给你.
这当然是最小的儿科防御方法。作为进攻方,爬虫可以伪造 User-Agent 字段。即使你想要,在http get方法中,请求头的Referrer、Cookie等,所有字段爬虫都可以轻松伪造。
此时服务端可以使用浏览器的http头指纹,根据你声明的浏览器厂商和版本(来自User-Agent),判断你的http头中的各个字段是否符合浏览器的特性,如果不符合要求,它将被视为爬虫。该技术的一个典型应用是 PhantomJS 1.x 版本。由于底层调用了Qt框架网络库,所以http头中有明显的Qt框架网络请求特征,可以被服务器直接识别。并拦截。
另外还有一个比较异常的服务端爬虫检测机制,就是在对页面的所有http请求的http响应中植入一个cookie token,然后在这个页面异步执行的一些ajax接口中进行检查。检查访问请求中是否收录cookie token,返回token表示这是一次合法的浏览器访问,否则表示刚刚发出token的用户访问了页面html但是没有访问到执行js后调用的ajax在 html 中的请求很可能是爬虫。
如果直接访问一个没有token的接口,说明你没有请求html页面,直接向页面中应该通过ajax访问的接口发起网络请求。这显然证明你是一个可疑的爬虫。知名电商网站亚马逊采用了这种防御策略。
以上是一些基于服务端验证爬虫程序可以播放的例程。
基于客户端js运行时的检测
现代浏览器赋予了 JavaScript 强大的能力,所以我们可以把页面的所有核心内容都变成 js 异步请求 Ajax 获取数据然后渲染到页面上,这显然提高了爬虫爬取内容的门槛。依靠这种方式,我们将对抗爬虫和反爬虫的战场从服务端转移到了客户端浏览器中的js运行时。接下来说一下结合客户端js运行时的爬虫爬取技术。
刚才提到的各种服务端验证,对于普通python和java语言编写的HTTP爬虫程序都有一定的技术门槛。毕竟,Web 应用程序是未经授权的爬虫的黑匣子。很多东西都需要一点一点的去尝试,大量的人力物力都花在了开发一套爬虫程序上。作为网站的防御方,只要容易调整一些策略,攻击者就需要再次花费同样的时间来修改爬虫。拿逻辑。
这时候就需要无头浏览器了。这是一种什么样的技术?其实说白了就是让程序操作浏览器来访问网页,这样写爬虫的人就可以通过调用浏览器暴露给程序的api来实现复杂的爬虫业务逻辑。
事实上,这并不是近年来的新技术。曾经有基于webkit内核的PhantomJS,基于Firefox浏览器内核的SlimerJS,甚至还有基于IE内核的trifleJS。如果您有兴趣,可以在此处和此处查看两个无头浏览器。采集清单。
这些无头浏览器程序的实现原理,其实就是将一些开源的浏览器核心C++代码进行改造和封装,实现一个简单的浏览器程序,无需GUI界面渲染。但是这些项目的共同问题是,因为他们的代码是基于官方fork webkit等内核的某个版本的主干代码,无法跟进一些最新的css属性和js语法,并且有一些兼容性问题,不如真实的。GUI浏览器发行版运行稳定。
其中,最成熟、最常用的应该是PhantonJS。关于这种爬虫的识别我之前写过一篇博文,这里不再赘述。PhantomJS 有很多问题,因为是单进程模型,没有必要的沙箱保护,浏览器内核的安全性较差。此外,该项目的作者已宣布将停止维护该项目。
现在谷歌 Chrome 团队已经在 Chrome 59 发布版本中开放了 headless 模式 api,并开源了一个基于 Node.js 调用的 headless chrome 驱动程序库。我还为这个库贡献了一个centos环境部署依赖安装列表。
Headless Chrome 可谓是 Headless Browser 中独一无二的大杀器。因为它本身是一个 chrome 浏览器,所以它支持各种新的 CSS 渲染功能和 js 运行时语法。
基于这种方法,作为进攻方的爬虫可以绕过几乎所有的服务器端验证逻辑,但是这些爬虫在客户端js运行时仍然存在一些缺陷,例如:
基于插件对象检查
if(navigator.plugins.length === 0) {
console.log('It may be Chrome headless');
}
基于语言的检查
if(navigator.languages === '') {
console.log('Chrome headless detected');
}
基于 Webgl 的检查
var canvas = document.createElement('canvas');
var gl = canvas.getContext('webgl');
var debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
var vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
var renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
if(vendor == 'Brian Paul' && renderer == 'Mesa OffScreen') {
console.log('Chrome headless detected');
}
根据浏览器细线特征检查
if(!Modernizr['hairline']) {
console.log('It may be Chrome headless');
}
检查根据错误的 img src 属性生成的 img 对象
var body = document.getElementsByTagName('body')[0];
var image = document.createElement('img');
image.src = 'http://iloveponeydotcom32188.jg';
image.setAttribute('id', 'fakeimage');
body.appendChild(image);
image.onerror = function(){
if(image.width == 0 && image.height == 0) {
console.log('Chrome headless detected');
}
}
根据以上一些浏览器特性的判断,基本可以杀掉市面上大部分的Headless Browser程序。在这个层面上,它实际上提高了网络爬虫的门槛,要求编写爬虫的开发者必须修改浏览器内核的C++代码,重新编译浏览器。此外,上述功能是特定于浏览器的。内核的变化其实不小。如果你曾经尝试过编译 Blink 内核或者 Gecko 内核,你就会明白对于一个“脚本小子”来说有多难~
此外,我们还可以根据浏览器 UserAgent 字段中描述的浏览器品牌、版本和型号信息,检查 js 运行时、DOM 和 BOM 的每个原生对象的属性和方法,观察其特性是否与浏览一致这个版本的设备应该具备的特性。
这种方法被称为浏览器指纹检测技术,它依靠大型网站来采集各类浏览器的api信息。作为编写爬虫程序的进攻方,你可以在 Headless Browser 运行时中预先注入一些 js 逻辑,从而锻造浏览器的特性。
另外,在研究浏览器端使用js api进行Robots Browser Detect时,我们发现了一个有趣的技巧。您可以将预先注入的 js 函数伪装成 Native Function。看看下面的代码:
var fakeAlert = (function(){}).bind(null);
console.log(window.alert.toString()); // function alert() { [native code] }
console.log(fakeAlert.toString()); // function () { [native code] }
爬虫攻击者可能会预先注入一些js方法,用代理函数包裹一些原生api作为钩子,然后利用这个假js api覆盖原生api。如果防御者根据toString函数后的[native code]的检查来判断这个,那么就会绕过。所以需要更严格的检查,因为bind(null)的伪造方法在toString之后没有携带函数名,所以需要检查toString之后的函数名是否为空。
这个技术有什么用?这是一个扩展。反爬虫卫士有Robot Detect方法,在js运行时主动抛出告警。副本可以写一些与业务逻辑相关的东西。当一个普通用户点击OK按钮时,肯定会有1s甚至更长的延迟,因为浏览器中的alert会阻塞js代码的运行(实际上在v8中,他会以类似的方式挂起isolate上下文的执行)处理挂起),所以爬虫程序可以选择上面的作为黑客上述技术在页面上所有js运行之前预先注入一段js代码,并钩住alert、prompt等所有弹窗方法确认。如果防御者在弹出代码之前首先检查他调用的警报方法不是原生的,则道路被阻塞。
防爬虫银弹
目前防抢和机器人检测最可靠的方法是验证码技术。但是,验证码并不意味着必须强制用户输入一系列字母数字。还有很多基于用户鼠标、触摸屏(移动终端)等行为的行为验证技术。其中最成熟的是基于机器学习的 Google reCAPTCHA。区分用户和爬虫。
基于以上多种识别和区分用户和爬虫的技术,网站的防御者最终需要做的就是对该ip的访问用户进行屏蔽或强加高强度验证码策略. 因此,攻击者必须购买一个ip代理池来捕获网站的内容,否则单个ip地址很容易被拦截而无法捕获。爬虫和反爬虫的门槛提高到了ip代理池的经济成本水平。
机器人协议
此外,在爬虫爬行技术领域还有一种“白道”方法,叫做robots协议。Allow 和 Disallow 声明每个 UA 爬虫的爬取权限。
不过,这只是君子之约。虽然具有法律利益,但只能限制商业搜索引擎的蜘蛛程序。你不能限制那些“野生爬虫”。
写在最后
网页内容的爬取和反控,注定是一场一尺高一丈的猫捉老鼠游戏。你永远无法用某种技术完全封锁爬虫程序。你所能做的就是提高* **人的爬行成本,更准确地了解未经授权的爬行行为。