jsdom

@hehe

jsdom

是什么

实现了 DOM/HTML 标准(部分)的 JS 库,可以用在一些需要模拟浏览器环境的场景里。

场景举例:测试(jest, vue-loader)、爬虫

起因

看一下抖音网页上的数据,接口签名的代码有做一些混淆,不是太好剥。

换个思路。

由于普通解析 html 的 node 库(cheerio)不具备执行 script 的能力,对于页面数据来自脚本执行结果的场景,并不实用,只能用类浏览器的方案。

但是 puppeteer 太重,需要完整的浏览器环境(~170MB Mac, ~282MB Linux, ~280MB Win),对于看数据需求的后续扩展来看,并不理想。(puppeteer 的好处是:这是的浏览器)

实际上,不用去猜他的签名算法,直接调他的方法就行了,用 jsdom 试试看。

const { JSDOM } = require('jsdom')

const url = 'https://www.iesdouyin.com/share/user/__your_user_id__'
const { window } = await JSDOM.fromURL(url, {
  runScripts: 'dangerously', // 执行 script
  resources: 'usable', // 加载资源
})

/**
 * 抖音使用 modjs (没见过) 做模块化,也就是下面的 __M.require('...')
 * byted-acrawler.sign 使用了 canvas 等奇技淫巧,需要另外安装 [canvas 依赖](https://github.com/Automattic/node-canvas)
 */
const _signature = window.__M
  .require('douyin_falcon:node_modules/byted-acrawler/dist/runtime')
  .sign(__your_user_id__)

看看

没空

例如 lib/jsdom/living/xhr