使用Chrome快速实现数据的抓取(一)——概述
对于一些简单的网页,我们可以非常容易的通过Develop Tool来获取其请求报文规律,并仿照其构建报文来获取页面信息。但是,随着网页越来越复杂,许多页面是由js动态渲染生成的。要获取这类信息,则需要蜘蛛程序模拟js渲染过程,此时必须研究其js脚本才能完成信息的获取。
虽然从理论上来讲,任何浏览器能获取到的信息,我们完全可以编写爬虫来获取到。但是而这个分析过程往往并不是一个比较麻烦的过程,往往存在如下困难:
- 逆向分析js费时费力,
- 许多爬虫作者并不是前端工程师,效率不高
- 开发阶段容易分析不全,使用时再改开销很大
- 许多信息需要登陆,点击等操作才能获取到,爬虫模拟这些行为比较费劲
- 爬虫容易被网站屏蔽
对于动态网页,一种策略是:首先通过浏览器访问目标网页,由浏览器完成解析后生成渲染后的Html文件,再由蜘蛛程序解析渲染后的Html文件。这样就非常方便的解决的前面遇到的大多数问题了。
要实现这个操作,则需要一个能与应用程序交互的类浏览器软件。网上看到的文章大多数是介绍通过phantomjs完成这一过程,不过用过它的人估计都会对它吐槽不已的,这里我这里就不一一列举了,感兴趣的朋友可以看看别人的吐槽:让人欢喜让我忧的phantomjs。
后来,发现Chrome本身也是可以通过远程调试协议实现与应用程序交互的,并且功能更加强大,从此果断的切换到了Chrome,使用它作为动态网页的渲染器,本文这里对使用Chrome的优越性并不想做太多介绍,主要介绍如何使用它。
启动Chrome
要使得Chrome支持与应用程序交互,首先需要指定远程调试端口:
chrome.exe
- 如果要指定缓存位置,可以添加启动参数:--user-data-dir=r:\cache
- 如果要使用无GUI模式(Headless),则需要添加参数: --disable-gpu --headless
注: Headless 模式目前尚还没有正式完善,目前的情况是:
- --headless在Linux的Chrome59中支持,Windows 的在chrome 60中支持
- --disable-gpu参数在未来可能不需要,
作为爬虫来说,使用Headless的方式可能更为常见,不过,在学习和开发的过程中,往往还是带着GUI的方式跟为方便些的。这里就使用带GUI的方式启动Chrome。
标签管理
启动后,我们就可以在程序中通过socket的方式实现和chrome的交互了。Chrome Debug API包括两个部分:标签管理和页面管理。首先我们介绍标签管理部分,它是Rest形式的API接口,我们可以通过浏览器进行协议的模拟。
首先用浏览器打开 http://127.0.0.1:9222/json,这是当前所有标签的list接口,可以看到如下接口数据:
[
{
"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"
},
{
"description": "",
"devtoolsFrontendUrl": "/devtools/inspector.html?ws=127.0.0.1:9222/devtools/page/92615aad-5862-48d5-983d-248468e9741a",
"id": "92615aad-5862-48d5-983d-248468e9741a",
"title": "Worker pid:6008",
"type": "service_worker",
"url": "https://www.google.com/_/chrome/newtab-serviceworker.js",
"webSocketDebuggerUrl": "ws://127.0.0.1:9222/devtools/page/92615aad-5862-48d5-983d-248468e9741a"
}
]
相信大部分人从这个页面中就可以它的基本信息,这里仍然简单的介绍一下:
- Id:页面的id信息
- devtoolsFrontendUrl:开发工具Url,可以通过chrome访问这个url来实现内置的调试工具访问
- type:当前进程的类型,只有类型为page的才是浏览器页面,其余类型的是后台背景进程,我们不需要操作这类对象
- url:当前页面访问的地址
- webSocketDebuggerUrl:当前页面的调试接口地址
实际上,chrome本身也内置了一个访问调试协议的工具,我们可以直接通过http://127.0.0.1:9222来使用它。
除此之外,常见的访问命令如下:
- http://127.0.0.1:9222/json :查看已经打开的Tab列表
- http://127.0.0.1:9222/json/version : 查看浏览器版本信息
- http://127.0.0.1:9222/json/new?http://www.baidu.com : 新开Tab打开指定地址
页面操作
前面的API只能做到简单的打开,关闭标签操作,我么往往还需要对页面进行更详细的操作,由于篇幅所限,本文了先介绍到这里,关于页面操作的方式,在后续文章中再做跟进一步的介绍。
使用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快速实现数据的抓取(二)——协议
在前面的文章简单的介绍了一下Chrome调试模式的启动方式,但前面的API只能做到简单的打开,关闭标签操作,当我们需要对某个标签页进行详细的操作时,则需要用到页面管理API.首先我们还是来回顾下获取页 ...
- 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.过滤数据
- pyspider 简单应用之快速问医生药品抓取(一)
网址:http://yp.120ask.com/search/-0-0--0-0-0-0.html from pyspider.libs.base_handler import * class Han ...
随机推荐
- Flask:redirect()函数
Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2 重定向,就是在客户端提交请求后,本来是访问A页面,结果,后台给了B页面,当然,B页面中才有需要的信息. 在Flask中 ...
- php修改文件上传大小限制
上传一个20M文件的时候php报如下错误,是php上传文件大小限制引起 POST Content-Length of 19248654 bytes exceeds the limit of 83886 ...
- 云计算IaaS浅谈
(本篇文章仅仅是整理文档资料时,发现的一篇课程报告,感觉还挺有参考意义的) 最近几年云计算一直是IT业的热点,一股炽热的云计算浪潮席卷了世界,全世界都在讲云计算,都在搞云计算.虽然最初是由谷歌公司提出 ...
- Codeforces 801C Voltage Keepsake(二分枚举+浮点(模板))
题目链接:http://codeforces.com/contest/801/problem/C 题目大意:给你一些电器以及他们的功率,还有一个功率一定的充电器可以给这些电器中的任意一个充电,并且不计 ...
- SQL数据是否存在(是否有数据)判断,表,存储过程是否存在
判断是否存在数据 if exists( select * from Hong_PageConfig where names='name' ) Begin print '1' End else Begi ...
- GreenPlum学习笔记:create table创建表
二维表同样是GP中重要的存储数据对象,为了更好的支持数据仓库海量数据的访问,GP的表可以分成: 面向行存储的普通堆积表 面向列存储的AOT表(append only table) 当然AOT表也可以是 ...
- MySQL学习笔记:字符串前后补全0
遇到一个需求:不足6位的需要自动补全6位,使用函数LPAD()和RPAD()补全. LPAD(str, len, padstr) 用字符串padstr对str进行左边填充补全直至它的长度达到len个字 ...
- Effective STL 学习笔记:19 ~ 20
Effective STL 学习笔记:19 ~ 20 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- 20165203 预备作业3 Linux安装及学习
一.安装虚拟机 1.下载问题:当自己在虚拟机上下载ubuntu时,总是下载好长时间,而且最后下载失败,这让我很苦恼. 解决方案:求助同学后,同学给了我一个中文版官网的网址http://cn.ubunt ...
- iOS中URL的解码和转义问题
在iOS开发中,使用NSURLConnection去请求google places api时,如果请求的url中包含中文,则返回的结果为空,URL不能被google识别.NSString *_urlS ...