Кукловод: откройте страницу, получите данные, вернитесь на предыдущую страницу, введите новую страницу, чтобы получить данные - PullRequest
1 голос
/ 23 апреля 2019

Получить данные с 1 страницы просто, но как вернуться после получения данных с первой страницы, войти на новую страницу, получить данные с этой страницы ... и т. Д. Я пытаюсь сделать это на веб-сайте http://books.toscrape.com/.

Итак, я решил напечатать, сколько книг на складе, потому что к нему можно получить доступ, только если вы введете ссылку. Например, если вы запустите код, вы получите: { stock: 'In stock (22 available)' }

Теперь я хочу вернуться на исходную страницу, ввести вторую ссылку и взять ту же информацию, что и предыдущая. И так далее ..

Как это можно сделать с помощью ванильного JavaScript?

const puppeteer = require('puppeteer');

let scrape = async () => {
    const browser = await puppeteer.launch({ headless: false });
    const page = await browser.newPage();

    await page.goto('http://books.toscrape.com/');
    await page.click('#default > div > div > div > div > section > div:nth-child(2) > ol > li:nth-child(1) > article > div.image_container > a > img');
    await page.waitFor(1000);

    const result = await page.evaluate(() => {
        let stock = document.querySelector('#content_inner > article > table > tbody > tr:nth-child(6) > td').innerText;

        return {
            stock
        }
    });

    browser.close();
    return result;
};

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

1 Ответ

1 голос
/ 23 апреля 2019

Объяснение

Что вам нужно сделать, это позвонить page.goBack(), чтобы вернуться на одну страницу, когда ваша задача будет завершена, а затем нажмите следующий элемент.Для этого вы должны использовать page.$$, чтобы получить список интерактивных элементов и использовать цикл, чтобы переходить по ним один за другим.Затем вы можете перезапустить ваш скрипт, чтобы извлечь ту же информацию для следующей страницы.

Код

Я адаптировал ваш код для вывода желаемого результата в консоли для каждой страницы ниже.Имейте в виду, что я изменил селектор из вашего вопроса, чтобы удалить :nth-child(1), чтобы выбрать все интерактивные элементы.

const puppeteer = require('puppeteer');

const elementsToClickSelector = '#default > div > div > div > div > section > div:nth-child(2) > ol > li > article > div.image_container > a > img';

let scrape = async () => {
    const browser = await puppeteer.launch({ headless: false });
    const page = await browser.newPage();

    await page.goto('http://books.toscrape.com/');

    // get all elements to be clicked
    let elementsToClick = await page.$$(elementsToClickSelector);
    console.log(`Elements to click: ${elementsToClick.length}`);

    for (let i = 0; i < elementsToClick.length; i++) {
        // click element
        elementsToClick[i].click();
        await page.waitFor(1000);

        // generate result for the current page
        const result = await page.evaluate(() => {
            let stock = document.querySelector('#content_inner > article > table > tbody > tr:nth-child(6) > td').innerText;
            return { stock };
        });
        console.log(result); // do something with the result here...

        // go back one page and repopulate the elements
        await page.goBack();
        elementsToClick = await page.$$(elementsToClickSelector);
    }

    browser.close();
};

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