Цикл дай мне только первый ряд (кукловод js) - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь получить данные о цене и продавце, но я получаю только первый ряд, почему? Я пытаюсь выучить js, но здесь я трачу много времени, пожалуйста, помогите.

Я получаю код с разных сайтов и изменяю его под свои требования, но все еще не работает

Puppeteer js, nodejs

var url = 'https://www.amazon.co.uk/gp/offer-listing/3770436385/ref=olp_f_used?ie=UTF8&f_new=true&f_usedAcceptable=true&f_usedGood=true&f_used=true&f_usedLikeNew=true&f_usedVeryGood=true';

const puppeteer = require('puppeteer');

(async function main(){
    try{

        const browser = await puppeteer.launch({headless: false });
        const page = await browser.newPage();
        page.setUserAgent('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/67.0.3372.0 Safari/537.36');

        await page.goto(url);
        await page.waitForSelector('div.navFooterLine:nth-child(6)');

        const sections = await page.$$('.olpOffer');

        console.log(sections.length);

        for (const section of sections){

            const result = await page.evaluate(() => {
                //  let amaOffer = document.querySelector('#olpOfferList img').innerText;
                //  let amaPrice = document.querySelector('#olpOfferList img').innerText;
                let seller = document.querySelector('.a-text-bold a').innerText;
                let price = document.querySelector('.olpOfferPrice').innerText;

                return {
                //  amaOffer,
                    seller,
                    price

            }

        } )
        console.log(result);
    }

    } catch (e) {
        console.log('Our  error', e);
    }


})();

Ответы [ 4 ]

1 голос
/ 31 октября 2019

По сути, вы делаете это:

for (const section of sections) {
   const result = someValue;
   console.log(result);
}

Итак, вы просто объявляете новую переменную result над циклом over, не накапливая каждый из отдельных результатов в массив так,у вас могут быть все результаты.

Не совсем на 100% ясно, где вы хотите получить результаты, но вы можете по крайней мере накапливать их в массив, подобный этому:

(async function main() {
    try {

        const browser = await puppeteer.launch({headless: false});
        const page = await browser.newPage();
        page.setUserAgent('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3372.0 Safari/537.36');
        await page.goto(url);
        await page.waitForSelector('div.navFooterLine:nth-child(6)');
        const sections = await page.$$('.olpOffer');

        console.log(sections.length);

        let results = [];

        for (const section of sections) {

            const result = await page.evaluate(() => {
                //  let amaOffer = document.querySelector('#olpOfferList img').innerText;
                //  let amaPrice = document.querySelector('#olpOfferList img').innerText;
                let seller = document.querySelector('.a-text-bold a').innerText;
                let price = document.querySelector('.olpOfferPrice').innerText;

                return {
                    //  amaOffer,
                    seller,
                    price

                }

            });
            console.log(result);
            results.push(result);
        }
        // see all results here
        console.log(results);
        return results;

    } catch (e) {
        console.log('Our  error', e);
    }
})();
0 голосов
/ 01 ноября 2019

Теперь я хочу сравнить цены, но после покрытия в долларах США (не в реальном времени).

ЕВРО -> USD = 1,12

GBP -> USD = 1,3

CDN -> USD = 0,76

Но я предпочитаю amazon.com: если цена на другие сайты не <3, тогда amazon.com </p>

Тогда результат будет:

TLD: Amazon.co.uk

Цена: 10 долларов США (конвертируется)

Продавец: XXX

Я пробую это с массивом

0 голосов
/ 01 ноября 2019

У меня есть дополнительный вопрос:

Я хочу выполнить цикл для разных амазонитов

