在表中使用Puppeteer进行Web抓取

时间:2020-03-10 15:57:20

标签: javascript puppeteer

我正在尝试抓取此页面。

https://www.psacard.com/Pop/GetItemTable?headingID=172510&categoryID=20019&isPSADNA=false&pf=0&_=1583525404214

我希望能够找到PSA 9和10的成绩计数。如果我们查看页面的HTML,您会发现PSA在显示数据方面做得很差(IMO)。每个TR都是一个玩家。第一个TD是卡号。假设我要获得1号卡,在这种情况下为Kevin Garnett。

总共有四张卡,所以这些是我要显示的仅有的四张卡。

这是我的代码。

const puppeteer = require('puppeteer');


(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto("https://www.psacard.com/Pop/GetItemTable?headingID=172510&categoryID=20019&isPSADNA=false&pf=0&_=1583525404214");

  const tr = await page.evaluate(() => {
    const tds = Array.from(document.querySelectorAll('table tr'))
    return tds.map(td => td.innerHTML)
  });


    const getName = tr.map(name => {
        //const thename = Array.from(name.querySelectorAll('td.card-num'))
        console.log("\n\n"+name+"\n\n");
    })


  await browser.close();
})();

我将打印每个TR,但似乎无法深入研究这些TR。您可以看到我有一条线被注释掉了,我试图这样做但出现错误。到目前为止,我还没有动态地得到玩家的支持……我认为最简单的方法是创建一个考虑获取特定卡的功能,该操作将选择TR -> TD.card-num == 1凯文。

对此的任何帮助都会令人惊奇。

谢谢

1 个答案:

答案 0 :(得分:0)

简短的回答:您可以将其复制并粘贴到Excel中,然后完美粘贴。

长答案:如果我正确理解了这一点,则需要映射所有td元素,然后在每个td中映射每个tr。我用cheerio作为帮手。要使用puppeteer完成此操作,请执行以下操作:html = await page.content(),然后将html传递给我在下面编写的清洁器中:

 const cheerio = require("cheerio")
 const fs = require("fs");

const test  = (html) => {
//   const data = fs.readFileSync("./test.html");
//   const html = data.toString();
  const $ = cheerio.load(html);
  const array = $("tr").map((index, element)=> {
      const card_num = $(element).find(".card-num").text().trim()
      const player = $(element).find("strong").text()
      const mini_array = $(element).find("td").map((ind, elem)=> {
          const hello = $(elem).find("span").text().trim()
          return hello
      })
      return {
          card_num,
          player,
          column_nine: mini_array[13],
          column_ten: mini_array[14],
          total:mini_array[15]
      }
  })
  console.log(array[2])
}

test()

上面的代码将输出以下内容:

{
  card_num: '1',
  player: 'Kevin Garnett',
  column_nine: '1-0',
  column_ten: '0--',
  total: '100'
}