【问题标题】:Data scraping problem with all same classes with puppeteer使用 puppeteer 的所有相同类的数据抓取问题
【发布时间】:2022-01-04 09:29:08
【问题描述】:

我正在尝试使用 puppeteer 从该网站https://www.bynogame.com/tr/oyunlar/knight-online/gold-bar 抓取所有价格数据。

我可以一个一个地报废价格,但是我不能获取所有的p元素,返回空数据。这是我的代码,可以一一废弃,下面的代码可以废弃所有不起作用的数据。我哪里做错了?

const puppeteer = require("puppeteer");
const gb = async () => {

    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://www.bynogame.com/tr/oyunlar/knight-online/gold-bar');

    const data = await page.$eval('body > div.container.mb-5 > div > div:nth-child(1) > div.col-md-18.order-1.order-sm-12 > div > div:nth-child(1) > div > div > div.col-md-21 > div > div.col-md-4 > div > div > div > p', el => el.textContent); //Output is true
    
    await browser.close();   
    console.log(data)
};
gb();

//Here is not work.
const data = await page.$$eval('.col-md-24 mb-2 itemDiv .itemCard .row d-flex align-items-center .col-md-21 .row d-flex align-items-center .col-md-4 .row d-flex flex-column .col .div p', obj => obj.map(p => p.textContent));

【问题讨论】:

    标签: javascript node.js web-scraping puppeteer node-modules


    【解决方案1】:

    https://www.bynogame.com/tr/oyunlar/knight-online/gold-bar 页面中没有带有.col-md-24 mb-2 itemDiv .itemCard .row d-flex align-items-center .col-md-21 .row d-flex align-items-center .col-md-4 .row d-flex flex-column .col .div p 选择器的元素。

    您可以尝试将其转到页面,然后打开控制台并运行document.querySelectorAll。 例如:

    document.querySelectorAll('.col-md-24 mb-2 itemDiv .itemCard .row d-flex align-items-center .col-md-21 .row d-flex align-items-center .col-md-4 .row d-flex flex-column .col .div p')
    

    它显示了一个空数组,这意味着没有一个 HTML 元素与给定的选择器匹配。

    你不需要这么长的选择器。当您在页面上时,您可以看到价格在<p> 标签内,类别为font-weight-bolder text-black m-0。首先,通过在控制台中查询<p>标签,类font-weight-bolder text-black m-0来检查是否有其他元素与价格共享相同的选择器。

    document.querySelectorAll('p.font-weight-bolder.text-black.m-0')
    --- Output ---
    NodeList(9) [ p.font-weight-bolder.text-black.m-0, p.font-weight-bolder.text-black.m-0, p.font-weight-bolder.text-black.m-0, p.font-weight-bolder.text-black.m-0, p.font-weight-bolder.text-black.m-0, p.font-weight-bolder.text-black.m-0, p.font-weight-bolder.text-black.m-0, p.font-weight-bolder.text-black.m-0, p.font-weight-bolder.text-black.m-0 ]
    

    通过检查输出,我发现返回的元素就是我要查找的价格。因此,我可以将正确的选择器替换为page.$$eval。最终代码将是

    const puppeteer = require("puppeteer");
    const gb = async () => {
      const browser = await puppeteer.launch();
      const page = await browser.newPage();
      await page.goto("https://www.bynogame.com/tr/oyunlar/knight-online/gold-bar");
      // Get element with <p class="font-weight-bolder text-black m-0">
      const data = await page.$$eval("p.font-weight-bolder.text-black.m-0", (obj) =>
        obj.map((p) => p.textContent)
      );
    
      await browser.close();
      console.log(data);
    };
    gb();
    
    

    【讨论】:

    • 多亏了你,我才知道我误解了这个主题。非常感谢。
    • 不客气。随意接受它作为答案:)
    • 您好,先生,又是我,抱歉打扰。现在我正在处理yesilyurtgame.com/oyun-parasi/knight-online-goldbar-gb 页面,正如你所说,在控制台document.querySelectorAll(".wrVMXhxcbytLgDqiNulo") 上运行。我在输出中看到了 11 个返回的元素,但是当我将其应用于代码时,它返回空节点列表。你能告诉我原因吗? @kampung-tech
    • 这可能是由于很多问题。例如,网络延迟、DOM 未渲染、验证码等等。我建议您关闭 headless 选项以检查发生了什么,然后为其开发解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2020-05-29
    • 1970-01-01
    相关资源
    最近更新 更多