使用Chrome快速实现数据的抓取(四)——优点

些一个抓取WEB页面的数据程序比较简单,大多数语言都有相应的HTTP库,一个简单的请求响应即可,程序发送Http请求给Web服务器,服务器返回HTML文件。交互方式如下:

  

在使用DevProtocol驱动Chrome抓取数据时,交互过程则如下图所示:

  

此时Chrome在中间充当了一个代理的角色,看上去变得更加复杂了,实际上却对于我们的蜘蛛程序大有帮助。本文就简单的总结下这种方式存在如下优点。

获取动态生成的网页内容

现在很多的网页内容的内容并不是一开是就能直接通过最初的Http请求直接获取到的,而是在返回的html页面中通过JS加载资源及计算动态生成的页面。采用这种方式的原因有很多,有的是为了更好的用户体验,有的是因为开发框架,有的是为了节省带宽,也有的则单纯是为了加密页面内容,从而实现反爬虫的功能。

不管是因为什么原因,它使得本来很简单的单一"请求-响应"式的交互过程变得复杂起来,传统的一次交互即可完成所有的请求变成了如下形式:

  

动态加载给传统的数据采集造成了不小的障碍,但往往需要分析页面加载过程,分析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 = "password";
    $("#signin")[0].click();

有的网站需要验证码来防止爬虫程序,我们甚至可以通过在chrome中手动打码的这种自动结合手动的方式快速实现数据抓取。如果要开发出支持接入打码平台或智能识别平台的接口,也远比传统的蜘蛛程序容易的多。

另外,Chrome也提供了非常丰富的API模拟键盘和鼠标的输入的接口,用起来非常方便。

开发调试方便

开发爬虫程序往往是一个反复调试的过程,由于我们是直接解析Chrome获取的数据,由于Chrome DevTool本身就是一个强大的调试工具。这样大大加速了我们的开发过程。

我们可以通过首先在Chrome中通过DevTools查看解析我们的页面,通过控制台程序验证编写的脚本。用Chrome就可以完成大部分脚本的开发,而这一部分往往是不能复用,并且非常花时间的。这相当于我们获取了一个强大的调试工具,可以节省不少时间。

另外,Chrome也是前端人员非常熟悉的工具,我们也可以把脚本开发的工作交给前端人员,他们可以更高效的开发脚本,大幅提高开发效率。

缺点

说了这么多的优点,最后我们来说一说它的缺点,这种方式主要的缺点还是性能。

传统的爬虫是非常轻量级的,就是一个传统的tcp的socket程序,通过异步socket的方式可以非常容易的实现成千上万的并发数的,并且只加载了需要的信息,性能非常高。

而通过驱动chrome的方式是通过chrome获取服务器端的数据的,一来加载了不必要的图片,样式,广告等文件造成了带宽的浪费,另外也对网页进行了渲染造成了CPU的开销,虽然可以通过插件减少不必要的文件加载和headless的方式减少开销,但相对传统的请求应答方式来说仍然是一个重量级的获取方式。对于小规模的采集可能还问题不大,但如果要进行类似搜索引擎的方式的海量数据采集可能就有点吃不消了。

参考文章:

时间: 2024-12-24 14:40:27

使用Chrome快速实现数据的抓取(四)——优点的相关文章

使用Chrome快速实现数据的抓取(一)

对于一些简单的网页,我们可以非常容易的通过Develop Tool来获取其请求报文规律,并仿照其构建报文来获取页面信息.但是,随着网页越来越复杂,许多页面是由js动态渲染生成的.要获取这类信息,则需要蜘蛛程序模拟js渲染过程,此时必须研究其js脚本才能完成信息的获取. 虽然从理论上来讲,任何浏览器能获取到的信息,我们完全可以编写爬虫来获取到.但是而这个分析过程往往并不是一个比较麻烦的过程,往往存在如下困难: 逆向分析js费时费力, 许多爬虫作者并不是前端工程师,效率不高 开发阶段容易分析不全,使

使用Chrome快速实现数据的抓取(二)

