【问题标题】:Command line headless browser命令行无头浏览器
【发布时间】:2020-11-26 04:06:21
【问题描述】:

我正在寻找一个命令行选项来获取网页并执行相关的 JavaScript 代码。也就是说,通过命令行调用无头浏览器。

我不能使用 wget,它没有加载和执行相关的 JavaScript:

wget --load-cookies cookies.txt -O /dev/null https://example.com/update?run=1

用例:我们的网页可以读取 elastisearch 索引、进行一些数据操作和更新 elastisearch 索引。我们希望通过 cron 作业每小时更新一次。我们不需要捕获任何东西,例如没有 png 捕获,没有 HTML 捕获。我们只需要加载网页并通过 cron 作业执行其 JavaScript,理想情况下类似于 run-headless https://example.com/update。操作系统是 CentOS 7。

我搜索了 stackoverflow 并没有找到任何满足我需求的答案。 selenium 等似乎有点矫枉过正:

【问题讨论】:

  • 抱歉,StackOverflow 致力于帮助解决编程代码问题。对工具的推荐请求显然是题外话。您的 Q 可能更适合 Software Recommendations,但请阅读他们关于主题问题的帮助部分。并且请阅读Help On-topicHelp How-to-ask,然后再在这里发布更多问题。祝你好运。
  • 我阅读了规则,并根据我的尝试更新了问题,以及相关的 stackoverflow 问题有答案(对我的用例没有帮助)
  • 另外,IRT on-topic,“程序员常用的软件工具;并且是软件开发独有的实用、可回答的问题”。假设wgetselenium 等是我错了吗?
  • 如果其他人乐意回答您的问题,那么我也为您感到高兴。您的编辑并没有真正的帮助,因为您应该只使用链接将它们作为资源进行定位,并且 Q 的正文应该包含来自这些链接的相关想法。读者不必查看许多其他页面即可理解您的编码问题。再次,如果您得到答案,MHO 将为您感到高兴。祝你好运。

标签: browser command-line headless headless-browser


【解决方案1】:

经过一番研究,我找到了使用 puppeteer 无头浏览器的解决方案。理想情况下,我想要一个像 run-headless https://example.com/update 这样的命令,但需要登录,因此使用 puppeteer 驱动无头浏览器。

CentOS 7.6 的安装步骤:

1.安装铬

# cd
# mkdir install
# cd install/
# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/vulkan-filesystem-1.1.97.0-1.el7.noarch.rpm
# yum localinstall vulkan-filesystem-1.1.97.0-1.el7.noarch.rpm
# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/vulkan-1.1.97.0-1.el7.x86_64.rpm
# yum localinstall vulkan-1.1.97.0-1.el7.x86_64.rpm
# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/liberation-fonts-1.07.2-16.el7.noarch.rpm
# yum localinstall liberation-fonts-1.07.2-16.el7.noarch.rpm
# vi /etc/yum.repos.d/google-chrome.repo
# cat /etc/yum.repos.d/google-chrome.repo
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/x86_64
enabled=1
gpgcheck=1
gpgkey=https://dl.google.com/linux/linux_signing_key.pub
# yum install google-chrome-stable

2。安装 node.js

# curl -sL https://rpm.nodesource.com/setup_14.x | sudo bash -
# yum install nodejs

3.补丁/etc/sysctl.conf

这是在不禁用沙箱的情况下运行 puppeteer 所必需的:

# echo "user.max_user_namespaces=15000" >> /etc/sysctl.conf
# reboot

4.创建 run-hourly.js puppeteer 脚本

此节点脚本必须以普通用户身份运行,而不是 root:

$ cd /path/to/script
$ npm install --save puppeteer
$ npm install --save pending-xhr-puppeteer
$ mkdir userDataDir
$ vi run-hourly.js # (content below)
$ node run-hourly.js

run-hourly.js脚本的文件内容:

const config = {
    userDataDir: __dirname + '/userDataDir',
    login: {
        url:        'https://www.example.com/login/',
        username:   'foobar',
        password:   'secret',
    },
    pages: [{
        url:        'https://www.example.com/update/hourly',
        pdfFile:    __dirname + '/page.pdf'
    }]
};

const puppeteer = require('puppeteer');
const { PendingXHR } = require('pending-xhr-puppeteer');

(async() => {
    // initialize headless browser
    const browser = await puppeteer.launch({
        headless:       true,   // run headless
        dumpio:         true,   // capture console log to stdout
        userDataDir:    config.userDataDir // custom user data
    });
    const page = await browser.newPage();
    const pendingXHR = new PendingXHR(page);

    // login
    await page.goto(config.login.url, {waitUntil: 'load'});
    await page.type('#loginusername', config.login.username);
    await page.type('#password', config.login.password);
    await page.click('#signin');
    await page.waitForNavigation();

    // load pages of interest
    await Promise.all(config.pages.map(async (pageCfg) => {
        await page.goto(pageCfg.url, {waitUntil: 'networkidle0'}); // wait for page load
        await page.setRequestInterception(true);  // intercept requests for next line
        await pendingXHR.waitForAllXhrFinished(); // wait for all requests to finish
        await page.pdf({path: pageCfg.pdfFile});  // generate PDF from rendered page
    }));

    await browser.close();
})();

5.将每小时作业添加到 cron

以与脚本所有者相同的用户身份安装 cron 作业

$ crontab -l
$ crontab -e
25 * * * * cd /path/to/script && node run-hourly.js > hourly.log 2>&1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多