首页 > 解决方案 > 在 Node.js 网络应用程序上使用 Puppeteer 来进行网络抓取?

问题描述

我注意到您不能只在脚本中启动 puppeteer,它需要您连接到现有的 browserWSEndpoint。当用户单击网页上的提交按钮时,我试图从网站上抓取数据。

我查看了此处找到的帖子,但无法完全使其与任何解决方案一起使用。我知道你可以打开一个调试器浏览器并连接到它的端点,但是链接每次都会改变,这不是很方便,特别是如果它被其他人使用。

到目前为止,我的 node.js 服务器类中有这个:

var express = require('express');

var app = express();

app.use('/public', express.static('public'));
app.use('/node_modules', express.static('node_modules')); 

app.get('/', function(req, res){
    res.sendFile(__dirname + '/index.html')
});

app.listen(3000);

我尝试按照链接中的建议创建代理服务器,但没有运气。我试图运行 puppeteer 的脚本如下所示:

const puppeteer = require('puppeteer');

async function getTitle() {
  const browser = await puppeteer.connect({
    browserWSEndpoint: 'ws://127.0.0.1:9222/devtools/browser/9f0a2240-2cb7-4efa-ac3c-8ef883d36d12',
  });
  const page = await browser.newPage();
  await page.goto('http://example.com');
  const title = await page.title();
  await page.close();
  await browser.disconnect();
  return title;
}

getTitle().then(console.log);

据我所知,每次重新打开浏览器时 browserWSEndpoint 都会发生变化,这并不理想,因为除非您每次都更改源代码,否则 Web 应用程序将无法工作。另外,我什至不确定您如何找到 /devtools/browser 链接。我从搜索中找到的只是输入 chrome.exe 和一些标志,然后导航到 localhost:5200 或类似的东西。但是,我只在该页面上看到 /devtools/pages/.. 。虽然这不是我一直在寻找的解决方案。

有没有办法在动态创建的某个 web 套接字上启动 puppeteer 实例,然后在需要时让脚本连接到 puppeteer 实例?我对网络套接字很陌生,所以也许我上面链接中的解决方案之一就是我正在寻找的,但我不太明白我错过了什么。

标签: javascriptnode.jspuppeteer

解决方案


推荐阅读