jsdom
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