Утилизация карусели с кукольником - PullRequest
0 голосов
/ 10 января 2020

В настоящее время я работаю над проектом, который должен собрать данные из результатов поиска в carousell.ph

Я в основном сделал выборку HTML и повторил вывод HTML из carousell, так что пока javascript работает, за исключением случаев, когда я пытался перенести его с помощью puppeteer, это всегда выдает мне ошибку.

Задача состоит в том, чтобы получить весь список продуктов из поискового URL "https://www.carousell.ph/search/iphone"

Вот код, который я сделал.

const puppeteer = require('puppeteer');
(async () => {

    const browser = await puppeteer.launch()
    const page = await browser.newPage()

    let url = 'https://www.carousell.ph/search/iphone';
    await page.goto(url, {waitUntil: 'load', timeout: 10000});
    await page.setViewport({ width: 2195, height: 1093 });
    await page.screenshot({ fullPage: true, path: 'carousell.png' });
    document.querySelectorAll('main').forEach(main => {
        main.querySelectorAll('a').forEach(product => {
            const product_details = product.querySelectorAll('p');
            const productName = product.textContent;
            const productHref = product.getAttribute('href');
            console.log(product_details[0].textContent + " - "+ product_details[1].textContent);
        });
    });

    await browser.close()

})()

Ответы [ 2 ]

1 голос
/ 10 января 2020

Как сказал @hardkoded, документ - это не что-то нестандартное в кукловоде, это догма в браузере, но не в Node.js. Вам также не нужно для каждого в Node.js. Техника карт, описанная в , это видео очень полезно и быстро. Также я буду следить за вашей техникой l oop или картой, потому что функция асинхронная, поэтому вы хотите, чтобы обещание вернулось разрешенным.

Техника карты

Чрезвычайно быстрый способ получить множество элементов в массив со страницы - использовать функцию, подобную приведенной ниже. Таким образом, вместо того, чтобы получить массив элементов и затем зациклить их для их свойств. Вы можете создать такую ​​функцию ниже, используя $$ eval и map. Результатом является отформатированный массив JSON, который убирает все циклы из уравнения.

const links = await first_state_list.$$eval("li.stateList__item", links =>
      links.map(ele2 => ({
        State_nme: ele2.querySelector("a").innerText.trim(), //GET INNER TEXT
        State_url: ele2.querySelector("a").getAttribute("href") //get the HREF
      }))
    );
0 голосов
/ 16 января 2020

Уже заставил это работать.

const puppeteer = require('puppeteer');

async function timeout(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

(async () => {

    const browser = await puppeteer.launch()
    const page = await browser.newPage();

    let searchItem = 'k20&20pro';
    let carousellURL = 'https://www.carousell.ph/search/' + searchItem;
    await page.goto(carousellURL, {waitUntil: 'load', timeout: 100000});
    //await page.goto(carousellURL, {waitUntil: 'networkidle0'});
    await page.setViewport({ 
        width: 2195, 
        height: 1093 
    });
    await page.evaluate(() => {
        window.scrollBy(0, window.innerHeight);
    })
    await timeout(15000);
    await page.screenshot({ 
        fullPage: true, 
        path: 'carousell.png' 
    });

    var data = await page.evaluate(() =>
        Array.from(
            document.querySelectorAll('main div a:nth-child(2)')).map(products => products.href
        )
    )

    var i;
    for (i = 0; i < data.length; i++) { 
        console.log(data[i]);
        // comment this section but this will open the page to get product details.
        //await page.goto(data[1], {"waitUntil" : "networkidle0"});

        // inner product page details
        // this will get the title
        // document.querySelectorAll('h1')[0].innerText;
        // this will get the amount
        // document.querySelectorAll('h2')[0].innerText;
        // this will get the description
        // document.querySelectorAll('section div div:nth-child(4) p')[0].innerText;
        // this will get sellers name
        // document.querySelectorAll('div div:nth-child(2) a p')[0].innerText;

        let ss_filename = 'carousellph_'+searchItem+'_'+i+'.png';
        console.log(ss_filename);
        console.log("\r\n");
        //await page.screenshot({ fullPage: false, path: ss_filename });
    }

    await browser.close()

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