专栏首页醉梦轩WSL运行Chrome Headless模式

WSL运行Chrome Headless模式

前言

Google Chrome早就支持了headless模式,但一般都是在Linux上运行,而我则习惯于在WSL上开发,折腾了好久终于找到了可以在WSL上跑headless模式的方法。

以下以WSL中安装的是Ubuntu 18.04系统为例。

常见安装方法

安装依赖库

$ sudo apt install gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator3-1 libnss3 lsb-release xdg-utils

安装Chrome

$ wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
$ sudo dpkg -i google-chrome-stable_current_amd64.deb
$ which google-chrome
/usr/bin/google-chrome

使用Chrome Headless访问网页

使用 官方文档的方法打开Chrome:

$ google-chrome --headless --disable-gpu --screenshot https://www.baidu.com/

出现如下报错信息:

Failed to move to new namespace: PID namespaces supported, Network namespace supported, but failed: errno = Permission denied
Failed to generate minidump.Illegal instruction (core dumped)

使用如下命令行也不行:

$ google-chrome --no-sandbox --headless --no-gpu --disable-setuid-sandbox --screenshot http://www.baidu.com/

[0829/140949.035033:WARNING:gpu_process_host.cc(1188)] The GPU process has crashed 1 time(s)
[0829/140950.200613:WARNING:gpu_process_host.cc(1188)] The GPU process has crashed 2 time(s)
[0829/140951.306996:WARNING:gpu_process_host.cc(1188)] The GPU process has crashed 3 time(s)

增加--single-process参数后打印如下信息:

[0829/141145.431580:ERROR:browser_main_loop.cc(584)] Failed to put Xlib into threaded mode.
[0829/141146.090239:INFO:headless_shell.cc(572)] Written to file screenshot.png.

虽然看起来有报错,但是的确生成网页截图了。

screenshot.png显示如下:

看起来有两个问题:

  • 中文没有正确显示
  • 窗口大小偏小

中文显示的问题可以通过以下命令解决:

$ sudo apt install fonts-noto-cjk

修改窗口大小可以通过增加--window-size=1920,1080参数进行修改。

开启远程调试

Headless模式下一般需要通过Chrome远程调试协议进行访问。

命令行增加--remote-debugging-port=9200参数启动Chrome后,打印出以下信息:

[0829/194236.072838:ERROR:browser_main_loop.cc(584)] Failed to put Xlib into threaded mode.

DevTools listening on ws://127.0.0.1:9200/devtools/browser/18442c9f-b0ee-4149-a16b-f49622047621
[0829/194236.299565:ERROR:command_buffer_proxy_impl.cc(107)] ContextResult::kTransientFailure: Shared memory region is not valid

看起来调试端口是启动成功了。

但是在访问调试页面后,Chrome进程Crash了。

Segmentation fault (core dumped)

试了多个页面后发现,远程调试都会导致Crash,看来这条路不太好走。

使用puppeteer提供的Chrome

无意中发现,puppeteer中提供的Chrome竟然可以在WSL中开启调试端口并正常访问。

puppeteer默认下载地址的格式为:https://storage.googleapis.com/chromium-browser-snapshots/${platform}/${revision}/chrome-${revision}.zip。例如目前Linux上最新版本的URL为:https://storage.googleapis.com/chromium-browser-snapshots/Linux_x64/674921/chrome-linux.zip

也可以使用镜像网站下载,例如:https://npm.taobao.org/mirrors/chromium-browser-snapshots/

解压出来就可以直接用了。

总结

  • 安装依赖库,包括中文字体库
  • 使用puppeteer提供的Chrome版本
  • 完整的启动命令行:chrome --no-sandbox --headless --no-gpu --disable-setuid-sandbox --single-process --window-size=1920,1080 --screenshot --remote-debugging-port=9200 http://www.baidu.com/

顺便提供一下puppeteer使用的完整命令行:

chrome --disable-background-networking --enable-features=NetworkService,NetworkServiceInProcess --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-breakpad --disable-client-side-phishing-detection --disable-component-extensions-with-background-pages --disable-default-apps --disable-dev-shm-usage --disable-extensions --disable-features=site-per-process,TranslateUI,BlinkGenPropertyTrees --disable-hang-monitor --disable-ipc-flooding-protection --disable-popup-blocking --disable-prompt-on-repost --disable-renderer-backgrounding --disable-sync --force-color-profile=srgb --metrics-recording-only --no-first-run --enable-automation --password-store=basic --use-mock-keychain --headless --hide-scrollbars --mute-audio about:blank --no-sandbox --disable-setuid-sandbox --remote-debugging-port=0 --user-data-dir=/tmp/puppeteer_dev_profile-NkEdQ6

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • NGINX部署HTTPS

    nginx是一款高性能的Web服务器,可以用作反向代理和负载均衡。随着HTTPS的不断推进,越来越多的网站都开始转到HTTPS方式,HTTP仅仅作为重定向到HT...

    drunkdream
  • git回滚代码

    有时我们需要回滚git上已经提交的代码,特别是已经提交到github上的代码。可以使用如下步骤:

    drunkdream
  • git回滚代码

    drunkdream
  • 这项决定你晋升速度的技能,80%的人都忽略了

    现在的职场竞争越来越激烈,不学上一两门新技能,保持自己知识更新,很容易被年轻后辈超越。有些人选择学一门外语,有些人选择学习职场上为人处事的能力。

    叫我龙总
  • 算法练习(3)-寻找最大的不重复子串

    要求:给定1个字符串,比如ababc,要求找出“第1个最长的不重复子串”,即:"abc"

    菩提树下的杨过
  • 超给力,一键生成数据库文档-数据库表结构逆向工程

    数据库文档是我们在企业项目开发中需要交付的文档,通常需要开发人员去手工编写。编写完成后,数据库发生变更又需要手动的进行修改,从而浪费了大量的人力。并且这种文档并...

    字母哥博客
  • TF 2.1.0-rc2 发布,2020 年停止支持 Python 2

    内容一览:2020 年 1 月 1 日,Python 2 即将停止维护,正式退休。Python 3 全面登场的时刻,TensorFlow 也在悄悄改变。

    HyperAI超神经
  • Linux 下删除大量文件效率对比,看谁删的快!

    杰哥的IT之旅
  • Linux下删除大量文件

    ➜ test for i in $(seq 1 500000);do echo text >>$i.txt;done

    小小科
  • 欢迎加入 Apache IoTDB !

    IoTDB 是清华自研时间序列数据库,2014年项目启动,2018年11月18号 IoTDB 正式进入 Apache 孵化器,成为中国高校首个进入 Apache...

    Apache IoTDB

扫码关注云+社区

领取腾讯云代金券