我想从arrayUrl输入每个URL,得到价格并移到下一个,问题是:我不能得到超过一个项目,它总是返回第一个产品的价格,索引0,或者1,2.如果我手动更改为for(let i = "Number"; i<2; i++),它会认为我的循环中断了,但我不知道如何修复它。
let manufacturers = [2]
// 'Norton', 'Vonder', 'Bosch', 'black+decker', 'Dewalt', 'Stanley', 'Makita', 'Gedore', '3m&common_filter[2012]=2082', 'Dremel', 'Toyama', 'Minipa'] (Ignore)
let lastpage = [3]
// , 15, 4, 3, 5, 6, 14, 2, 2, 2, 3, 2] //Tem que botar um número acima (Ignore)
var scrape = async () => {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
page.setDefaultNavigationTimeout(0);
results = await getProducts(page)
return results
}
async function getProducts(page) {
var arrayUrl = await (ConcatUrls(page))
products = []
for(let i = 0; i < 2; i++) { //i<2 Just to limit to 2 products per page, for testing purpose
await page.goto(arrayUrl[i])
return page.evaluate(() => {
data = []
price = document.querySelector('#valor-padrao-prod').getAttribute('value')
data.push({price})
return data
}
)}
return products
}
async function ConcatUrls(page) {
let urls = [];
await page.goto('https://www.ferramentaskennedy.com.br/busca?marcas=99&q=vonder');
for (let i = 0; i < manufacturers.length; i++) {
var lastPageNumber = lastpage[i];
for (let index = 1; index < lastPageNumber; index++) {
await page.waitFor(1000);
urls = urls.concat(await getUrl(page));
if (index < lastPageNumber - 1) {
await page.click('#app > div.categoria-produtos.pr-3.pl-3.p-md-0 > div.content > div > div > div.col-12.p-0 > ul > li:nth-child(8) > a');
}
}
}
return urls
}
async function getUrl(page) {
await page.waitForSelector('#app > div.categoria-produtos.pr-3.pl-3.p-md-0 > div.content > div > div > div.col-12.p-0 > div > div > div > div.infos > div.title.mt-2.margin-card-sem-selo > h2');
let url = await page.$$eval('#app > div.categoria-produtos.pr-3.pl-3.p-md-0 > div.content > div > div > div.col-12.p-0 > div > div > div > div.infos > div.title.mt-2.margin-card-sem-selo', links => {
links = links.map(el => el.querySelector('h2 > a').href)
return links;
});
return url
}
scrape().then((value) => {
// console.log('Items scraped: ' + value.length);
console.table(value);
})```发布于 2021-03-24 07:14:38
问题似乎在这里(见评论):
async function getProducts(page) {
var arrayUrl = await (ConcatUrls(page))
products = []
for(let i = 0; i < 2; i++) {
await page.goto(arrayUrl[i])
return page.evaluate(() => { // Breaks the loop and returns just the first result
data = []
price = document.querySelector('#valor-padrao-prod').getAttribute('value')
data.push({price})
return data
})
}
return products // Not returned
}也许你的意思是这样的:
async function getProducts(page) {
var arrayUrl = await (ConcatUrls(page))
products = []
for(let i = 0; i < 2; i++) {
await page.goto(arrayUrl[i])
const price = await page.evaluate(() => {
return document.querySelector('#valor-padrao-prod').getAttribute('value')
})
products.push({price})
}
return products
}https://stackoverflow.com/questions/66770609
复制相似问题