js 爬虫抓取网页数据(有效的应对HTTP反爬虫策略最简单的反爬机制)
优采云 发布时间: 2021-12-22 20:03js 爬虫抓取网页数据(有效的应对HTTP反爬虫策略最简单的反爬机制)
一些从WEB页面抓取数据的程序比较简单。大多数语言都有相应的 HTTP 库。一个简单的请求响应就足够了。程序向Web服务器发送Http请求,服务器返回HTML文件。交互方式如下:
使用DevProtocol驱动Chrome获取数据时,交互过程如下图所示:
这时候Chrome充当了中间的代理,看起来比较复杂,但实际上对我们的爬虫程序很有帮助。本文简要总结了这种方法的以下优点。
获取动态生成的网页内容
现在很多网页的内容并不是通过初始的Http请求一打开就直接获取,而是通过JS加载资源,在返回的html页面中计算动态生成的页面。采用这种方式的原因有很多,有的为了更好的用户体验,有的为了框架开发,有的为了节省带宽,有的纯粹是为了对页面内容进行加密,从而实现反爬虫的功能。
不管是什么原因,它使原本简单的单一“请求-响应”交互过程变得复杂。传统的一次*敏*感*词*互可以将所有请求完成为如下形式:
动态加载对传统数据采集造成了很大的阻碍,但是往往需要分析页面加载过程,分析JS,在程序中嵌入js引擎模拟浏览器执行相应的脚本来实现获得最终数据。这是一个非常费时费力的过程,也不容易分析整个过程。
为了更容易解析这样的动态网页,一些爬虫引擎开始引入Dom解析和JS执行能力来模拟浏览器解析获取相关资源。但是,由于这个过程非常复杂,这些功能往往并不完善,存在很多陷阱。
现在,通过Chrome浏览器的方式就是这种解析页面的方式的集成版本。因为Chrome本身就是一个浏览器,它具有完善的页面解析能力,所以可以如鱼得水。解析过程由chrome代理完成,我们只需要从chrome获取最终的解析结果即可。
针对爬虫的有效对策
最简单的反爬虫机制就是检查HTTP请求的Headers信息,包括User-Agent、Referer、Cookies等,根据手写的Http请求头和常用的浏览器头的区别进行反爬。这些对于防止主要爬虫非常有效,但 Chrome 本身是一个标准浏览器,天生就对这种反爬虫机制免疫。
另一种反爬虫机制就是上面提到的动态加载。基于上面的解释,这也是天生对 Chrome 免疫的。
当然,防爬的策略有很多,比如限制IP访问次数、限制访问频率、验证码等方法来防爬。Chrome虽然不直接支持这些,但是处理起来比传统的Http请求方便很多。下面的文章会陆续介绍,这里就不一一展开了。
DOM操作能力
Chrome具有完善的Dom操作能力。基本上所有可以在Chrome DevTools控制台中进行的操作,都可以通过DevProtocol在程序中完成,为我们的APP增加了完善的DOM操作能力。许多以前需要通过 HTML 分析的数据现在都可以获得。直接通过Jquery等js函数完成。并且可以直接格式化为JSON输出,方便多了。
与服务器交互更容易
在很多情况下,有些页面需要一些交互才能获得,比如登录。
因为Chrome具有执行JS的能力,所以我们可以通过一些简单的JS脚本来非常轻松地执行它。比如花园的登录可以通过如下脚本实现:
$("#input1")[0].value = "userName";
$("#input2")[0].value = "密码";
$("#signin")[0].click();
有些网站需要验证码来防止爬虫,我们甚至可以通过chrome中手动编码的自动组合快速实现数据抓取。如果要开发一个支持访问编码平台或智能识别平台的接口,比传统的蜘蛛程序要容易得多。
此外,Chrome 还提供了非常丰富的 API 来模拟键盘和鼠标输入界面,使用起来非常方便。
方便的开发调试
爬虫的开发往往是一个反复调试的过程,因为我们直接解析Chrome获取的数据,因为Chrome DevTool本身就是一个强大的调试工具。这大大加快了我们的开发进程。
我们可以先通过Chrome中的DevTools查看和解析我们的页面,通过控制台程序验证编写的脚本。大部分的脚本开发都可以使用Chrome来完成,而这部分往往是不可复用的,需要耗费大量的时间。这相当于获得了一个强大的调试工具,可以节省大量的时间。
另外,Chrome也是前端人员非常熟悉的一个工具。我们还可以将脚本开发的工作委托给前端人员,他们可以更高效地开发脚本,大大提高开发效率。
缺点
说了这么多优点,最后说一下它的缺点。这种方法的主要缺点是性能。
传统的爬虫非常轻便。它是一个传统的tcp socket程序。通过异步socket方式,可以轻松实现上千并发数,只加载需要的信息,性能非常高。
驱动chrome的方式是通过chrome获取服务端数据。从而加载了不必要的图片、样式、广告等文件,造成带宽的浪费。此外,它还会渲染网页,造成CPU开销,虽然可以通过插件减少不必要的文件加载和headless方法来减少开销,但相比传统的请求响应方式,仍然是重量级的获取方式。对于小规模的采集来说,可能不是什么大问题,但是如果你想像搜索引擎那样处理海量数据,采集可能有点吃力。
参考文章: