此 Meteor 代码使用“puppeteer 8.0.0”、“puppeteer-core 10.0.0”、puppeteer-extra 3.1.18”和“puppeteer-extra-plugin-stealth 2.7.8”,它给出了以下错误:
错误:无法在本地找到所需的浏览器(chrome)。运行
下载正确的 Chromium 版本 (884014)。npm install
尝试“npm install”无济于事。在线阅读,尝试从 package.json 依赖项中删除 "puppeteer-core": "^10.0.0" 但无济于事。
非常感谢任何帮助。谢谢
const puppeteer = require('puppeteer-extra');
const nameH = require('./NameH');
const puppeteerOptions = {
headless: true,
ignoreHTTPSErrors: true,
args: ['--no-sandbox', '--single-process', '--no-zygote', '--disable-setuid-sandbox']
}
let browser;
let pageNameH;
const init = async () => {
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
console.log('1') //>>>>>>>>>>>> Prints 1
puppeteer.use(StealthPlugin());
console.log('2') //>>>>>>>>>>>> Prints 2
browser = await puppeteer.launch(puppeteerOptions);
console.log('3') //>>>>>>>>> DID NOT PRINT <<<<<<<<<<<<<<<
pageNameH = await browser.newPage();
console.log('4')
await pageNameH.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36');
await pageNameH.setViewport({ width: 1366, height: 768 });
await pageNameH.setRequestInterception(true);
blockResources(pageNameH);
}
const blockResources = page => {
page.on('request', (req) => {
if (req.resourceType() == 'stylesheet' || req.resourceType() == 'font' || req.resourceType() == 'image') {
req.abort();
}
else {
req.continue();
}
});
}
export const abc = async (nm, loc) => {
try {
console.log('name try') //>>>>>>>>>>>> Prints "name try"
if (!(browser && pageNameH))
await init();
//use "required" nameh here
} catch (error) { // print the error <<<<<<<<<<<<<<<<<<<<<<<<<
console.log("Could not launch Puppeteer or open a new page.\n" + error);
if (browser && browser.close === 'function') await browser.close();
}
}
// included in package.json
"dependencies": {
"@babel/runtime": "^7.11.2",
"axios": "^0.21.1",
"check": "^1.0.0",
"cheerio": "^1.0.0-rc.6",
"jquery": "^3.5.1",
"meteor-node-stubs": "^1.0.1",
"nightmare": "^3.0.2",
"pending-xhr-puppeteer": "^2.3.3",
"puppeteer": "^8.0.0",
"puppeteer-core": "^10.0.0",
"puppeteer-extra": "^3.1.18",
"puppeteer-extra-plugin-adblocker": "^2.11.11",
"puppeteer-extra-plugin-block-resources": "^2.2.9",
"puppeteer-extra-plugin-stealth": "^2.7.8"
},
也许你可以尝试这个,它对我在 linux(centOS)、puppeteer(10.2.0) 上有效。
cd ./node_modules/puppeteer
npm run install
如果失败,您还可以尝试运行:
cd ./node_modules/puppeteer
npm install
这会将 chromium 下载到 ./node_modules/puppeteer/.local-chromium
通过运行此命令手动安装 chromium 来修复它。
node node_modules/puppeteer/install.js
我也有同样的问题。我检查了我的环境变量,即使 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD 设置为 false,它仍然无法工作。删除变量后(对于 mac 取消设置 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD),它起作用了。
相关依赖:
"dependencies": {
"chrome-aws-lambda": "^10.0.0",
"puppeteer-core": "^10.0.0",
},
"devDependencies": {
"puppeteer": "^10.0.0",
}
推出 Chromium:
import chromium from "chrome-aws-lambda";
const browser = await chromium.puppeteer.launch({
executablePath: await chromium.executablePath,
});
如果您在本地测试,请确保您已安装 puppeteer 作为开发依赖项。具体来说
npm install puppeteer --save-dev
https://github.com/alixaxel/chrome-aws-lambda/wiki/HOWTO:-Local-Development#workaround
这种方法使我们能够依靠 puppeteer 进行本地开发,并依靠 puppeteer-core 进行生产部署。
我也有同样的问题。对我有用的是将 Puppeteer 使用的本地 chromium 的完整路径指定为
executablePath
Puppeteer 启动选项。
类似这样的:
const launchOptions = {
// other options (headless, args, etc)
executablePath: '/home/jack/repos/my-repo/node_modules/puppeteer/.local-chromium/linux-901912/chrome-linux/chrome'
}
如另一个答案中所述,似乎引用 chromium 本地二进制文件也可以工作,但我认为这是一个更糟糕的解决方案,因为 Puppeteer 保证仅适用于 Chromium 的本地捆绑版本。
把我的答案放进去,希望它能帮助别人不要像我一样浪费整个晚上。
我正在编写一个使用 Puppeteer 的 Typescript 服务器,并且我正在使用 ESBuild 从 TS 转换为 JS。在构建步骤中,esbuild 试图将所有内容捆绑到一个文件中,但我必须指示它保留从 node_modules 导入的 Puppeteer。
我通过将
puppeteer
标记为外部来做到这一点。 请参阅此处的文档。
由于
npm i
将兼容版本的chromium下载到node_modules文件夹中,一旦我保留了此导入,它就能够在node_modules文件夹中找到Chromium。
我的构建文件如下所示:
require("esbuild").buildSync({
entryPoints: ["src/index.ts"],
outdir: "build",
bundle: true,
platform: "node",
target: "node16",
external: ["puppeteer"],
});
我用
node prod-build.js
运行它。
现在在我的代码中,我可以调用 launch!
const browser = await puppeteer.launch()
我在我的电脑上使用了已安装的版本(可能不是您要找的版本)
const browser = await puppeteer.launch({headless:false, executablePath:
'C:/Program Files/.../chrome.exe' });
您可能需要根据您的操作系统安装一些依赖项。请查看 Puppeteer 的故障排除页面了解更多详细信息。
我也遇到了这个错误,我注意到在将我的节点从 Dockerfile 更新到版本 ^16(我的 puppeteer 在容器中)后,我开始收到这样的错误。我是怎么解决的?我将节点从 Dockerfile 降级到版本 12。 希望这能解决它......
OBS:我在机器上使用Ubuntu 21.04。
编辑------
在最新版本的node中,您需要进入./node_modules/puppeteer并运行命令npm install,然后将安装正确的软件包。 我正在使用该解决方案。
如果您在 AWS SAM 中使用 puppeteer 并且依赖项中没有
puppeteer
,则可以使用 在
puppeteer-core
中安装相同的内容
node node_modules/puppeteer/install.js
要使此设置起作用,您必须在
chrome-aws-lambda
中添加 devDependencies
。
"devDependencies": {
"chrome-aws-lambda": "^10.1.0"
}
另外,在投入生产之前,请不要忘记在
template.yaml
文件中添加图层:
Layers:
- !Sub 'arn:aws:lambda:ap-south-1:764866452798:layer:chrome-aws-lambda:25'
对我来说,问题是我运行了 npm install,尽管我不应该运行。刚刚删除了 node_modules 文件夹,然后再次运行 - 现在可以工作了
puppeteer-extra
不包括chromium
。
(Chromium 是 Chrome 浏览器的无头版本)
你需要安装
puppeteer
包
npm 安装 puppeteer
或者如果您不想安装 chromium,只需简单添加
executablePath
(我假设您的系统中有 Chrome 浏览器
const CHROME_EXECUTALBE_PATH = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
const browser = await puppeteer.launch({
executablePath: CHROME_EXECUTALBE_PATH,
headless: true
});
要获取路径,请打开浏览器,输入
chrome://version/
删除
node_modules
文件夹并运行
npm install