【问题标题】:Looping through posts with puppeteer and capturing data使用 puppeteer 循环浏览帖子并捕获数据
【发布时间】:2019-12-18 22:19:10
【问题描述】:

我已在我的 facebook 市场资料中设置了 puppeteer。最终,我希望 puppeteer 打开我列出的每个项目,然后捕获名称、价格、发布日期、描述、视图的数据,然后将这些信息推送到数组中。太多的问题困扰着我。第一个是我为打开项目描述而创建的代码,目前只打开我列出的每个项目的第一个项目。如何动态更改索引号以循环遍历其他项目?这是我的代码:

const moreDataClick = async (page) => {
      let moreDataTrue = await page.evaluate(() => {
          let furtherDataButtons = document.querySelectorAll(`span[title]`);
          if(furtherDataButtons.length) {
              let furtherDataButton = furtherDataButtons[num];
              furtherDataButton.click();

              return true;
          }
          return false;
      });
      if (moreDataTrue) {
        await page.waitForSelector("button._3-9a._50zy._50-1._50z_._5upp._42ft");
        await page.waitFor(5000)
        await page.evaluate(() =>{
          document.querySelector('button._3-9a._50zy._50-1._50z_._5upp._42ft').click();            
        });
    }
    await page.waitForFunction(`document.querySelectorAll('button._3-9a._50zy._50-1._50z_._5upp._42ft').length==0`);
    }

    await scrapeInfiniteScrollItems(page, 100);

    console.log("scrolldown done...");


    let moreDataButtonCounts = await page.evaluate(() => document.querySelectorAll('span[title]').length);

    console.log("moreDataButtonsCount", moreDataButtonCounts);

    for(let i = 0; i < moreDataButtonCounts; i++) {
      await moreDataClick(page);
  }

我的第二个问题是我不确定如何捕获数据,退出项目的弹出窗口,然后移动到下一个项目并捕获它的数据等。我不确定将这段代码放在哪里来捕获数据,并且不确定如何当数据捕获不是一次全部发生时,在我的代码末尾访问数组。这是我要插入的代码:

   var facebookPostData = await page.evaluate(() => {
     var title = document.querySelector('span[data-testid="marketplace_pdp_title"]').innerText;
     var price = document.querySelector('._5_md._2iel').innerText;
     var viewed = document.querySelector('._43kf._50f8').innerText.replace(/\D+/g, '');
     var datePosted = document.querySelector('a._r3j[title]').title;
     var description = document.querySelector('p._4etw').innerText;

     var titleArray = [];

       titleArray.push({
         title: title,
         price: price,
         views: viewed,
         date: datePosted,
         desc: description
       });

     return titleArray;
     console.log(titleArray);
   })

【问题讨论】:

    标签: javascript node.js puppeteer


    【解决方案1】:

    如果我是你,我会稍微解释一下我的代码,请记住,我们不熟悉 facebook html 结构,也不知道你的代码是做什么的……所以这是一个通用的答案

    // capture all the items
    let elements = await page.$$('.item');
    // loop trough items
    for (let i = 0; i < elements.length; i++) {
    
        // if you need to capture element and/or its text inside item
        let  data_elemtn  =  await elements[i].$('.item-data');
        let  data_elemtn_text = await page.evaluate(el => el.innerText, data_elemtn);
    
        // capture and click the popup button
        let  button  =  await elements[i].$('.popup-button');
        await button.click();
    
        // wait for the popup to show up
        await page.waitForSelector('.popup-element' , {  visible: true , timeout: 0 });
    
        // capture data inside popup and close it
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 2015-03-30
      • 1970-01-01
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多