当我在CMD上使用该程序时,该程序在木偶上效果很好。虽然,这是一个漫长的过程,并且对于任何非技术人员而言也很复杂。我想制作一个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();
答案 0 :(得分:0)
有多种方法可以解决此问题,并且无法将其写入单个答案。但是,我可以在nexe
和electron
上方提供一些指导。还有enclosejs
和pkg
。
在以下两种解决方案中,最重要的规则之一是不要捆绑node_modules文件夹。如果将其捆绑,铬二进制文件将不起作用。
您可以使用nexe。它将下载您的nodejs脚本并将其捆绑到一个可执行文件中。全局安装
npm i -g nexe
然后创建您的操纵up脚本。这是一个示例文件,
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文件夹和捆绑的可执行文件文件复制到客户端。
您可以使用电子版创建一个不错的GUI,并使用电子版生成器创建一个可执行文件。
PS:GUI是可选的,而不是此答案的一部分。只是为了说明如何为客户端提供可执行文件,该文件可执行的功能远不止运行浏览器。
我不会研究什么是电子及其工作原理,而是使用一个快速入门示例。如果您想获得最终代码,请check this repo。
首先克隆快速入门仓库,
git clone https://github.com/electron/electron-quick-start
然后安装木偶和电子生成器,
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并添加这些选项,以便我们可以运行Chrome二进制文件
"build": {
"extraResources": "node_modules",
"files": [
"!node_modules"
]
}
现在构建应用,
electron-builder
打开dist
文件夹,您将获得包应用程序。您可以运行并获取结果,