亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

循環只給我第一行(puppeteer js)

循環只給我第一行(puppeteer js)

蠱毒傳說 2021-12-12 10:42:11
我想獲取價格和賣家數據,但我只獲取第一行,為什么?我正在嘗試學習js,但在這里我花了很多時間,請幫助。我從不同的站點獲取代碼并根據我的要求修改它,但仍然無法正常工作Puppeteer js、nodejsvar 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);    }})();
查看完整描述

2 回答

?
qq_笑_17

TA貢獻1818條經驗 獲得超7個贊

你基本上是這樣做的:


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);

    }

})();


查看完整回答
反對 回復 2021-12-12
?
互換的青春

TA貢獻1797條經驗 獲得超6個贊

我知道問題出在哪里。

  1. Puppeteer JS 在兩個引擎中運行 javascript,兩者的作用域不同,所以我們需要將section數字傳遞給page.evaluate

  2. 亞馬遜網站顯示亞馬遜產品的結果,選擇器沒有選擇正確的產品,所以我將其更改為 .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);

    }

})()


查看完整回答
反對 回復 2021-12-12
  • 2 回答
  • 0 關注
  • 247 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號