Запросы на несколько страниц с кукловодом - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь получить информацию со многих сайтов (ссылки из массива), которые имеют динамическое содержание (электронные письма и названия компаний) с кукловодом. Я использую цикл «для», чтобы перебрать массив со ссылками, сделать page.goto... для каждого сайта, подождать, пока сайт загрузится, подождать несколько секунд динамического контента и начать делать запросы. Но у меня есть первый и последний запрос (обещания разрешаются). Другие обещания не возвращают мне динамическое содержание. Что я должен сделать, чтобы это исправить? Спасибо

let puppeteer = require('puppeteer');

(async() => {
const browser = await puppeteer.launch();
let page = await browser.newPage();
const url = 'https://abcdsite.com/';
let arrayNames = ['first','second','third','abcd'];
for(let i=0;i<await arrayNames.length;){
    let nameUrl = await arrayNames[i];
    if (i<4){
      let temp1;
      console.log(`begin for ${nameUrl}`);
      await page.goto(`${url}${nameUrl}`, { waitUntil: 'load' })
          .then(()=>{
            return new Promise(res=>{
              //wait content dynamic load
              setTimeout(()=>{
                temp1 = page.evaluate(() => {
                  return new Promise(resolve => { // <-- return the data to node.js from browser
                    let name = document.querySelector('h1').innerHTML;
                    let email = document.getElementsByClassName('sidebar-views-contacts h-card vcard')[0]
                        .children[2].children[0].children[0].innerHTML;
                    resolve(email);
                  });
                });
                res(temp1);
              },7000);

            })
      })
          .then((res)=>{
            i++;
            console.log(`https://abcdsite.com/${nameUrl}`,temp1);
          });
    }
    else{
      break
    }
  }
})();

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

функция кукловода page.goto имеет несколько параметров, которые вы можете использовать, чтобы убедиться, что страница полностью загружена. Смотри документацию здесь . Кроме того, вы можете использовать метод page.waitFor, чтобы подождать несколько секунд. См. Документацию здесь .

Здесь у вас есть простой пример, который, я думаю, может работать для вас:

const puppeteer = require('puppeteer')

const url = 'https://stackoverflow.com/'
const arrayNames = ['tags', 'users', 'jobs', 'questions'];

(async () => {
  const browser = await puppeteer.launch()
  const page = await browser.newPage()

  const data = {}
  for (const nameUrl of arrayNames) {
    const fullUrl = `${url}${nameUrl}`
    console.log(`begin for ${fullUrl}`)
    await page.goto(fullUrl, { waitUntil: 'networkidle0' }) // check networkidle0 parameter and others here: https://pptr.dev/#?product=Puppeteer&version=v2.1.1&show=api-pagegotourl-options
    await page.waitFor(2000) // wait 2 seconds to allow a full login. Optional
    const pageData = await page.evaluate(() => {
      const name = document.querySelector('h1').innerText
      const pageTitle = document.querySelector('title').innerText
      // get whatever data you need to get from the page.
      return { name: name, title: pageTitle }
    })
    console.log('\t Data from page: ', pageData)
    data[fullUrl] = pageData
  }
  console.log(data)
})()

Это не работает на всех сайтах параллельно, но вы затем можно поиграть с примером. Вместо «ожидания» части await page.evaluate вы можете получить все обещания в массиве и затем использовать await Promise.all([listOfPromises])

1 голос
/ 24 апреля 2020

Думаю, это вам поможет.

1) создайте асинхронную c функцию для запроса и анализа ваших данных

2) создайте массив параллельных задач.

let puppeteer = require('puppeteer');

async function makeRequest(page, url, nameUrl) {
  await page.goto(`${url}${nameUrl}`, { waitUntil: 'load' });

  setTimeout(() => {
    const userEmail = await page.evaluate(() => {
      let name = document.querySelector('h1').innerHTML;
      let email = document.getElementsByClassName('sidebar-views-contacts h-card vcard')[0]
        .children[2].children[0].children[0].innerHTML;

      return email;
    });

    return Promise.resolve(userEmail);
  }, 7000);
}

(async () => {
  const browser = await puppeteer.launch();
  let page = await browser.newPage();
  const url = 'https://abcdsite.com/';
  let arrayNames = ['first', 'second', 'third', 'abcd'];

  let tasks = [];
  for (let i = 0; i < arrayNames.length; i++) {
    tasks.push(makeRequest(page, url, arrayNames[i]));
  }

  Promise.all(tasks)
    .then((res) => {
      for (let i = 0; i < arrayNames.length; i++) {
        console.log(`https://abcdsite.com/${arrayNames[i]}`, res[i]);
      }
    });

})();

Серийное решение

Для получения дополнительной информации прочитайте this .

for (let i = 0; i < arrayNames.length; i++) {
  let temp = await makeRequest(page, url, arrayNames[i]);
  console.log(`https://abcdsite.com/${arrayNames[i]}`, temp);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...