【问题标题】:Puppeteer querySelector returns nullPuppeteer querySelector 返回 null
【发布时间】:2018-11-12 19:26:07
【问题描述】:

我正在尝试使用 puppeteer 删除一些数据,但对于某些网站 querySelector 返回 null,我不知道出了什么问题。我在 stackoverflow 中找到了一些关于这个问题的答案,但没有一个有效。这是带有不起作用的示例链接的代码。

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();

    await page.goto('https://www.macys.com/shop/product/the-north-face-mens- 
    logo-half-dome-t-shirt?ID=2085687&CategoryID=30423&cm_kws=2085687');

    const textContent = await page.evaluate(() => {
    return document.querySelector('.price');
});

console.log(textContent); 

browser.close();
})();

【问题讨论】:

    标签: node.js web-scraping jquery-selectors puppeteer


    【解决方案1】:

    可能元素是通过 javascript 异步加载的,并且在您调用 .evaluate() 时仍然不在 DOM 中。

    尝试使用 puppeteer .waitForSelector 函数等待选择器

    const puppeteer = require('puppeteer');
    
    (async () => {
        const browser = await puppeteer.launch();
        const page = await browser.newPage();
    
    await page.goto('https://www.macys.com/shop/product/the-north-face-mens- 
    logo-half-dome-t-shirt?ID=2085687&CategoryID=30423&cm_kws=2085687');
    
    await page.waitForSelector('.price');
    
    const textContent = await page.evaluate(() => {
       return document.querySelector('.price');
    });
    
    console.log(textContent); 
    
    browser.close();
    })();
    

    【讨论】:

    • 感谢您的回复!我认为问题在于页面没有完全加载,但在拍摄页面快照后,结果发现我的请求被机器人检测系统阻止了。我会发布解决方案。
    【解决方案2】:

    拍摄页面快照后,我的请求被机器人检测系统阻止。这是解决方案。我们只需要传递更多数据,这样它就不会被检测为机器人。如果仍然无法正常工作,您可以查看this tutorial

    const puppeteer = require('puppeteer');
    
    // This is where we'll put the code to get around the tests.
    const preparePageForTests = async (page) => {
    
    // Pass the User-Agent Test.
    const userAgent = 'Mozilla/5.0 (X11; Linux x86_64)' +
      'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.39 Safari/537.36';
    await page.setUserAgent(userAgent);
    }
    
    
    (async () => {
      const browser = await puppeteer.launch();
      const page = await browser.newPage();
      await preparePageForTests(page);
    
     // await page.setRequestInterception(true);
     await page.goto('websiteURL');
    
     const textContent = await page.evaluate(() => {
       return {document.querySelector('yourCSSselector').textContent,
     }
     });
      console.log(textContent);
    
      browser.close();
    

    【讨论】:

    • 这给了我截图的想法,这让我发现我实际上是在错误的标签中工作
    • 谢谢。我遇到了同样的问题。只是为了说明如何使用 puppeteer 为未来的读者制作屏幕截图,我这样做了: await page.screenshot({ path: "./screenshot.jpg", type: "jpeg", fullPage: true });运行脚本后将屏幕截图保存在项目的根文件夹中。
    猜你喜欢
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 2022-10-15
    • 2020-10-24
    相关资源
    最近更新 更多