Сбой в создании веб-страниц с названиями продуктов PUPPETEER JS

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