2 回答

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

TA貢獻1797條經驗 獲得超6個贊
我知道問題出在哪里。
Puppeteer JS 在兩個引擎中運行 javascript,兩者的作用域不同,所以我們需要將
section
數字傳遞給page.evaluate
亞馬遜網站顯示亞馬遜產品的結果,選擇器沒有選擇正確的產品,所以我將其更改為
.olpSellerName
我添加了一些改進以使腳本運行得更快。
希望這能有所幫助。
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);
}
})()
添加回答
舉報