[技巧] chrome headless 爬虫抓取websoket 数据

目录

  • 源起
  • 分析
  • 实践
  • 总结

源起

周末答应了一个朋友帮他看一下一个网站应该怎么爬,费话不说直接先上网站
https://datacenter.jin10.com/price
《[技巧] chrome headless 爬虫抓取websoket 数据》

数据一直在不停的闪,直觉判断这种高频的显示应该不会用ajax 轮询的方式,至少也是websocket的方式

分析

老规矩,直接上chrome 的f12来分析看看
《[技巧] chrome headless 爬虫抓取websoket 数据》

直接看到,右边正边疯狂的刷新数据,而使用的协议,正是websocket ,对于python下如何连接websocket ,网上有很多的文章,我这里就不用细说了,通常我们拿到这样的接口,都会本能去尝试直连看看,在进一步尝试之后,发现他们的api应该有一种特别的方式(又或者我的代码有写错的地方)

在运行程序之后毫无效果,另外端口的api会根据真实的请求变化 ,而且进一步的请求的cookie和key都会变化 ,看来直连的方式是行不通了,那没办法,只能走渲染的路了,selenium ? 可以是可以,不过我们要尝试一下新的路线和方法,那就直接上chrome-headless

实践

Headless Chrome指在headless模式下运行谷歌浏览器(以程序模式运行,没有界面),自从这玩意儿出来之后, phantomjs的作者就宣布甩锅不维护了(人家也确实辛苦,没啥收益),可以说是一个非常好的工具了,咱们说干就干

安装

直接使用docker 来安装chrome headless

环境

  • python 3.6
  • ubuntu16.04

编码

这样我们已经启用了一个chrome headless的服务,那如何使用呢,我们使用websocket 和chrome header less进行交互,不多说了,直接上代码吧

整体逻辑非常简单,打开指定页面,等待页面数据刷新,然后直接偷懒拿数据渲染之后的页面值,运行效果如下:
《[技巧] chrome headless 爬虫抓取websoket 数据》
其中的0 是因为页面还在渲染之中,所以数据还没有正式的出现在前台界面上

总结

本次主要使用了chrome-headless的相关渲染环境来解决了我们抓取数据的问题,并且使用了websocket api 来进一步操作,其实google 官方有sdk进行操作,https://github.com/GoogleChrome/puppeteer ,渲染的终究不是高效的做法,但是对于这种单页面目的性很强的数据,可以尝试渲染大法

点赞
  1. 001说道:

    frame = ABNF.create_frame("2probe", ABNF.OPCODE_TEXT),这里这两个参数分别什么意思啊 源码中的解释没太看懂

    1. bruce说道:

      类似的先给websocket 传输数据,然后数据的内容是这个,在尝试模拟数据交换的过程

  2. kk说道:

    用websocket不能爬取么

  3. 小白说道:

    大佬,r = requests.get('http://10.10.2.42:9222/json')这一步的docker里面已经对https://datacenter.jin10.com/price封装处理过了吧?如果我想处理别的网站还需要进入docker处理吗?

  4. 小白说道:

    大佬,r = requests.get('http://10.10.2.42:9222/json')这一步的docker里面已经对https://datacenter.jin10.com/price封装处理过了吧?如果我想处理别的网站还需要进入docker处理吗?

    1. bruce说道:

      相当于渲染的过程就是在里面了,请求和处理过程都是他了,不知道你说的处理别的网站是个啥意思啊?

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据