有什么办法可以用 exe 文件执行我的 node js 和 puppeteer 程序吗?
Is there any way I can execute my node js and puppeteer program with an exe file?
当我在 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();
有多种方法可以解决这个问题,将它们写成一个答案是不可能的。但是我可以在 nexe
和 electron
之上提供一些指导。还有enclosejs
和pkg
。
在下面的两种解决方案中,最重要的规则之一是不要捆绑您的 node_modules 文件夹。如果您捆绑 Chromium 二进制文件,它将无法工作。
Nexe
您可以使用 nexe。这将下载您的 nodejs 脚本并将其捆绑到一个可执行文件中。全局安装,
npm i -g nexe
然后创建您的人偶脚本。这是一个示例文件,
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.
首先克隆快速启动仓库,
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
文件夹,您将获得应用程序包。你可以运行得到结果,
当我在 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();
有多种方法可以解决这个问题,将它们写成一个答案是不可能的。但是我可以在 nexe
和 electron
之上提供一些指导。还有enclosejs
和pkg
。
在下面的两种解决方案中,最重要的规则之一是不要捆绑您的 node_modules 文件夹。如果您捆绑 Chromium 二进制文件,它将无法工作。
Nexe
您可以使用 nexe。这将下载您的 nodejs 脚本并将其捆绑到一个可执行文件中。全局安装,
npm i -g nexe
然后创建您的人偶脚本。这是一个示例文件,
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.
首先克隆快速启动仓库,
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
文件夹,您将获得应用程序包。你可以运行得到结果,