#javascript #node.js #web-scraping #puppeteer
#javascript #node.js #очистка веб-страниц #puppeteer
Вопрос:
Итак, это мой код прямо сейчас
Моя цель — создать и распечатать в консоли первые 10 названий продуктов в https://www.nike.com.br/Snkrs#estoque
Однако он возвращает одно и то же имя 10 раз
"Kybrid S2Pineapple Comprar
Kybrid S2Pineapple Comprar
...
Kybrid S2Pineapple Comprar"
const puppeteer = require('puppeteer');
const { stringify } = require('querystring');
async function Teste(){
const browser = await puppeteer.launch({
headless: false
})
page = await browser.newPage();
await page.goto('https://www.nike.com.br/Snkrs#estoque');
await page.waitForSelector('#DadosPaginacaoEstoque');
var s = 10
var i = 1
while (i != s){
w = await page.evaluate('document.querySelector("#DadosPaginacaoEstoque > div:nth-child(1) > div:nth-child(" String(i) ") > div > div.produto__detalhe").innerText');
console.log(w);
i = i 1;
}
console.log(s)
}
Teste();
Как мне это исправить?
Ответ №1:
Ах, я думаю, что функция page.$$eval приведет вас туда, где вам нужно быть.
Причина, по которой он снова и снова печатает одно и то же значение, заключается в том, что ваш запрос снова и снова возвращает одно и то же значение. Вы должны использовать page.$$eval для использования queryselectorall и полностью отказаться от цикла while, чтобы это было что-то вроде этого
const puppeteer = require('puppeteer');
const { stringify } = require('querystring');
async function Teste(){
const browser = await puppeteer.launch({
headless: false
})
page = await browser.newPage();
await page.goto('https://www.nike.com.br/Snkrs#estoque');
await page.waitForSelector('#DadosPaginacaoEstoque');
// from what I've seen this works
let selector = "#DadosPaginacaoEstoque div.produto__detalhe"
let products = await page.$eval(selector, lists=>lists.map(items=>items.innerText))
console.log(products.splice(0,10))
}
Teste();
Комментарии:
1. Он возвращает ошибку, в которой говорится, что «#DadosPaginacaoEstoque > div: nth-child(1) > div: nth-child > div > div.produto__detalhe» не является допустимым селектором. И не могли бы вы объяснить разницу в функциях page.$$eval и page.evaluate?
2. Вероятно, это связано с тем, что после второго div отсутствует число: nth-child(«число должно быть здесь»)
3. Ах, мне жаль, что я никогда не использовал
nth-child
prop. В зависимости от количества divs, которые используют имя класса produto__detalhe, вы можете просто использовать"#DadosPaginacaoEstoque div.produto__detalhe"
в качестве своего селектора
Ответ №2:
Кажется, у вас просто небольшая опечатка с кавычками. Попробуйте это:
w = await page.evaluate('document.querySelector("#DadosPaginacaoEstoque > div:nth-child(1) > div:nth-child(' String(i) ') > div > div.produto__detalhe").innerText');