соскоб с арайса урла — кукольника

#puppeteer

Вопрос:

У меня есть списки URL-адресов… от : http://books.toscrape.com

 

Let objArray = 
[
{"Url": "books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"},
{"Url": "books.toscrape.com/catalogue/tipping-the-velvet_999/index.html"},
{"Url": "books.toscrape.com/catalogue/soumission_998/index.html"}
]
 

Как Вы Можете Видеть, Все Ссылки Имеют Одинаковую Очистку.

I want to scrape the Titles, Prices And Stock Availability from above links.

Я также пытаюсь перебрать все URL-адреса, как это:

 
for (var i = 0; i < objArray.length;   i) {
    (async() => {
        let browser;
        try {
            browser = await puppeteer.launch({
                headless: false,
            });
            const page = await browser.newPage();
            await page.goto(url);

            const content = await page.content();
            const $ = cheerio.load(content);

            const Product_details = []

            const instock = $(div[class="col-sm-6 product_main"] p[class="instockavailability"]).text();
            const title = $(div[class="col-sm-6 product_main"] ).text();
            const price = $(div[class="col-sm-6 product_main"] p[price_color]).text()

            Product_details.push({
                Stock: instock,
                Title: title,
                Price: price,
            });
            fs.writeFileSync("files.json", JSON.stringify(Product_details), "utf8")
            console.log(Product_details)

        }
 

Теперь мой приведенный выше код не работает…..Я хочу получить подробную информацию о продукте, такую как: названия, цены

Комментарии:

1. Ваш цикл while, по-моему, выглядит нормально, в чем проблема?

Ответ №1:

Вы можете разделить логику каждой страницы на функции и попробовать что-то вроде этого:

 (async () => {
    let browser;
    try {
        browser = await puppeteer.launch({
            headless: false,
        });
        const page = await browser.newPage();
        const url = "http://books.toscrape.com/";

        const Product_details = [];

        await page.goto(url);
        Product_details.push(await getData(page, Product_details));

        while (await page.$('li[class="next"] a')) {
          await Promise.all([
            page.waitForNavigation(),
            page.click('li[class="next"] a'),
          ]);
          Product_details.push(await getData(page, Product_details));
        }

        fs.writeFileSync("Details.json", JSON.stringify(Product_details), "utf8");
    } catch (e) {
        console.log('Error-> ', e);
        await browser.close();
    }
})();

async function getData(page, details) {
    console.log(page.url());
    
    const html = await page.content();
    const $ = cheerio.load(html);

    const statsTable = $('li[col-xs-6 col-sm-4 col-md-3 col-lg-3]');

    statsTable.each(function() {
        const title = $(this).find('h3').text();
        const Price = $(this).find('p[class="price_color"]').text();

        details.push({
            Title: title,
            Price: Price
        });
    });
}
 

UPD: Ответ на последнюю редакцию вопроса:

 const objArray = [
  { Url: 'books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html' },
  { Url: 'books.toscrape.com/catalogue/tipping-the-velvet_999/index.html' },
  { Url: 'books.toscrape.com/catalogue/soumission_998/index.html' },
];

(async () => {
    let browser;
    try {
        const Product_details = [];

        for (const { Url } of objArray) {
            browser = await puppeteer.launch({
                headless: false,
            });
            const page = await browser.newPage();

            await page.goto(`http://${Url}`);
            const content = await page.content();
            const $ = cheerio.load(content);

            const instock = $('div[class="col-sm-6 product_main"] p[class="instockavailability"]').text().trim();
            const title = $('div[class="col-sm-6 product_main"] h1').text().trim();
            const price = $('div[class="col-sm-6 product_main"] p[class="price_color"]').text().trim;

            Product_details.push({
                Stock: instock,
                Title: title,
                Price: price,
            });

            await browser.close();
        }

        console.log(Product_details);
        fs.writeFileSync('files.json', JSON.stringify(Product_details), 'utf8');
    } catch (e) {
        console.log('Error-> ', e);
        await browser.close();
    }
})();
 

Комментарии:

1. @DivyanshuSah Да, это перезаписано. Вам нужна макроструктура вне функции страницы и микроструктура, возвращаемая функцией страницы, для добавления в макроструктуру. Я отредактировал ответ.

2. @DivyanshuSah Если вам нужны более плоские данные, попробуйте новый вариант.

3. @DivyanshuSah Вы пробовали новый отредактированный ответ?

4. @DivyanshuSah Я добавил второй вариант к ответу.

5. @DivyanshuSah Хорошо, готово. Но этот вариант будет работать дольше, так как повторное открытие браузера займет некоторое время.