Qro*_*aki 3 javascript web-scraping puppeteer
我正在创建一个 Web api,它可以抓取给定的 url 并将其发回。我正在使用 Puppeteer 来做到这一点。我问了这个问题:Puppeteer 的行为不像开发者控制台
并收到一个答案,表明只有当 headless 设置为 false 时它才有效。我不想不断打开我不需要的浏览器用户界面(我只需要数据!),所以我正在寻找为什么 headless 必须为 false,我可以得到一个修复程序,让 headless = true 。
这是我的代码:
express()
.get("/*", (req, res) => {
global.notBaseURL = req.params[0];
(async () => {
const browser = await puppet.launch({ headless: false }); // Line of Interest
const page = await browser.newPage();
console.log(req.params[0]);
await page.goto(req.params[0], { waitUntil: "networkidle2" }); //this is the url
title = await page.$eval("title", (el) => el.innerText);
browser.close();
res.send({
title: title,
});
})();
})
.listen(PORT, () => console.log(`Listening on ${PORT}`));
Run Code Online (Sandbox Code Playgroud)
它可能在 UI 模式下工作但不能在无头模式下工作的原因是,积极反对抓取的网站会检测到您正在无头浏览器中运行。
一些可能的解决方法:
puppeteer-extra在这里找到: https: //github.com/berstend/puppeteer-extra 查看他们的文档以了解如何使用它。它有几个插件可能有助于通过无头模式检测:
puppeteer-extra-plugin-anonymize-ua-- 匿名化您的用户代理。请注意,这可能有助于通过无头模式检测,但正如您在访问https://amiunique.org/时所看到的那样,这不太可能足以阻止您被识别为重复访问者。puppeteer-extra-plugin-stealth——这可能有助于赢得猫捉老鼠的游戏,避免被检测为无头。有很多技巧可以用来检测无头模式,也有很多技巧可以逃避它们。可以通过将 puppeteer 附加到正在运行的实例的方式来运行单个浏览器 UI。这是一篇解释它的文章:https://medium.com/@jaredpotter1/connecting-puppeteer-to-existing-chrome-window-8a10828149e0
本质上,您是从命令行--remote-debugging-port=9222(或任何旧端口?)加上其他命令行开关启动 Chrome 或 Chromium(或 Edge?),具体取决于您运行的环境。然后您使用 puppeteer 连接到正在运行的操作系统实例,而不是让它执行启动无头 Chromium 实例的默认行为:const browser = await puppeteer.connect({ browserURL: ENDPOINT_URL });。请阅读此处的 puppeteer 文档以获取更多信息:https://pptr.dev/#? product=Puppeteer&version=v5.2.1&show=api-puppeteerlaunchoptions
当您使用该ENDPOINT_URL选项从命令行启动浏览器时,会显示在终端中--remote-debugging-port=9222。
这个选项需要一些服务器/操作魔力,所以准备好进行更多的 Stack Overflow 搜索。:-)
我确信还有其他策略,但这是我最熟悉的两种策略。祝你好运!