Scraper liste d'envie Amazon avec Puppeteer

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).

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*).

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.

1 J'aime

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

@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 …

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
]);

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

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?

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