你有没有过这种时候:想抓一个电商页面的商品价格,结果用普通工具一爬,返回的全是空 div?
或者想存下某个新闻网站的整站内容,但点开源码一看,所有文字都在 JavaScript 里跑着生成,根本没写在 HTML 源文件里?
这时候你大概率会去搜“JS 渲染网页怎么爬”,然后被推荐一堆要写代码、配环境、调 Selenium 的方案——最后默默打开 Excel 手动复制。
问题不在你不会写,而在大多数场景根本不需要那么重。
比如临时查竞品首页轮播图文案、导出招聘页最新岗位列表、归档自己公司官网改版前的页面快照……这些任务,不该卡在“先搭个测试环境”这一步。
它解决的不是“百万级分布式采集”,而是“今天下午三点前,我要拿到这五个单页的标题和正文”。
能替代什么 / 能省多少钱
它不直接对标某款付费软件,而是替掉了「请外包写爬虫」或「买现成爬虫 SaaS 服务」这类开销。
现代网站不是静态 HTML,是浏览器里活生生跑出来的。
很多公司每月花 800–3000 元,找人维护一套爬 Vue/React 网站的脚本;或者订阅类似 Octoparse、ParseHub 这类可视化爬虫平台的高级版,年费动辄上千。
这个工具完全免费,MIT 协议,代码公开可查。你不用付一分钱,也不用担心哪天服务停了、账号被封、数据被上传到别人服务器。
价格直接砍到零。
更关键的是控制权:所有逻辑在你本地执行,Chrome 实例不连外部服务,截图和数据全存在你指定的路径下,比如 ./screenshots/ 或 ./exports/results.jsonl。
主要能干这几件事
- 自动等网页加载完再截图或提取内容:它背后用的是 Chrome 浏览器本身,不是模拟请求,所以 Angular、React、Vue 做的页面,它都能像真人一样点开、等动画结束、再抓数据。比如设置
waitUntil: 'networkidle2',表示等页面发起的网络请求少于两个并持续 500ms 后才开始提取。 - 一次爬多个网站还能排队不撞车:你可以设最大并发数、每两次请求间隔多久、失败重试几次——这些参数在配置里改几行数字就行,不用自己写调度逻辑。例如
concurrency: 3控制同时最多 3 个标签页,delay: 1000让每次请求间隔 1 秒,避免被反爬拦截。 - 导出结果特别省事:爬完的数据,一键存成 CSV 表格或 JSON Lines 文件,Excel 和 Python 都能直接读,不用再手动整理格式。CSV 导出时会自动处理逗号、换行符转义,JSON Lines 每行一个对象,适合用
jq或 Pandas 流式解析。 - 支持手机和平板模拟:比如你要检查某个网站在 iPhone 上显示是否正常,它能自动切换 User-Agent 和屏幕尺寸,连截图都给你存好。官方示例中
emulate-device.js直接调用device: 'iPhone X',就完成 viewport 设置、touch 事件模拟和 UA 注入。 - 用 Redis 记住哪些链接爬过了:避免重复请求同一页面,尤其适合长期运行、增量更新的场景。官方示例里就有完整 Redis 缓存配置,只需传入
cache: { type: 'redis', host: 'localhost', port: 6379 },后续相同 URL 会被自动跳过。 - 严格遵守 robots.txt 和 sitemap.xml:不会乱扫站长明确禁止的路径,也支持从网站自带的地图文件里自动发现新页面,更像个守规矩的访客。启用
respectRobotsTxt: true后,它会在请求前先 GET/robots.txt,解析 Disallow 规则;设followSitemap: true则自动请求/sitemap.xml并递归抓取其中列出的 URL。
三步上手
- 先装 Docker(Mac/Windows 直接下 Desktop 版,Linux 用 apt 或 yum 装);如果你已经会用 Node.js,也可以跳过 Docker,直接 yarn add headless-chrome–crawler 安装。注意安装过程会自动下载 Chromium 二进制文件,国内用户可提前设环境变量
PUPPETEER_DOWNLOAD_HOST=https://npmmirror.com/mirrors加速。 - 复制官方给的那段 20 行左右的 JS 示例代码,把里面的网址换成你想爬的页面,保存为 crawl.js;注意它会自动下载 Chromium,第一次运行稍慢一点。你还可以加一行
logLevel: 'debug'查看每个页面的加载耗时和资源状态。 - 终端里执行 node crawl.js,等命令行不再滚动,就说明爬完了,结果默认打印在屏幕上,按需改成写入文件就行。比如在
onSuccess回调里用fs.appendFile('output.csv', ...)追加写入,或调用exporter: 'csv'参数让框架自动输出。
项目信息
Distributed crawler powered by Headless Chrome
5.6k
Stars
403
Forks
JavaScript
MIT
你用过类似的免费工具吗?评论区聊聊,我挑几个下期专门写。



