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

对于一些简单的网页,我们可以非常容易的通过Develop Tool来获取其请求报文规律,并仿照其构建报文来获取页面信息。但是,随着网页越来越复杂,许多页面是由js动态渲染生成的。要获取这类信息,则需要蜘蛛程序模拟js渲染过程,此时必须研究其js脚本才能完成信息的获取。

虽然从理论上来讲,任何浏览器能获取到的信息,我们完全可以编写爬虫来获取到。但是而这个分析过程往往并不是一个比较麻烦的过程,往往存在如下困难:

  • 逆向分析js费时费力,
  • 许多爬虫作者并不是前端工程师,效率不高
  • 开发阶段容易分析不全,使用时再改开销很大
  • 许多信息需要登陆,点击等操作才能获取到,爬虫模拟这些行为比较费劲
  • 爬虫容易被网站屏蔽

对于动态网页,一种策略是:首先通过浏览器访问目标网页,由浏览器完成解析后生成渲染后的Html文件,再由蜘蛛程序解析渲染后的Html文件。这样就非常方便的解决的前面遇到的大多数问题了。

要实现这个操作,则需要一个能与应用程序交互的类浏览器软件。网上看到的文章大多数是介绍通过phantomjs完成这一过程,不过用过它的人估计都会对它吐槽不已的,这里我这里就不一一列举了,感兴趣的朋友可以看看别人的吐槽:让人欢喜让我忧的phantomjs

后来,发现Chrome本身也是可以通过远程调试协议实现与应用程序交互的,并且功能更加强大,从此果断的切换到了Chrome,使用它作为动态网页的渲染器,本文这里对使用Chrome的优越性并不想做太多介绍,主要介绍如何使用它。

启动Chrome

要使得Chrome支持与应用程序交互,首先需要指定远程调试端口:

chrome.exe --remote-debugging-port=9222

  • 如果要指定缓存位置,可以添加启动参数:--user-data-dir=r:\cache
  • 如果要使用无GUI模式(Headless),则需要添加参数: --disable-gpu --headless

注: Headless 模式目前尚还没有正式完善,目前的情况是:

  1. --headless在Linux的Chrome59中支持,Windows 的Canary版本60以上的版本支持
  2. --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来使用它。

除此之外,常见的访问命令如下:

?

页面操作

前面的API只能做到简单的打开,关闭标签操作,我么往往还需要对页面进行更详细的操作,由于篇幅所限,本文了先介绍到这里,关于页面操作的方式,在后续文章中再做跟进一步的介绍。

时间: 2024-10-11 23:52:30

使用Chrome快速实现数据的抓取(一)的相关文章

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

些一个抓取WEB页面的数据程序比较简单,大多数语言都有相应的HTTP库,一个简单的请求响应即可,程序发送Http请求给Web服务器,服务器返回HTML文件.交互方式如下: 在使用DevProtocol驱动Chrome抓取数据时,交互过程则如下图所示: 此时Chrome在中间充当了一个代理的角色,看上去变得更加复杂了,实际上却对于我们的蜘蛛程序大有帮助.本文就简单的总结下这种方式存在如下优点. 获取动态生成的网页内容 现在很多的网页内容的内容并不是一开是就能直接通过最初的Http请求直接获取到的,

使用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数据 四

用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项目: 这是按粉丝数降序排列的用户列表 运行缺陷 作为一个有追求的程序员,当然不能因为一点小成就满足,总结一下递归实现的几个缺陷: 因为是深度优先,当整个用户图很大的时候,单机递归可能造成内存溢出从而使程序崩溃,只能在单机短时间运行.单个请求延时过长,数据下载速度太慢. 针对一段时间内访问

.NET抓取数据范例 抓取页面上所有的链接

原文发布时间为:2009-11-15 -- 来源于本人的百度文章 [由搬家工具导入] .NET抓取数据范例 抓取页面上所有的链接 前台: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD X