Comment récupérer des pages à défilement infini en utilisant Python

Comment faire, Python, Scraping, Mar-06-20245 minutes de lecture

Dans le monde d'aujourd'hui, tout le monde utilise les nouvelles technologies. Vous pouvez accéder aux données structurées de manière automatisée à l'aide du web scraping. Par exemple, vous pouvez utiliser le web scraping pour : Le défilement infini, également connu sous le nom de "scrolling sans fin", est une technique de conception web que les sites web utilisent souvent avec AJAX ou Javascript.

Table des matières

Dans le monde d'aujourd'hui, tout le monde utilise les nouvelles technologies. Vous pouvez accéder aux données structurées de manière automatisée à l'aide du web scraping. Par exemple, vous pouvez utiliser le web scraping pour :

  • Surveillance des prix
  • Génération de leads
  • Suivi de l'actualité
  • Étude de marché
  • Renseignements sur les prix

Le défilement infini est une technique de conception web que les sites web utilisent souvent avec AJAX ou Javascript pour charger dynamiquement du contenu supplémentaire lorsque l'utilisateur fait défiler la page web vers le bas. Cette technique a gagné en popularité grâce à son succès sur les sites de médias sociaux. Par exemple, le défilement infini sur Twitter est produit par un chargement asynchrone. Twitter effectue des appels AJAX après le chargement de la page afin d'ajouter continuellement du nouveau contenu au fur et à mesure du défilement. Bien que le défilement infini présente de nombreux avantages, il n'est pas recommandé pour les tâches de recherche orientées vers un objectif, qui nécessitent de localiser un contenu particulier.

Comprenons d'abord les avantages du scraping de pages à défilement infini.

Pourquoi faut-il scraper des pages à défilement infini ?

Voici quelques-unes des raisons pour lesquelles il faut scraper les pages à défilement infini.

  • Engagement de l'utilisateur - Le défilement infini maintient l'engagement de l'utilisateur sur une page. Sur les sites de médias sociaux comme Twitter et Facebook, il y a des tonnes de contenu généré par les utilisateurs à faire défiler, de sorte que l'utilisateur est constamment engagé. 
  • Moins de clics - Le défilement nécessite moins d'action et il est plus facile pour les utilisateurs de cliquer.
  • Idéal pour les mobiles - Le défilement infini est idéal pour les appareils mobiles et les écrans tactiles. Les utilisateurs peuvent glisser vers le bas pour générer du nouveau contenu au lieu de passer à de nouveaux onglets. 

Outre les avantages susmentionnés du scraping de pages à défilement infini, il y a aussi des inconvénients :

  • Ce n'est pas très bon pour l'optimisation des moteurs de recherche (SEO).
  • Il n'est pas facile pour les utilisateurs souffrant d'un handicap physique de naviguer dans les pages qui ont un défilement infini.
  • Les sites web à défilement infini peuvent avoir un temps de chargement long qui peut provenir de l'utilisateur ou du développement.

Comment récupérer des pages à défilement infini en utilisant Python

Voyons comment récupérer des pages à défilement infini en utilisant Python à l'aide des étapes mentionnées ci-dessous.

Importer des bibliothèques

Vous devez importer la bibliothèque Selenium.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys    
import time

Configuration de Selenium

Ici, vous devez choisir le navigateur que vous souhaitez utiliser. Nous choisirons Chrome car il offre plus d'options que Firefox. 

def get_selenium() :                          
  options = webdriver.ChromeOptions()
  options.add_argument('--ignore-certificate-errors')
  options.add_argument('--incognito')
  options.add_argument('headless')                       
   driver = webdriver.Chrome(chrome_options=options)
  return (pilote)

L'argument headless mentionné ci-dessus est très important. Selenium n'ouvrira pas Chrome dans une nouvelle fenêtre lorsqu'il s'exécute sans tête dans Python. Cependant, si vous rencontrez un problème lors du scraping, vous pouvez commenter l'option headless et voir ce qui se passe dans Chrome et ce qui est chargé sur la page.

Nous pouvons omettre les deux drapeaux i-e ; ignore-certificate-errors et incognito.

Si vous rencontrez un captcha ou une bannière de cookies qui empêche le chargement de votre page, vous pouvez cliquer sur OK et accéder à la page normalement. Toutefois, si le navigateur se ferme inopinément, vous pouvez utiliser time.sleep() pour mettre le code en pause et prendre le temps de le déboguer.

Correction du défilement infini

Vous devez examiner la structure HTML de votre page pour corriger le défilement infini et suivre les étapes mentionnées ci-dessous.

  • Vous devez trouver le dernier élément chargé sur la page.
  • Vous devez utiliser Selenium pour faire défiler vers le bas jusqu'à cet élément.
  • Pour attendre que la page charge davantage de contenu, utilisez time.sleep().
  • Défilez à nouveau jusqu'au dernier élément chargé sur la page.
  • Vous devez répéter le même processus jusqu'à ce que vous atteigniez la fin de la page.

L'exemple ci-dessous vous permettra de mieux comprendre.

selenium = get_selenium()              
selenium.get("your/url")   
last_elem = '';
while True:
   current_last_elem = "#my-div > ul > li:last-child"
   scroll = "document.querySelector(\'" + current_last_elem + "\').scrollIntoView() ;"
   selenium.execute_script(scroll)
   time.sleep(3)
  if (last_elem == current_elem)
     break
  else
      last_elem = current_elem

Dans le code ci-dessus, nous avons utilisé jQuery et Javascript dans Python. 

Ici,

  • Nous avons utilisé la fonction selenium.get() qui ouvrira notre page URL. Cependant, si vous souhaitez ajouter un mot-clé à votre recherche d'URL, vous pouvez utiliser la ligne de code suivante.
selenium.get("your/url.com/{0}".format(keyword))
  • Nous avons initialisé last_time à 0 en y stockant une chaîne vide.
  • Nous avons utilisé une boucle while dans laquelle nous avons utilisé CSS_selector ou Xpath pour obtenir l'élément current_last_elem. Pour obtenir le chemin, suivez les étapes ci-dessous. Ouvrez votre page. Pour sélectionner un élément dont vous avez besoin du chemin, vous devez utiliser des outils de développement web. Vous pouvez suivre ce tutoriel pour sélectionner l'élément dans la structure HTML de la page et obtenir le Xpath dans Chrome.
  • Ouvrez votre page.
  • Pour sélectionner un élément dont vous avez besoin du chemin d'accès, vous devez utiliser des outils de développement web. Vous pouvez suivre ce tutoriel pour sélectionner l'élément dans la structure HTML de la page et obtenir le Xpath dans Chrome.
  • Pour faire défiler la page jusqu'à l'élément sélectionné, nous avons utilisé jQuery et scrollIntoView(). 
"document.querySelector(\'"" + .. + "\N-).scrollIntoView() ;"

Ici, votre format doit être correct, vous devez donc faire attention aux guillemets simples et doubles et aux caractères d'échappement.

  • Nous exécutons le script js en utilisant selenium.execute_script().
  • Vous devez donner à la page suffisamment de temps pour se charger afin qu'elle puisse trouver le dernier élément. C'est pourquoi la fonction time.sleep() est importante, car elle suspend l'exécution pendant quelques secondes. Si vous ne laissez pas à la page le temps de se charger, elle cessera de défiler et vous obtiendrez un résultat indéfini.
  • Nous vérifions si un nouveau dernier élément est trouvé chaque fois que nous faisons défiler la page vers le bas. S'il est trouvé, cela signifie que nous n'avons pas encore atteint la fin de la page et que nous devons continuer à défiler. S'il n'est pas trouvé, cela signifie que le défilement de la page est terminé et que nous pouvons sortir de la boucle.

Résolution des problèmes fréquents

Voici quelques-uns des problèmes qui se posent fréquemment lors d'un défilement infini :

  • Il faut un certain temps pour trouver le bon chemin d'accès au dernier élément. Vous devez vérifier les guillemets simples et doubles dans le script js.
  • Si vous obtenez un élément indéfini ou le même dernier élément à chaque fois, vous devez augmenter la durée, c'est-à-dire augmenter time.sleep(), car la page risque de ne pas avoir assez de temps pour se charger complètement. 
  • Vous pouvez commenter l'option headless dans get_selenium() si tout est correct, mais cela ne fonctionne toujours pas.

Déclenchement de js en Python

