Невозможно перебрать массив URL-адресов, которые я создал, чтобы перейти на подстраницы для очистки с помощью puppeteer - PullRequest
0 голосов
/ 01 июля 2019

Я посмотрел на "Цикл по набору URL в Puppeteer" и использовал это, но я все еще получаю ошибки. Я попробовал несколько разных способов сделать это на разных сайтах, и это был тот, который ближе всего подошел к работе.

Когда я запускаю его, он открывает главную страницу, а затем открывает страницу с первого 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 | или | функция | в качестве первого аргумента, но вместо этого получил «неопределенный». at ExecutionContext._evaluateInternal (/Users/wrlwnd/node_modules/puppeteer/lib/ExecutionContext.js:86:13) at ExecutionContext.evaluate (/Users/wrlwnd/node_modules/puppeteer/lib/ExecutionContext.js:48:23) в ExecutionContext. (/Users/wrlwnd/node_modules/puppeteer/lib/helper.js:112:23) на DOMWorld.evaluate (/Users/wrlwnd/node_modules/puppeteer/lib/DOMWorld.js:112:20) at process._tickCallback (internal / process / next_tick.js: 68: 7) - ASYNC - в кадре. (/Users/wrlwnd/node_modules/puppeteer/lib/helper.js:111:15) на странице Page.evaluate (/Users/wrlwnd/node_modules/puppeteer/lib/Page.js:782:43) на странице. (/Users/wrlwnd/node_modules/puppeteer/lib/helper.js:112:23) на scrape1 (/Users/wrlwnd/Desktop/d1.js:36:21) at process._tickCallback (internal / process / next_tick.js: 68: 7) (узел: 10368) UnhandledPromiseRejectionWarning: необработанное отклонение обещания.

Эта ошибка возникла либо в результате выброса внутри асинхронной функции без блока catch, либо в результате отклонения обещания, которое не было обработано с помощью .catch (). (идентификатор отклонения: 2) (узел: 10368) [DEP0018] Предупреждение об устаревании: отклонение необработанного обещания устарело. В будущем отклонения обещаний, которые не обрабатываются, завершат процесс Node.js с ненулевым кодом выхода.

Это также показывает мне это:

Хотите ли вы, чтобы приложение «Chromium.app» принимало входящие сетевые подключения?

Запретить или разрешить ничего не происходит.

Я использовал первую часть кода, чтобы сгенерировать список URL-адресов, которые указывают на всплывающие окна для отдельных животных. Это работает. Затем я пытаюсь перебрать этот список, чтобы открыть каждую страницу, чтобы я мог почерпнуть информацию. Планируется использовать heroku для предоставления JSON-ввода типа API для приложения. Страницы отдельных животных генерируются в режиме реального времени, и API не существует, так что это усложняет задачу! Спасибо!

1 Ответ

0 голосов
/ 01 июля 2019

Я вижу, у меня есть две оценки.Так что я изменил это.И это работает.

ожидайте page1.evaluate ();const animalID = await page1.evaluate (() => document.getElementById ("lblID"). innerHTML);

Я все еще получаю сообщение "Хотите, чтобы приложение Chromium.app" принимало входящую сеть?соединения?»сообщение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...