Browser 命令行无头浏览器

Browser 命令行无头浏览器,browser,command-line,headless,headless-browser,Browser,Command Line,Headless,Headless Browser,我正在寻找一个命令行选项来获取网页,并执行相关的JavaScript代码。换句话说,通过命令行调用无头浏览器 我无法使用wget,它不会加载和执行关联的JavaScript: wget --load-cookies cookies.txt -O /dev/null https://example.com/update?run=1 用例:我们的网页可以读取elastisearch索引,执行一些数据操作,并更新elastisearch索引。我们希望通过cron作业每小时更新一次。我们不需要捕获任何

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

我无法使用wget,它不会加载和执行关联的JavaScript:

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

我搜索了stackoverflow,没有找到任何满足我需要的答案。硒等似乎有点过头了:

  • -这看起来很有趣,但docker似乎有点过头了

经过一些研究,我找到了一个使用木偶无头浏览器的解决方案。理想情况下,我只需要一个命令,比如
runheadlesshttps://example.com/update
,但需要登录,因此使用Puppeter驱动无头浏览器

CentOS 7.6的安装步骤:

1。安装chrome

# 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。Patch/etc/sysctl.conf

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

# echo "user.max_user_namespaces=15000" >> /etc/sysctl.conf
# reboot
4。创建run-hourly.js puppeter脚本

此节点脚本必须作为普通用户而不是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

抱歉,StackOverflow致力于帮助解决编程代码问题。对工具建议的请求显然与主题无关。您的Q可能更适合于,但请阅读他们关于主题问题的帮助部分。在这里发布更多Qs之前,请阅读和。祝你好运。我阅读了规则,并用我尝试过的方法更新了问题,还有相关的stackoverflow问题,这些问题都有答案(对我的用例没有帮助),IRT的主题是“程序员常用的软件工具;这是一个软件开发特有的实用、可回答的问题”。我认为
wget
selenium
等是错误的吗?如果其他人乐意回答你的问题,那么我为你感到高兴。你的编辑并没有真正的帮助,因为你应该只使用链接将它们作为资源定位,而你的Q的主体应该包含这些链接中的相关想法。读者不必阅读大量其他页面来理解您的编码问题。如果你得到答案,MHO会为你高兴的。祝你好运