无法遍历我构建的进入URL的URL数组,这些URL用于使用puppeteer进行子页面抓取

时间:2019-06-30 22:48:09

标签: javascript web-scraping puppeteer

我查看了“在伪造者中遍历一组URL” ,但我仍然遇到错误。我根据不同的网站尝试了几种不同的方法来做到这一点,而这是最接近工作的一种方法。

当我运行它时,它将打开主页,然后从数组中的第一个URL打开页面。然后我得到错误。我是puppeteer和电话应用程序开发的新手,所以我希望它有所帮助。

我的代码:

const puppeteer = require('puppeteer');  // live webscraping

let scrape1 = async () => {
    const browser = await puppeteer.launch({headless: false});
    const page = await browser.newPage();
    const page1 = await browser.newPage();
     let url =      'https://ws.petango.com/webservices/adoptablesearch/wsAdoptableAnimals2.aspx?species=Dog&sex=A&colnum=4&recAmount=75&detailsInPopup=Yes&authkey=rwtmnvh6fros1w6uad3t2btmh5tely62cf62s363tnsgoks4yu&css=https://www.tailshumanesociety.org/wp-content/themes/divi-child/iframe.css';  // link to page 

    await page.goto(url);
    var hrefs=[];
    const result = await page.evaluate(() => {
        let data = []; // Create an empty array that will store our data
        let elements = document.querySelectorAll('.list-animal-info-block'); // Select all Products

        var str1="https://ws.petango.com/webservices/adoptablesearch/";
        var links=document.getElementsByTagName('a'), hrefs = [];

        for (var i = 0; i<links.length; i++)
       {  
           var str2=links[i].href.slice(22,-3); 
           var wholepath=str1.concat(str2);
           hrefs.push(wholepath);
        }
        return hrefs
    });

    const urls = result;
    const idList = [];
    for (let i=0; i < urls.length; i++) {
        const url = urls[i];
        await page1.goto(url);
        await page1.evaluate();
        const animalID = await page1.evaluate(() => document.getElementById("lblID").innerHTML);
        idList.push(animalID)
        browser.close()
    }
   browser.close()
   return idList
};

scrape1().then((value) => {
    console.log(value); // Success!
});

错误是:

  

$节点d1.js   (节点:10368)UnhandledPromiseRejectionWarning:错误:预期获得| string |或|功能|作为第一个参数,但改为“未定义”。       在ExecutionContext._evaluateInternal(/Users/wrlwnd/node_modules/puppeteer/lib/ExecutionContext.js:86:13)       在ExecutionContext.evaluate(/Users/wrlwnd/node_modules/puppeteer/lib/ExecutionContext.js:48:23)       在ExecutionContext中。 (/用户/wrlwnd/node_modules/puppeteer/lib/helper.js:112:23)       在DOMWorld.evaluate(/Users/wrlwnd/node_modules/puppeteer/lib/DOMWorld.js:112:20)       在process._tickCallback(内部/进程/next_tick.js:68:7)     -异步-       在帧。 (/用户/wrlwnd/node_modules/puppeteer/lib/helper.js:111:15)       在Page.evaluate(/Users/wrlwnd/node_modules/puppeteer/lib/Page.js:782:43)       在Page。 (/用户/wrlwnd/node_modules/puppeteer/lib/helper.js:112:23)       在scrape1(/Users/wrlwnd/Desktop/d1.js:36:21)       在process._tickCallback(内部/进程/next_tick.js:68:7)   (节点:10368)UnhandledPromiseRejectionWarning:未处理的承诺被拒绝。

     

此错误是由于在没有catch块的情况下抛出异步函数而引起的,或者是由于拒绝了.catch()未处理的诺言而引起的。 (拒绝ID:2)   (节点:10368)[DEP0018] DeprecationWarning:已弃用未处理的承诺拒绝。将来,未处理的承诺拒绝将以非零退出代码终止Node.js进程。

这也向我显示了

  

是否要让应用程序“ Chromium.app”接受传入的网络连接?

拒绝或什么都不做。

我使用代码的第一部分来生成URL列表,这些URL指向单个动物的弹出窗口。这样可行。然后,我尝试遍历该列表以打开每个页面,以便抓取信息。计划使用heroku为应用程序提供API类型的JSON输入。各个动物页面是实时生成的,并且没有API,因此很难做到!谢谢!

1 个答案:

答案 0 :(得分:0)

我看到我有两个评价。所以我改变了。它运行。

等待page1.evaluate();         const animalID =等待page1.evaluate(()=> document.getElementById(“ lblID”)。innerHTML);

我仍然收到“您是否希望应用程序“ Chromium.app”接受传入的网络连接?”信息。