基于浏览器内核的被动式爬虫任务下发框架

基于浏览器内核的被动式爬虫任务下发框架

现有基于浏览器的客户端测试框架通过ChromeDriver这类组件来主动控制,但主动控制有缺点:

  1. 重新load下一个页面时,上一个页面可能仍有JS代码在执行,或者网络层的连接阻塞、UI线程阻塞什么的;
  2. 通过WebView接口注入执行的JS代码可能因为各种情况意外出错,出错的话无法获得通知
  3. 无法可靠地向浏览器查询,获得当前任务是否已经执行完成的信息

这里给出一个简单的基于修改chromium内核,进行被动控制的思路及流程如下:

  1. 浏览器启动时,通过一个‘给定的任务下发Web服务URL’获得一次‘爬虫任务描述’,包含下列信息:

    1. target_url: 要抓取的页面的URL

      • 可选的task_id(假如target_url属性还不能用于对任务的唯一描述的话)
    2. inject_js: 要注入的客户端爬虫JS代码
    3. post_notify: 任务完成时的一个HTTP POST地址
      (这意味着任务描述需要作为一条记录保存在数据库中,包含‘是否已下发’,‘是否已完成’信息)
      要点是这里“分布式微服务架构+无状态应用+异步完成通知”的思想
  2. 接下来,浏览器打开target_url,待loadFinished时,下载inject_js(可以在主UI进程端缓存)并加载注入
  3. 注入的客户端爬虫JS代码开始分析目标页面的DOM树结构,提取出内容信息,并Ajax POST到post_notify
  4. post_notify服务器端接受爬虫抓取的数据,更新‘爬虫任务描述’表记录,同时返回OK确认
  5. 注入的JS代码通知浏览器访问任务下发URL,获取下一个新的‘爬虫任务描述’
    • JS控制可能不可靠,导致浏览器处于‘僵死’状态,因此可以在主UI进程端启动一个watchdog计时器,强制重置状态

对内核的修改点(TODO):

  1. 当前的‘爬虫任务描述’,以C++数据结构的形式存储到chromium的主UI进程端;
  2. 增加一个新的application/json-crawler-task MIME类型,以解析json格式的爬虫任务描述(主要难点)
  3. loadFinished回调时的inject_js下载、缓存及注入代码
  4. watchdog计时器(可能不需要)
  5. 如何实现基于浏览器的RSS客户端爬虫?一般XML文档不是HTML,无法注入JS代码执行

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 10:36:45

基于浏览器内核的被动式爬虫任务下发框架的相关文章

[IE编程] 多页面基于IE内核浏览器的代码示例

有不少人发信问这个问题,我把答案贴在这里: 建议参考 WTL (Windows Template Library) 的代码示例工程TabBrowser  (在WTL目录/Samples/TabBrowser 下面).该工程演示了如何用WTL + IE WebBrowser接口开发一个多Tab的IE内核浏览器, 并演示如何用ATL的IDispEventSimpleImpl监听DWebBrowserEvents2 事件, 代码简洁易懂,很有参考价值. WTL 是微软的开源项目,可以去 http://

python selenium中如何测试360等基于chrome内核的浏览器

转自:https://blog.csdn.net/five3/article/details/50013159 直接上代码,注意是基于chrome内核的浏览器,基于ie的请替换其中的chrome方法为ie,但自己未尝试过,如果有结果可以告知! from selenium.webdriver.chrome.options import Optionsfrom selenium import webdriverfrom selenium.webdriver.common.keys import Ke

三个基于.net的浏览器内核使用的比较

最近做模拟登陆发帖相关的项目 分别尝试了基于IE .NET自带的 webbrowser 和 基于WebKit 的WebKit.NET和openWebkitSharp 最开始肯定是用的.NET自带的webbrowser 但是在一个模拟点击的问题上遇到了错误,就是InvokeMerber("click")这个事件没有生效 网上也有和我差不多类似的错误,但是找了一下 没看到有用的解决办法 而且其执行js的办法只有(当然,这个只是目前的发现,后来发现有解决办法)invokeScript(met

使用浏览器内核爬取OTA数据

因为业务需要,所以会有一些爬虫的设计需求. 目前这一部分的内容都是外包项目,领导说需要根据实际情况,研究一下自己研发的可能性. 但是绝大部分这些OTA网站都做了大量的异步加载,并且接口都做了加密处理. 也就是说,我们从控制台上面拦截下来的请求数据都是加密的数据,只有经过页面客户端解析后的数据,才能真正的渲染成我们想要的页面. 因此,为了能够正确地抓取到这些数据,我们必须使用浏览器内核来实现. 现在常用的浏览器内核工具有: QtWebkit spynner selenium 但是由于seleniu

浏览器内核

主流浏览器内核介绍(前端开发值得了解的浏览器内核历史) 最近 "个人恶趣味" 持续发酵,突然想了解下浏览器内核的发展历史. 内核 首先得搞懂浏览器内核究竟指的是什么. 浏览器内核又可以分成两部分:渲染引擎(layout engineer 或者 Rendering Engine)和 JS 引擎.它负责取得网页的内容(HTML.XML.图像等等).整理讯息(例如加入 CSS 等),以及计算网页的显示方式,然后会输出至显示器或打印机.浏览器的内核的不同对于网页的语法解释会有不同,所以渲染的效

unigui判断浏览器内核、操作系统以及是否移动终端函数

function GetDeviceType(var OsName, BrowserName: string; var IsMobileDevice: Boolean): string; var I: Integer; BrowserInfo: string; OSTypes, BrowserTypes: TStringList; begin Result := ''; BrowserName := 'Unknown'; OsName := 'Unknown'; IsMobileDevice :

各浏览器内核

Trident(IE内核) Trident: 该内核程序在1997年的IE4中首次被采用,是微软在Mosaic代码的基础之上修改而来的,并沿用到IE11.Trident实际上是一款开放的内核,其接口内核设计的相当成熟,因此才有许多采用IE内核而非IE的浏览器(壳浏览器)涌现.此外,为了方便也有很多人直接简称其为IE内核(当然也不排除有部分人是因为不知道内核名称而只好如此说). 由于IE本身的"垄断性"(虽然名义上IE并非垄断,但实际上,特别是从Windows 95年代一直到XP初期,就

各主流浏览器内核介绍

所谓的"浏览器内核"无非指的是一个浏览器最核心的部分--"Rendering Engine",直译这个词汇叫做"渲染引擎",不过我们也常称其为"排版引擎"."解释引擎".这个引擎的作用是帮助浏览器来渲染网页的内容,将页面内容和排版代码转换为用户所见的视图. 注:有时候我们所说的"浏览器内核"甚至"渲染引擎",其实除了渲染引擎,也悄悄包含了javascript引擎,如W

四大主流浏览器内核简单了解

浏览器最重要最核心的部分就是"解释引擎",也就是"浏览器内核".他负责对网页语法的解释(如HTML.JavaScript)并渲染(显示)网页.      所以,通常所谓的浏览器内核也就是浏览器所采用的渲染引擎,渲染引擎决定了浏览器如何显示网页的内容以及页面的格式信息.不同的浏览器内核对网页编写语 法的解释也有不同,因此同一网页在不同的内核的浏览器里的渲染(显示)效果也可能不同,这也是网页编写者需要在不同内核的浏览器中测试网页显示效果的原 因. 浏览器内核很多,如果加