Puppeteer page.evaluate 在解析网站时随机停止工作

Pupateer page.evaluate randomly stopped work when parsing website

大约 3 周前,我为选项警报创建了一个 webparser,一切顺利,截至今天,我检查了它,由于某种原因它返回空值,我想也许网站重新设计了,但没有什么不同,我在过去的几个小时里一直在尝试许多修复,所以希望我能得到一些帮助,下面是我用来对网站进行 parising 的代码:

const browser = await puppeteer.launch({
        args: ['--no-sandbox',
        '--disable-setuid-sandbox',
        '--disable-dev-shm-usage',
        '--disable-accelerated-2d-canvas',
        '--no-first-run',
        '--no-zygote',
        '--single-process', 
        '--disable-gpu'],
        dumpio: true,
        headless: true
      });
      const page = await browser.newPage();
      await page.goto(process.env.ALERTS_PARSER_WEBSITE);
      // page.on("console", msg => console.log("PAGE LOG:", msg));


      const data = await page.evaluate(() =>
        Array.from(document.querySelectorAll("table > tbody > tr"), (row) =>
          Array.from(row.querySelectorAll("th, td"), (cell) => cell.innerText)
        )
      );

然后我将数据映射到我自己的数组中并传回我的前端,我试图从中解析的网站是 Bar Chart Unusual Options Activity。您可以在那里检查该站点,看看查询选择器应该可以工作,我真的是在这方面的最后一站,所以非常感谢任何帮助。

不确定是什么原因,但我设法仅使用 puppeteer.launch({ headless: false });

获取数据
page.setDefaultTimeout(300_000);
// ...
await page.waitForSelector("table > tbody > tr");

(最后一个可能只在像我这样的慢速机器上需要)。

也许站点开始使用一些针对无头模式的保护。

P.S。当我尝试在无头模式下获取页面截图时,我立即得到:

P.P.S。目前看来解决方案很简单。由于 response.request().redirectChain() 为空,站点仅在第一个请求中检查用户代理 header。所以这似乎解决了无头模式的问题(可以通过比较两种模式下的 await browser.userAgent() 值来推断差异):

  await page.setUserAgent((await browser.userAgent()).replace('HeadlessChrome', 'Chrome'));

  await page.goto('https://www.barchart.com/options/unusual-activity/stocks?orderBy=tradeTime&orderDir=desc');