Scraper liste d'envie Amazon avec Puppeteer


#1

Bonjour à tous,

J’essaye d’extraire les produits d’une liste d’envie Amazon via Puppeteer. Cela fonctionne mais uniquement en mode non headless.
J’obtiens une erreur “Navigation Timeout Exceeded: 30000ms exceeded” en mode headless, pas moyen de trouver la cause … Vous avez une idée ?

Voilà le code en question :

const puppeteer = require('puppeteer')
const cheerio = require('cheerio');

(async () => {
  const browser = await puppeteer.launch({headless: true})
  const page = await browser.newPage()
  await page.setRequestInterception(true)
  page.on('request', request => {
    if (request.resourceType() === 'image') {
      request.abort()
    } else {
      request.continue()
    }
  })
  await page.goto('http://amzn.eu/ebKNEqg')
  await scroll(page)

  let content = await page.content()
  let $ = cheerio.load(content)
  const whishlist = []
  $('h3.a-size-base a.a-link-normal').each((i, elem) => {
    whishlist[i] = $(elem).attr('href')
  })
  console.log(whishlist)
  await browser.close()
})()

async function scroll (page) {
  let i = 0
  while (await page.$('.wl-see-more') !== null) {
    i++
    // Scroll to bottom to load more
    await page.evaluate(_ => {
      window.scrollBy(0, window.innerHeight)
    })
    console.log('Loop #' + i)
  }
}

Si vous avez des astuces pour accélérer le traitement, je suis preneur aussi :slight_smile: (J’ai commencé à bloquer le chargement des images).


#2

Bonjour,
pour éviter les erreurs de type : “Navigation Timeout Exceeded: 30000ms exceeded”
essai d’utiliser un Try Catch (a vue d’œil dans le while*).


#3

Bonjour,

Il y a ce module NodeJS pour extraire des produits Amazon sans scrapper quoi que ce soit, en plus, il intègre l’ajout des liens affiliés : https://www.npmjs.com/package/amazon-affiliate-api

Maxence.


#4

A quelle ligne précisément intervient l’erreur de Timeout?


#5

@CaCerfARien bien vu pour le Try Catch mais c’est le goto qui pose problème

await page.goto('http://amzn.eu/ebKNEqg')

Du coup le script est très long mais fonctionne.
Avec {headless: false} pas d’erreur et exécution plus rapide, cela devrait être l’inverse …


#6

Dans ce cas, si c’est le goto qui pose problème, tentes une alternative de type:

page.goto('http://amzn.eu/ebKNEqg') // don't await for page loading here

// Instead, wait for either of events to trigger
await Promise.race([
    page.waitForNavigation({waitUntil: 'domcontentloaded'}),
    page.waitFor('h3.a-size-base a.a-link-normal') // might be another css selector
]);

#7

merci @ScrapingExpert mais toujours le même problème de timeout


#8

Au delà du problème de timeout, qu’est ce que tu constates quant à l’état de chargement de la page? Est-elle en partie charger, ou pas du tout, avec pour résultat une page blanche?


#9

Mon problème de timeout venait de Windows (ou ma machine) sous linux plus de problème si ce n’est des temps beaucoup plus long que phantomJS par exemple.
Merci


Team : CamilleBriceJulienVivianBorisXavierSteven.