使用Chrome快速实现数据的抓取(二)——协议
在前面的文章简单的介绍了一下Chrome调试模式的启动方式,但前面的API只能做到简单的打开,关闭标签操作,当我们需要对某个标签页进行详细的操作时,则需要用到页面管理API。首先我们还是来回顾下获取页面信息:
访问 http://127.0.0.1:9222/json,即可获取如下所示的页面信息
{
"description": "",
"devtoolsFrontendUrl": "/devtools/inspector.html?ws=127.0.0.1:9222/devtools/page/6d4f925f-7220-47cd-a4f9-800686445ffb",
"faviconUrl": "http://tianfang.cnblogs.com/favicon.ico",
"id": "6d4f925f-7220-47cd-a4f9-800686445ffb",
"title": "天方 - 博客园",
"type": "page",
"url": "http://tianfang.cnblogs.com/",
"webSocketDebuggerUrl": "ws://127.0.0.1:9222/devtools/page/6d4f925f-7220-47cd-a4f9-800686445ffb"
},
其中webSocketDebuggerUrl字段就是页面管理API的地址,从url格式就可以看出它是一个websocket形式的协议,首先我们看看链接地址:
ws://127.0.0.1:/devtools/page/92615aad-5862-48d5-983d-248468e9741a
通过简单的分析可以看出,它的变量只有两个:访问端口和页面Id,我们甚至不需要访问webSocketDebuggerUrl字段,直接根据Id也可以非常容易的构建这个地址的。大多数程序都有websocket的支持库的,这里为了测试,我直接找的一个在线websocket工具:http://www.blue-zero.com/WebSocket/,连接上后,就可以进行命令的收发了。
交互协议
Chrome远程调试模式是遵循Chrome DevTools Protocol的,这个协议在https://chromedevtools.github.io/devtools-protocol/中有详细的描述,它一般分为三个版本:
其中稳定版的是stable protocol,不过它的功能相对最新版要少些,如果不担心稳定性的问题的话,我们大多数的时候还是可以直接用(tot)版本的。
消息格式
Chrome DevTools Protocol的协议消息格式比较简单,是文本形式的,用json表示对象,它主要分为如下三种:请求、响应和通知。
请求:
请求是客户端主动向chrome发送的请求,具体格式可参考前面的协议,这里我们以Network.enable为例,我们发送的请求如下:
{"id":4,"method":"Network.enable","params":{"maxTotalBufferSize":10240}}
它内容主要包括id,method, params三个部分:id是自己建立的命令编号,method是发送的请求,params则是请求参数。
响应:
响应则是对请求的应答,并返回结果:
{"id":4,"result":{}}
响应内容包括两个部分:id和result,id为请求命令编号,result为请求结果。
通知:
通知为chrome主动通知给客户端的消息。例如,启用network.enable后,就会上报一些网络通知:
{"method":"Page.frameStoppedLoading","params":{"frameId":"7216.1"}}
{"method":"Network.loadingFailed","params":{"requestId":"7216.88","timestamp":2832.149269,"type":"Document","errorText":"","canceled":true}}
通知主要包括method和params两个部分。
常用指令
Chrome DevTools Protocol的指令分为三十多个大类,每类又有若干个指令,这里不能一一介绍,只选择几个简单而常用的指令介绍一下:
- 跳转到指定页面:Page.navigate
- 执行JS函数:Runtime.evaluate
- 获取资源树:Page.getResourceTree
其中Page.navigate是必备指令,用于跳转页面。而Runtime.evaluate的效果等同于在Develop Tools的Console控制台执行指令,基本可以执行任何js指令,模拟输入,输出渲染后的html用它都可以轻松搞定,可以说是大杀器了。

获取资源树和获取资源指令则用于获取浏览器当前原始请求的数据,可以用它来构建Develop Tools的Source树。

