Web Scraper(使用puppeteer)仅添加html的第一个实例

时间:2019-05-24 19:28:04

标签: javascript html node.js web-scraping

我的抓取工具仅采用第一个类/类名实例,而不采用页面上的其余实例

我尝试使用普通的for循环而不是for-each,我认为这是因为div具有唯一的类名,该类名会增加设置值。我尝试在循环中增加该值,但无济于事。

const puppeteer = require("puppeteer");

const siteUrl = "https://toronto.iabc.com/about/pic/pic-member-list/";

(async () => {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();
  await page.setViewport({ width: 1920, height: 926 });
  await page.goto(siteUrl);

  //getting details of member list

  const siteData = await page.evaluate(() => {
    const pageData = [];
    //get page elements
    const pageElms = document.querySelectorAll(
      "body > div.site-container > div.site-inner > div > main > article"
    );
    let num = 3;

    //parse data from elements
    const scraper = pageElms.forEach(element => {
      let nextPerson = (num += 2);
      const pageJson = {};
      try {
        if (nextPerson > 50) {
          return pageData;
        }
        pageJson.name = element.querySelector(
          `body > div.site-container > div.site-inner > div > main > article > div > div:nth-child(${nextPerson}) > div:nth-child(1) > div`
        ).innerText;

        scraper();
      } catch (err) {
        console.log(err);
      }
      pageData.push(pageJson);
      console.log(pageData);
    });
    return pageData;
  });
  console.dir(siteData);
})();

最后,我应该可以通过一些调整从列表中抓取每个人,以指定我要抓取的选择器。

1 个答案:

答案 0 :(得分:0)

您共享的页面中只有一个文章标签。因此,在这里,循环实际上没有任何意义。我也建议您在问题中加入标记。

如果您将初始选择器更改为以下内容,则我将信息定位到其中的行

 const pageElms = document.querySelectorAll(
      "body > div.site-container > div.site-inner > div > main > article > div > div.su-row"
    );

并使用

 pageJson.name = element.innerText;

您不需要生成nextPerson,将抓取所有数据