ferret 爬取动态网页

pardon110
动态网页常用js来加载数据,使用声明式语言fql,可轻松获取点击,下拉等一系列需要交互后渲染的页面数据。
够浪的ferret足够简单, 让会sql,了解css,知道点go的同学,很方便的用编码或命令行形式抓取动态网页内容。

selenium

selenium真心好用,但太重。夸它好用,是因为不像scray一个页面情况没考虑到,它就给挂了,给定目标网站用户让怎么跑就怎么干。说它重是因为耗资源,若仅作爬虫抓取,为什么要开一个浏览器,又不是真要用界面。

cdp

chrome debug protocol 谷歌浏览器调试协议,简称cdp

用过chrome浏览器的F12,也就是devtools,其实这是一个web应用。当你使用devtools的时候,浏览器本身会作为一个服务端,而你看到的浏览器调试工具界面,其实只是一个前端应用,在这中间通信的,就是基于websocket的cdp,一个让devtools和浏览器内核交换数据的通道。

selenium -> webdriver -> chromedriver  -> cdp --> fql
  • cdp获取页面网络数据
  • 用cdp获取页面加载时间
  • 用cdp拿到自动化测试后的js覆盖率数据并展示
  • 通过远程机器调试无头浏览器

fql

ferret特定领域的声明式编程语言fql,简单直观。
输入关键字 --> 点击搜索按钮 --> 用css 选择器选择节点 --> 迭代处理内容 --> 返回内容

// baidu.fql

LET bd = DOCUMENT("https://www.baidu.com/", {
    driver: "cdp",
    userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36"
})
// 交互操作
INPUT(bd, 'input[name="wd"]', @wd)
CLICK(bd, '#su')
WAIT(RAND(1000))

FOR result IN ELEMENTS(bd, '#content_left')
    LIMIT 3
    LET title = INNER_TEXT(result, 'h3')
    LET description = INNER_TEXT(result, 'div.c-abstract')
    RETURN {  title, description }

上述 @wd 为输入型参数,同sql中的位置参数一个道理。
{ title, description } 是fql语法的一个特定,同es6中的对象解构赋值
RETURN 关键字在fql与php,python 中的生成器 yield一样的意义,只是带值返回,可以重新返场

usage

  1. 安装ferret,建议使用go1.13以上版本,开启国内镜像代理,当然你本机也得装chrome浏览器
go get github.com/MontFerret/ferret
  1. 开启chrome的cdp服务实例,记住使用无头模式
chrome.exe --remote-debugging-port=9222 --headless
  1. 导入baidu.fql,ferret使用的默认端口是9222
D:\code-base>ferret --param=wd:\"golang社区\"  >> baidu.txt
  1. 打开查看结果,类似于下面这样的格式
[{"description":"Go语言中文网,中国 Golang 社区,Go语言学习园地,致力于构建完善的 Golang 中文社区,Go语言爱好者的学习家园。分享 Go 语言知识,交流使用经验","title":"首页- Go语言中文网 - Golang中文社区"}]

other

ferret 目前还处于开发阶段,但其不仅仅这些,比如cookie,快照截图,图片下载,代理等等新功能已经处于测试。目前版本是v0.9.0, 稳定版本很快发布。上面示例仅展示了命令行形式,事实上它还可以嵌入到golang编码,产生各种好玩的用法。

阅读 1.5k
556 声望
3 粉丝
0 条评论
556 声望
3 粉丝
文章目录
宣传栏