可以说,利用Develop Tools实现的功能我们都可以通过Chrome DevTools Protocol实现,Chrome自己也内置了一个官方的实现,用Chrome直接访问页面信息的devtoolsFrontendUrl即可看到,和按F12调用出来的Develop Tools基本一模一样。
关于协议内容本文就介绍到这里,后面文章中我将用示例介绍用实际用例用Chrome编写爬虫。
使用Chrome快速实现数据的抓取(二)——协议的更多相关文章
- 使用Chrome快速实现数据的抓取(四)——优点
些一个抓取WEB页面的数据程序比较简单,大多数语言都有相应的HTTP库,一个简单的请求响应即可,程序发送Http请求给Web服务器,服务器返回HTML文件.交互方式如下: 在使用DevProtocol ...
- 使用Chrome快速实现数据的抓取(三)——JQuery
使用Chrome抓取页面一个非常方便的地方就是它可以执行JS,也就是说我们可以通过JS函数获取我们想要的数据.一个非常强大易用的库就是Jquery,本文就简单的介绍一下使用Chrome获取数据时Jqu ...
- 使用Chrome快速实现数据的抓取(五)—— puppeteer
如果要以自动化的方式驱动Chrome进行数据抓取,必须实现Chrome Dev Protocol协议的客户端.这个协议本身并不复杂,我在之前的文章中也简单的介绍过一下. Google本身有一个Node ...
- 使用Chrome快速实现数据的抓取(一)——概述
对于一些简单的网页,我们可以非常容易的通过Develop Tool来获取其请求报文规律,并仿照其构建报文来获取页面信息.但是,随着网页越来越复杂,许多页面是由js动态渲染生成的.要获取这类信息,则需要 ...
- HTTPS数据包抓取的可行性分析
HTTPS数据包抓取的可行性分析 相信只要是从事软件开发, 多多少少都会涉及到数据包的抓取.常见的有网页数据抓取(即网页爬虫),应用程序数据包抓取等.网页数据抓取比较简单, 在chrome下可以非常方 ...
- 使用python和tableau对数据进行抓取及可视化
使用python和tableau对数据进行抓取及可视化 本篇文章介绍使用python抓取贷款及理财平台的数据,并将数据拼接和汇总.最终通过tableau进行可视化.与之前的python爬虫文章 不同之 ...
- [Python] 糗事百科文本数据的抓取
[Python] 糗事百科文本数据的抓取 源码 https://github.com/YouXianMing/QiuShiBaiKeText import sqlite3 import time im ...
- 6 wireshark 安装使用 数据包抓取
1.wireshark安装 2.开始使用 3.界面详情 4. 数据包抓取 5.过滤数据
- 浅谈HTTPS以及Fiddler抓取HTTPS协议
最近想尝试基于Fiddler的录制功能做一些接口的获取和处理工作,碰到的一个问题就是简单连接Fiddler只能抓取HTTP协议,关键的登录请求等HTTPS协议都没有捕捉到,所以想让Fiddler能够同 ...
随机推荐
- 基于vue配置axios
转载地址:https://juejin.im/post/5a02a898f265da43052e0c85 1.背景 在项目开发中ajax请求是必不可缺少 一部分ajax请求不需要loading或则请求 ...
- 错误/异常:The project cannot be built until build path errors are resolved 和 Unbound classpath container: 'JRE System Library [JavaSE-1.7]' in project 'MyJavaCode';的解决方法
错误1: The project cannot be built until build path errors are resolved 解决方法: 把java的类库加载进去即可,在工程上右键 选择 ...
- 泛型 for to/in 遍历 PK 效率;TEnumerator、TEnumerable
再使用泛型的时候,经常需要用到遍历功能: 只要继承了 TEnumerator 或 TEnumerable 这两个抽象类的 都具有遍历功能. 当然没有继承这两个抽象类的 也具有使用 for in 来遍历 ...
- Java事务管理之JDBC
前言 关于Java中JDBC的一些使用可以参见: Java 中使用JDBC连接数据库例程与注意事项 在使用JDBC的使用, 如何进行事务的管理.直接看一下代码 示例代码 /** * @Title: J ...
- 题解-python-CodeForces 227B
用hash解决.我python代码消耗很多内存,好在代码比C++短很多 n = int(raw_input()) mylist = raw_input().split(' ') i = 0 zid = ...
- java通过POI和easypoi实现Excel的导出
前言 在工作经常会遇到excel导出报表的功能,自己也做过一些,然后在项目里看到同事封装的一个excel导出工具类,着实不错,拿来分享一下.然后,又在网上看到一个使用easypoi实现cxcel导出的 ...
- 简单实现textview文本每隔两秒就改变一次
//这个方法可以实现文本每隔两秒就改变一次, public void textTask(){ final android.os.Handler handler=new android.os.Handl ...
- easyui tree tabs
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 【LOJ】#2062. 「HAOI2016」地图
题解 我对莫队真是一无所知 这个东西显然可以用圆方树转成一个dfs序列 然后呢,用莫队计算每个询问区间的每个数出现的次数,从而顺带计算每个数字的奇偶性 但是我们要查的数字也用一个范围,可以直接用分块维 ...
- vue 中 使用 tradingview
加载页面时初始化方法: mounted 可以在 mounted 方法中调用 methods 的中的方法 使用 data 中的数据时,在每个方法的开始推荐先定义 var that = this 现在还不 ...