在前面的文章简单的介绍了一下Chrome调试模式的启动方式,但前面的API只能做到简单的打开,关闭标签操作,当我们需要对某个标签页进行详细的操作时,则需要用到页面管理API.首先我们还是来回顾下获取页面信息: 访问 http://127.0.0.1:9222/json,即可获取如下所示的页面信息 {        "description": "",        "devtoolsFrontendUrl": "/devtools/in

使用Chrome Headless 快速实现java版数据的抓取

参考<使用Chrome快速实现数据的抓取(一)--概述>和<使用Chrome快速实现数据的抓取(二)--协议>. 各协议客户端实现参考:https://github.com/ChromeDevTools/awesome-chrome-devtools#chrome-devtools-protocol. Java: cdp4j - Java library for CDP,使用这个类库实现. 地址:https://github.com/webfolderio/cdp4j maven引

C# 网页数据表格抓取数据

主要方法: public List<string> datasearch() { List<string> list = new List<string>(); string url = @""+txtUrl.Text.Trim().ToString(); WebRequest request = WebRequest.Create(url); //请求url WebResponse response = request.GetResponse();

腾讯宜出行数据无人值守抓取

腾讯宜出行的热力图数据抓取有以下几个难点: 1)需要登录抓取. 2)会话时效性短,Cookie中有JS动态产生的验证参数. 3)一个账号每天只能发送Ajax请求120次左右,超过就会提示"访问过于频繁,请明天再来". 4)返回的Ajax数据经纬度数据有加密,Count值也被做了手脚. 综合上述难点,鲲之鹏的技术人员最终采用Selenium + Firefox的方式实现了无人值守模式抓取: 1)支持账号列表,能够自动登录账号: 2)在账号被封时(一个账号一天只能访问120次左右)能够自动

python爬取ajax动态生成的数据 以抓取淘宝评论为例子

在学习python的时候,一定会遇到网站内容是通过ajax动态请求.异步刷新生成的json数据的情况,并且通过python使用之前爬取静态网页内容的方式是不可以实现的,所以这篇文章将要讲述如果在python中爬取ajax动态生成的数据. 至于读取静态网页内容的方式,有兴趣的可以查看博客内容. 这里我们以爬取淘宝评论为例子讲解一下如何去做到的. 这里主要分为了四步: 一 获取淘宝评论时,ajax请求链接(url) 二 获取该ajax请求返回的json数据 三 使用python解析json数据 四

使用Puppeteer进行数据抓取(四)——图片下载

大多数情况下,图片获取并不是很困难的事情,获取图片的url,然后模拟浏览器请求即可.但是,有的时候这种方法往往无法生效,常见的情形有: 动态图片,每次获取都是一个新的,例如图片验证码,重新获取时是一个新的验证码图片,已经失去了效果了. 动态上下文,有的网站为了反爬虫,获取图片时要加上其动态生成的cookie才行. 这些情况下,使用puppeteer驱动chrome浏览器能看到图片,但获取url后单独请求时,要么获取到的图片无效,要么获取不到图片.本文这里就简单的介绍下一些十分通用且有效的下载这些

用Vue来实现音乐播放器(十四):歌手数据接口抓取

第一步:在api文件夹下创建一个singer.js文件 返回一个getSingerList()方法  使他能够在singer.vue中调用 import jsonp from '../common/js/jsonp.js' import {commonParams,options} from './config.js' export function getSingerList() { const url = 'https://c.y.qq.com/v8/fcg-bin/v8.fcg' cons

利用Python把github上非常实用的数据全部抓取下来!留给自己备用

这是我根据这个流程实现的代码,网址:LiuRoy/github_spider 递归实现 运行结果 因为每个请求延时很高,爬虫运行效率很慢,访问了几千个请求之后拿到了部分数据,这是按照查看数降序排列的python项目: 这是按粉丝数降序排列的用户列表 运行缺陷 作为一个有追求的程序员,当然不能因为一点小成就满足,总结一下递归实现的几个缺陷: 因为是深度优先,当整个用户图很大的时候,单机递归可能造成内存溢出从而使程序崩溃,只能在单机短时间运行.单个请求延时过长,数据下载速度太慢. 针对一段时间内访问