【问题标题】:Is there any way I can execute my node js and puppeteer program with an exe file?有什么方法可以使用 exe 文件执行我的节点 js 和 puppeteer 程序?
【发布时间】:2019-06-28 16:07:46
【问题描述】:

当我在 CMD 上使用这个程序时,它在 puppeteer 上运行良好。虽然,这是一个漫长的过程,对于任何非技术人员来说也很复杂。我想制作一个 exe 文件来执行我手动执行的任务,以便在 CMD 中运行这个 node.js 文件。正如您首先看到的,我的程序将打开浏览器并转到(URL)。我想用不同的 URL 制作不同的程序。因此,如果一个人想要运行此代码,他只需单击 exe 文件,然后该软件将自动为用户执行该任务。

const puppeteer = require('puppeteer');

async function getPic() {
  const browser = await puppeteer.launch({headless: false});
  const page = await browser.newPage();
  await page.setViewport({width: 2576, height: 4134})
  await page.goto('http://absoluteindianews.com/epaper- 
  en/index.php/epaper/edition/906/delhi-edition');
for (let i=1; i<=8; i++){
  await page.click('#page_area > a > img');
  await page.waitFor(4000);

  await page.screenshot({path: 'C:/Users/biznis/Desktop/automatic 
  downloading/Puppeteer/AbsoluteIndia/Delhi/Delhi'+ i +'.png'});

  await page.waitFor(2000);
  await page.click('#cboxLoadedContent > img');

  await page.waitFor(2000);
if(i<8) {
  await page.click('#yw1 > li.next > a');
}
  await page.waitFor(2000);
};

  await page.setViewport({width: 2576, height: 4134})
  await page.goto('http://absoluteindianews.com/epaper- 
  en/index.php/epaper/edition/905/mumbai-edition');
for (let i=1; i<=8; i++){
  await page.click('#page_area > a > img');
  await page.waitFor(4000);

  await page.screenshot({path: 'C:/Users/biznis/Desktop/automatic 
  downloading/Puppeteer/AbsoluteIndia/Mumbai/Mumbai'+ i +'.png'});
  await page.waitFor(2000);
  await page.click('#cboxLoadedContent > img');

  await page.waitFor(2000);
if(i<8) {
  await page.click('#yw1 > li.next > a');
}
  await page.waitFor(2000);
};

  await page.setViewport({width: 2576, height: 4134})
  await page.goto('http://absoluteindianews.com/epaper- 
  en/index.php/epaper/edition/904/bhopal-absolute');
for (let i=1; i<=8; i++){
  await page.click('#page_area > a > img');
  await page.waitFor(4000);

  await page.screenshot({path: 'C:/Users/biznis/Desktop/automatic 
  downloading/Puppeteer/AbsoluteIndia/Bhopal/Bhopal'+ i +'.png'});
  await page.waitFor(2000);
  await page.click('#cboxLoadedContent > img');

  await page.waitFor(2000);
if(i<8) {
  await page.click('#yw1 > li.next > a');
}
  await page.waitFor(2000);
};

  await browser.close();
}

getPic();   

【问题讨论】:

  • 批处理文件也可以吗?然后您可以简单地创建一个内容为node file.js 的文件并将其命名为file.bat。否则你应该查看nexe
  • @ThomasDondorf 如果执行exe的机器没有安装puppeteer,批处理文件将不起作用?
  • @tchan 是的,没错。

标签: node.js netbeans cmd exe puppeteer


【解决方案1】:

有多种方法可以解决此问题,并且无法将它们写入单个答案。但是我可以在nexeelectron 之上提供一些指导。还有enclosejspkg

在以下两种解决方案中,最重要的规则之一是不要捆绑您的 node_modules 文件夹。如果捆绑 Chromium 二进制文件,它将无法工作。

下一个

您可以使用nexe。这会将您的 nodejs 脚本下载并捆绑到一个可执行文件中。全局安装,

npm i -g nexe

然后创建您的 puppeteer 脚本。这是一个示例文件,

const puppeteer = require("puppeteer");

async function scraper(url) {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(url);
  const title = await page.title();
  await browser.close();
  return title;
}

scraper("http://example.com").then(console.log);

现在使用捆绑它,

nexe index.js

最后将 node_modules 文件夹捆绑的可执行文件文件复制到您的客户端。

电子

您可以使用 electron 拥有一个不错的 GUI,并使用 electron-builder 创建一个可执行文件。

PS:GUI 是可选的,不是这个答案的一部分。这只是为了展示如何为您的客户端提供可执行文件,它可以做的不仅仅是运行浏览器。

我不会深入探讨什么是电子以及它是如何工作的,而是使用一个快速入门示例。如果你想得到最终代码,check this repo

首先克隆快速启动 repo,

git clone https://github.com/electron/electron-quick-start

然后安装 puppeteer 和 electron-builder,

yarn add puppeteer
npm i -g electron-builder

现在编辑main.js 并将nodeIntegration: true 添加到webPreferences

mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js'),
      nodeIntegration: true // <-- this line
    }
})

现在编辑index.html 并添加一个按钮和结果容器,

<p><button>Get Result</button><div id="result"></div></p>

编辑renderer.js 并粘贴我们在 nexe 示例中使用的示例代码。另外使用这些行,

document.querySelector("button").addEventListener("click", async function() {
  const result = await scraper("http://example.com");
  document.querySelector("#result").innerHTML = result;
});

现在打开 package.json 并添加这些选项,这样我们就可以运行 chromium 二进制文件了,

"build": {
    "extraResources": "node_modules",
    "files": [
      "!node_modules"
    ]
}

现在构建应用程序,

electron-builder

打开dist 文件夹,您将获得您的软件包应用程序。你可以运行并得到结果,

【讨论】:

  • 我很高兴它能正常工作,尽管当我在客户的电脑上运行它时,它说窗口的版本与程序不兼容,我在 windows 10 上编译了这个,我的客户有 windows 7。这有什么不同吗?如果有,可以做些什么来解决这个问题?另外,我还需要在客户的电脑上安装 puppetter 和 node.js 的另一个问题..!!
  • 1.也许您的客户有 32 位,而您打包为 64 位。在这种情况下,您需要为 32 位构建/打包。 2. 需要正确复制node_modules文件夹。它会有傀儡师。构建文件已打包 nodeJS。
  • 相信大家一定熟悉node.js和puppeteer。 await page.screenshot({path: 'C:/Users/biznis/Desktop/自动下载/Puppeteer/AbsoluteIndia/Delhi/Delhi'+ i +'.png'});此命令将屏幕截图保存到我的本地驱动器,否则此位置在我的客户端系统中不存在。他们有什么办法我可以创建目录(cd C:/Users/biznis/Desktop/automaticdownloading/Puppeteer/AbsoluteIndia/Delhi),这样我的客户就不需要手动制作相同的directrooy了..!
  • 对于这种情况,您可以保存在相对路径上。如果有理由必须将屏幕截图保存在该特定路径上?
  • 我们将每天对电子论文进行屏幕截图。为此,我将使用 date() 函数创建路径,就好像今天是 05/07/2019 所以我的屏幕截图必须保存在 \\localdisk:D\\epapername\\2019\\07\\05 和如果我明天运行这个 exe 文件,它应该会自动将屏幕截图保存在 \\localdisk:D\\epapername\\2019\\07\\06 中,为此我需要一些必须自动创建目录的东西,因为有数百个电子纸而且我不可能每天手动创建目录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-25
  • 2020-06-03
  • 2017-06-19
  • 2015-03-01
  • 1970-01-01
  • 2011-02-03
相关资源
最近更新 更多