Il est possible de déclencher un script js à partir de Python et d'obtenir une liste comme résultat. 

Par exemple, nous pouvons utiliser le code ci-dessous pour obtenir les sources de toutes les images de la page.

js_script = '''\N-'''\N-'''\N-'''\N                       
var jslist = []  
document.querySelectorAll('img').forEach(i => jslist.push(i.src)) ;
return jslist ; 
 ' ''   
python_list = selenium.execute_script(js_script)

Dans le code ci-dessus,

  • Nous avons créé un tableau vide appelé jslist.
  • Nous avons sélectionné toutes les balises img de la page.
  • Nous avons utilisé forEach pour pousser chaque img.src dans notre tableau.
  • Nous avons renvoyé la jslist.

Nous pouvons utiliser la même approche pour les liens href en :

  • Sélection de toutes les étiquettes "a".
  • Pousser chaque a.href dans notre tableau.

Nous pouvons ensuite exécuter le script avec selenium.execute_script() et stocker la valeur retournée par js dans une variable python, python_list. 

Voici comment nous pouvons récupérer des pages à défilement infini en utilisant Python.

Utilisation d'un proxy

Vous savez qu'un proxy est un serveur tiers qui agit comme un intermédiaire entre un client qui demande une ressource et un serveur qui fournit cette ressource. Si vous souhaitez utiliser proxys avec Selenium et Python, vous pouvez utiliser les lignes de code suivantes.

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=%s'% hostname +" : "+port)
driver = webdriver.Chrome(chrome_options=chrome_options)

Pour gérer le défilement infini, vous pouvez utiliser scroll-proxy qui prend en charge le défilement programmatique des vues défilables au sein d'une hiérarchie de vues. Si vous utilisez npm, vous pouvez installer scroll-proxy en utilisant la commande ci-dessous. Nous utiliserons js pour démontrer l'utilisation de scroll-proxy.

npm install scroll-proxy--save

Après avoir installé scroll-proxy, vous pouvez instancier un objet ScrollProxy à l'aide du code ci-dessous.

var myScroll = new ScrollProxy() ;

Vous pouvez voir que nous n'avons pas passé d'arguments au constructeur du ScrollProxy parce qu'il signalera des actions par défaut lorsque l'utilisateur fera défiler la page.

Cependant, si vous souhaitez obtenir des mises à jour lorsque l'utilisateur fait défiler un élément HTML spécifique, vous devez le passer dans le constructeur.

var myDiv = document.querySelector('.scrollable') ;
var myDivScroll = new ScrollProxy(myDiv) ;

Pourquoi utiliser proxys pour le scraping Infinite Scrolling ?

Voici quelques raisons d'utiliser proxys lors du scraping du scrolling infini.

  • Un captcha peut provoquer un dépassement de délai sur votre page et bloquer votre scraper. Vous pouvez vérifier manuellement la page à la recherche d'un captcha si vous obtenez fréquemment des erreurs de temporisation. La plupart des captchas sont déclenchés par des mesures de sécurité et vous pouvez les éviter en utilisant le site résidentiel rotatif proxys avec votre scraper.
  • Certains sites préfèrent filtrer les demandes d'en-tête suspectes en se basant sur l'hypothèse ou la probabilité que l'agent utilisateur soit un robot. Pour éviter de signaler que vous êtes un bot, vous pouvez utiliser proxys qui peut changer votre adresse IP et empêcher les signaux d'alerte pour vous (user-agent). 

Conclusion

Nous avons vu que le défilement infini est préférable lorsque l'utilisateur ne recherche pas d'informations spécifiques. Les sites d'actualités et les flux de médias sociaux qui génèrent constamment du nouveau contenu peuvent bénéficier du défilement infini. En revanche, les pages professionnelles et les sites de commerce électronique ne sont pas de bons candidats pour le défilement infini, car les utilisateurs recherchent des informations spécifiques. En outre, nous avons discuté des étapes impliquées dans le scraping de pages à défilement infini à l'aide de Selenium. Nous pouvons également utiliser le site résidentiel rotatif proxys pour gérer le défilement infini, car il permet d'éviter les captchas et de filtrer les demandes d'en-tête suspectes.

J'espère que vous avez compris comment récupérer des pages à défilement infini en utilisant Python.