Я посмотрел на "Цикл по набору 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 не существует, так что это усложняет задачу! Спасибо!