page.evaluate在使用谷歌云功能抓取时不返回响应


  • Puppeter版本:9.0.0
  • 平台/OS版本:谷歌云功能
  • Node.js版本:14
const puppeteer = require('puppeteer')
exports.MyFunc = function MyFunc(req, res) {
  MyFunc(req, res);
  async function MyFunc(req, res) {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await getSearchResults();
    
     async function getSearchResults() {
      const url = `https://abc.redacted.com/search?q=${query}&f=&orderBy=${sort_by}&skip=0&take=10`;
      console.log(url);
      await page.goto(url, { waitUntil: "domcontentloaded" });
      console.log("Page downloaded"); // It console logs till here
      const getResults =  await page.evaluate(() => {
      let items = [];
      const results = document.querySelectorAll(
        "#mainArea > router-view > ma-serp > div > div.results > div > compose > div > div.results > ma-card"
      );
      console.log(results);
      for (let result of results) {
        console.log(result.querySelector("span")?.innerText ?? "");
        items.push({ title: result.querySelector("span")?.innerText ?? "", })
      };
      return items;
      });
      const data = getResults;
      res.status(200).json(data);  // just getting {}
      await browser.close();
      }
  }
}

IDK why,但page.evaluate()不控制台记录任何内容,也不向节点环境返回任何内容。三天以来,我一直在尝试不同的解决方案来解决堆栈溢出和GitHub问题,但直到现在都没有成功。

  • page.evaluate返回时,我也尝试过promise.resolve(),但也不起作用

运行page.evaluate()时,实际上是在浏览器上下文中操作,而不是在Node中操作。因此console.log输出到浏览器上下文,您将不会在Node控制台中看到任何内容。

以下是将浏览器上下文输出到节点控制台的解决方法:

const page = await browser.newPage();
page.on('console', consoleObj => console.log(consoleObj.text()));

参考:页面内的Puppeter日志。评估

最新更新