【问题标题】:Can't let my script keep on clicking until there is none left不能让我的脚本继续点击,直到没有剩余
【发布时间】:2019-06-18 15:29:45
【问题描述】:

我在node 中结合puppeteer 编写了一个脚本,以刮取遍历website 中多个页面的不同机构的名称。

我的以下脚本可以从登录页面解析机构名称,然后在解析其他页面的名称时启动几次点击,最后在执行过程中的某个时刻遇到错误。

the error:  TypeError: Cannot read property 'click' of undefined
    at main (c:\Users\WCS\Desktop\Node vault\comments.js:18:25)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:118:7)

我使用了硬编码的for loop,因为我真的不知道让脚本继续单击下一页按钮,直到没有留下任何东西。我希望遵守任何逻辑,以便我的脚本首先查找下一页按钮。如果它找到一个,那么它将单击该按钮并重复该过程。

我试过了:

const puppeteer = require('puppeteer');
const link = "https://www.incometaxindia.gov.in/Pages/utilities/exempted-institutions.aspx";

(async function main() {
  try {
    const browser = await puppeteer.launch({headless:false});
    const [page]    = await browser.pages();
    await page.goto(link);
    await page.waitForSelector("h1.faqsno-heading");

    for(let i = 1; i < 20; i++){
      const sections = await page.$$("h1.faqsno-heading");
      for (const section of sections) {
          const itemName = await section.$eval("div[id^='arrowex']", el => el.innerText);
          console.log(itemName);
      }
      const nextPage = await page.$$(".ms-paging > a");
      await nextPage[i].click();
      await page.waitForNavigation({waituntil:'networkidle0'});
    }

    await browser.close();
  } catch (e) {
    console.log('the error: ', e);
  }
})();

顺便说一句,为了避免重复这篇文章,我必须承认我遇到过this post,但我认为我自己无法在我的脚本中实现逻辑。

【问题讨论】:

    标签: node.js web-scraping puppeteer


    【解决方案1】:
    • 解决方案 - 简单的方法

    替换此代码

          const nextPage = await page.$$(".ms-paging > a");
          await nextPage[i].click();
          await page.waitForNavigation({waituntil:'networkidle0'}); 
    

    有了这个

          await page.click("[title='Next Page']")
          await page.waitForNavigation({waituntil:'networkidle0'})
    
    • 解决方案 - 你的方式(愚蠢的数学!)。当您继续点击时重新调整索引,因为您的页面索引会发生变化,但它始终是 0-5。
    const puppeteer = require('puppeteer');
    const link = "https://www.incometaxindia.gov.in/Pages/utilities/exempted-institutions.aspx";
    
    (async function main() {
      try {
        const browser = await puppeteer.launch({headless:false});
        const [page]    = await browser.pages();
        await page.goto(link);
        await page.waitForSelector("h1.faqsno-heading");
         let j=0;
         let NoOfPage=9  // adjust here to get number of pages
        for(let i = 0; j<NoOfPage+1; i++,j++){
            if (j>4) {
                i=4;
            }
          if (i>0) {
          await page.waitForSelector("h1.faqsno-heading",{visible:true});
          const sections = await page.$$("h1.faqsno-heading");
    
           for (const section of sections) {
              const itemName = await section.$eval("div[id^='arrowex']", el => el.innerText);
              console.log(itemName);
    
          }
    
          }
    
          const nextPage= await page.$$(".ms-paging > a");
          await Promise.all([
          await nextPage[i].click(),
          await page.waitForNavigation({waituntil:'networkidle0'}),
    ])
    
    
        }
    
        await browser.close();
      } catch (e) {
        console.log('the error: ', e);
      }
    })();
    
    • 第 19 页左右的一些输出
    C:\NodeJS\PuppeteerTest\Pup>node stack56652523.js
    ....
    ....
    HAPPY PUBLIC SCHOOL SAMITI
    AABAH3894H
    SAGRADA FAMILIA SOCIETY, SOUTH GOA
    AAWAS5165K
    K V DEVADIGA CHARITABLE TRUST, DAKSHINA KANNADA
    AADTK1517B
    SHRINE OF INFANT JESUS, CHICKMAGLUR
    AAVTS1925P
    SRI NANDI VEDACURU CHARITABLE, TRUST
    AATTS1842D
    SHREE SUBRAHMANYA VANGMAYEE PARISHAD, GOA
    AAPTS2410M
    SHREE SUBRAHMANYA VANGMAYEE PARISHAD, GOA
    AAPTS2410M
    WORD FOR THE WORLD FELLOWSHIP
    AAAAW6295Q
    JANA SEVA TRUST
    AACTJ0594Q
    VAGDEVI VILAS EDUCATIONAL AND CHARITABLE TRUST
    AABTV8264G
    

    【讨论】:

    • 如果[title='Next Page'] 在第 19 页上不存在,这应该会引发 超时 错误。
    • 一万多页。他的代码试用版长达 20 页。当然,他可以找出最终的场景 LOL
    • 是的。好吧,只要它对开发人员有所帮助。 :)
    • 我刚刚知道您是 Stack Overflow 的出色贡献者。感谢您帮助社区。 Bhaloo thaken!
    【解决方案2】:

    您尝试过简单的if 条件吗?

    const nextPage = await page.$$(".ms-paging > a");
    
    if(nextPage && nextPage[i]){
      await nextPage[i].click();
      await page.waitForNavigation({waituntil:'networkidle0'});
    }
    

    这样只有在有按钮时才会点击。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 2019-07-30
      • 1970-01-01
      • 2015-08-26
      • 1970-01-01
      相关资源
      最近更新 更多