...
let AmazonSites = ['de','co.uk','ca'];
for(AmazonSite of AmazonSites){

let url = 'https://www.amazon.'+ AmazonSite +'/gp/offer-listing/'+ Asin +'/ref=olp_f_used?ie=UTF8&f_new=true&f_usedAcceptable=true&f_usedGood=true&f_used=true&f_usedLikeNew=true&f_usedVeryGood=true';


await page.goto(url)
...

, но получить только первые результаты, что не так?

0 голосов
/ 01 ноября 2019

Я знаю, где проблемы.

  1. Puppeteer JS запускает javascript на двух движках, оба являются разными областями, поэтому нам нужно передать число section в page.evaluate
  2. На сайте Amazon отображаются результаты, полученные от продуктов самого Amazon, и селектор не выбирает правильный, поэтому я изменил его на .olpSellerName
  3. Я добавил некоторые улучшения, чтобы сделатьСценарий запускается быстро.

Надеюсь, это поможет.

let url = 'https://www.amazon.co.uk/gp/offer-listing/3770436385/ref=olp_f_used?ie=UTF8&f_new=true&f_usedAcceptable=true&f_usedGood=true&f_used=true&f_usedLikeNew=true&f_usedVeryGood=true'
let chromeUA = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3372.0 Safari/537.36'

const puppeteer = require('puppeteer')

;(async function main() {
    try {

        const browser = await puppeteer.launch({headless: false})
        const page = (await browser.pages())[0]
        page.setUserAgent(chromeUA)
        page.setDefaultNavigationTimeout(0)
        page.setRequestInterception(true)

        page.on('request', async request => {
            if  (
                    request.resourceType() === 'image' ||
                    request.resourceType() === 'media' ||
                    request.resourceType() === 'script' ||
                    request.resourceType() === 'stylesheet' ||
                    request.resourceType() === 'font' ||
                    request.resourceType() === 'other'
                ) {
                request.abort()
            } else {
                request.continue()
            }
        })

        await page.goto(url)
        await page.waitForSelector('div.navFooterLine:nth-child(6)')
        const sections = await page.$$('.olpOffer')

        let results = []

        for (let num = 0; num < sections.length; num++) {
            let result = await page.evaluate( (num) => {
                let seller = document.querySelectorAll('.olpSellerName')[num].innerText
                let price = document.querySelectorAll('.olpOfferPrice')[num].innerText

                return {
                    //  amaOffer,
                    seller,
                    price
                }

            }, num)
            results.push(result)
        }
        // see all results here
        console.log(results)
        return results

    } catch (e) {
        console.log('Our  error', e);
    }
})()

У меня есть дополнительный вопрос:

Я хочу выполнить цикл для разных сайтов амазонок

let AmazonSites = ['de','co.uk','ca'];
for(AmazonSite of AmazonSites){

let url = 'https://www.amazon.'+ AmazonSite +'/gp/offer-listing/'+ Asin +'/ref=olp_f_used?ie=UTF8&f_new=true&f_usedAcceptable=true&f_usedGood=true&f_used=true&f_usedLikeNew=true&f_usedVeryGood=true';


await page.goto(url)

Таким образом, вы можете сделать несколько запросов, повторив скрипт с помощью цикла for

let domains = ['co.uk', 'de', 'ca']
let url = 'https://www.amazon.tld/gp/offer-listing/3770436385/ref=olp_f_used?ie=UTF8&f_new=true&f_usedAcceptable=true&f_usedGood=true&f_used=true&f_usedLikeNew=true&f_usedVeryGood=true'
let chromeUA = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3372.0 Safari/537.36'

const puppeteer = require('puppeteer')

;(async function main() {
    try {

        const browser = await puppeteer.launch({headless: false})
        const page = (await browser.pages())[0]
        page.setUserAgent(chromeUA)
        page.setDefaultNavigationTimeout(0)
        page.setRequestInterception(true)

        page.on('request', async request => {
            if  ( request.resourceType() === 'document' ) {
                request.continue()
            } else {
                request.abort()
            }
        })

        for (let tld in domains) {
            await page.goto(url.replace('tld', domains[tld]))
            await page.waitForSelector('div.navFooterLine:nth-child(6)')
            const sections = await page.$$('.olpOffer')

            let results = []

            for (let num = 0; num < sections.length; num++) {
                let result = await page.evaluate( (num) => {
                    let seller = document.querySelectorAll('.olpSellerName')[num].innerText
                    let price = document.querySelectorAll('.olpOfferPrice')[num].innerText

                    return {
                        //  amaOffer,
                        seller,
                        price
                    }

                }, num)
                results.push(result)
            }
            // see all results here
            console.log (`\n\nRESULT FOR DOMAIN TLD : www.amazon.${domains[tld]}`)
            console.log(results)
        }

        await browser.close()

    } catch (e) {
        console.log('Our  error', e);
    }
})()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...