【问题标题】:Waiting for an iframe to be opened and scraped is too slow to scrape js等待打开一个 iframe 并刮掉 js 太慢了
【发布时间】:2018-01-31 14:35:59
【问题描述】:

我正在尝试抓取使用 tr、br 和 iframe 构建的旧网站。在我开始想要从 iframe 中提取数据之前,一切进展顺利,请参阅iFrameScraping setTimeout,但点击速度太快,我无法获取数据。有没有人知道如何点击,等待内容显示并被抓取,然后继续?

  const newResult = await page.evaluate(async(resultLength) => {
    const elements = document.getElementsByClassName('class');

    for(i = 0; i < resultLength; i++) {
      const companyArray = elements[i].innerHTML.split('<br>');
      let companyStreet,
          companyPostalCode;

      // Get company name
      const memberNumber = elements[i].getElementsByTagName('a')[0].getAttribute('href').match(/[0-9]{1,5}/)[0];
      const companyName = await companyArray[0].replace(/<a[^>]*><span[^>]*><\/span>/, '').replace(/<\/a>/, '');
      const companyNumber = await companyArray[0].match(/[0-9]{6,8}/) ? companyArray[0].match(/[0-9]{6,8}/)[0] : '';

      // Get town name
      const companyTown = await companyArray[1].replace('"', '');

      // Get region name
      const companyRegion = await companyArray[2].replace(/<span[^>]*>Some text:<\/span>/, '');

      // Get phone number
      const telNumber = await elements[i].innerHTML.substring(elements[i].innerHTML.lastIndexOf('</span>')).replace('</span>', '').replace('<br>', '');


      const iFrameScraping = await setTimeout(async({elements, i}) => {
        elements[i].getElementsByTagName('a')[0].click();
        const iFrameContent = await document.getElementById('some-id').contentWindow.document.getElementById('lblAdresse').innerHTML.split('<br>');
        companyStreet = iFrameContent[0].replace('"', '');
        companyPostalCode = iFrameContent[2].replace('"', '');
      }, 2000, {elements, i});

      console.log(companyStreet, companyPostalCode)
    };
  }, pageSearchResults.length);

【问题讨论】:

    标签: javascript web-scraping async-await puppeteer


    【解决方案1】:

    一段时间后我解决了我的问题,所以我将分享我的解决方案。

    我添加以停止从评估中循环获取所有数据,因为它会很快并创建竞争条件。相反,我使用了 page.$$ 和 for...of 循环的组合。请注意,来自 es6 的 forEach 也会导致竞态条件,因为 puppeteer 不会等待它们结束继续执行。

    这是我更新代码中的示例:

     const companies = await page.$$('.repmbr_result_item');
      const companiesLinks = await page.$$('.repmbr_result_item a');
    
      for(company of companies) {
        const companyEl = await page.evaluate(el => el.innerHTML, company)
        const companyElArray = companyEl.split('<br>');
    

    【讨论】:

      猜你喜欢
      • 2010-12-28
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 2014-10-12
      相关资源
      最近更新 更多