web-dev-qa-db-fra.com

Sélénium contre BeautifulSoup pour le web scraping

J'efface le contenu d'un site Web à l'aide de Python. J'ai d'abord utilisé BeautifulSoup et Mechanize sur Python mais j'ai vu que le site Web avait un bouton qui créait du contenu via JavaScript, j'ai donc décidé d'utiliser Selenium.

Étant donné que je peux trouver des éléments et obtenir leur contenu en utilisant Selenium avec des méthodes comme driver.find_element_by_xpath, quelle raison y a-t-il à utiliser BeautifulSoup alors que je pourrais simplement utiliser Selenium pour tout?

Et dans ce cas particulier, je dois utiliser le sélénium pour cliquer sur le bouton JavaScript, est-il préférable d'utiliser également le sélénium pour analyser ou dois-je utiliser à la fois le sélénium et la belle soupe?

37
elie

Avant de répondre directement à votre question, il vaut la peine de dire comme point de départ: si tout ce que vous avez à faire est d'extraire du contenu de pages HTML statiques, vous devriez probablement utiliser une bibliothèque HTTP (comme Requests ou la fonction intégrée). urllib.request ) avec lxml ou BeautifulSoup , pas le sélénium (bien que le sélénium soit probablement suffisant aussi). Les avantages de ne pas utiliser inutilement le sélénium:

  • Bande passante et temps pour exécuter votre script. Utiliser Selenium signifie récupérer toutes les ressources qui seraient normalement récupérées lorsque vous visitez une page dans un navigateur - feuilles de style, scripts, images, etc. C'est probablement inutile.
  • Stabilité et facilité de récupération des erreurs. Sélénium peut être un peu fragile, selon mon expérience - même avec PhantomJS - et créer l'architecture pour tuer une instance de Selenium bloquée et en créer une nouvelle est un peu plus irritant que de configurer une logique de nouvelle tentative d'exception lors de l'utilisation de requests.
  • Potentiellement, l'utilisation du processeur et de la mémoire - en fonction du site que vous explorez et du nombre de threads d'araignée que vous essayez d'exécuter en parallèle, il est concevable que la logique de mise en page DOM ou l'exécution JavaScript puisse devenir assez coûteuse.

Notez qu'un site nécessitant des cookies pour fonctionner n'est pas une raison de faire éclater Selenium - vous pouvez facilement créer une fonction d'ouverture d'URL qui définit et envoie comme par magie des cookies avec des requêtes HTTP en utilisant cookielib / cookiejar .

D'accord, alors pourquoi pourriez-vous envisager d'utiliser du sélénium? À peu près entièrement pour gérer le cas où le contenu que vous souhaitez analyser est ajouté à la page via JavaScript, plutôt que intégré dans le HTML. Même dans ce cas, vous pourrez peut-être obtenir les données que vous souhaitez sans casser la machinerie lourde. Habituellement, l'un de ces scénarios s'applique:

  • Le JavaScript fourni avec la page contient déjà du contenu. Le JavaScript est juste là pour faire des modèles ou d'autres manipulations DOM qui mettent le contenu dans la page. Dans ce cas, vous voudrez peut-être voir s'il existe un moyen simple d'extraire le contenu qui vous intéresse directement du JavaScript à l'aide de regex.
  • Le JavaScript frappe une API Web pour charger le contenu. Dans ce cas, demandez-vous si vous pouvez identifier les URL d'API pertinentes et frappez-les vous-même; cela peut être beaucoup plus simple et plus direct que d'exécuter réellement le JavaScript et de supprimer le contenu de la page Web.

Si vous décidez que votre situation mérite d'utiliser Selenium, utilisez-le en mode sans tête, qui est pris en charge par (au moins) Firefox et Chrome. L'araignée Web ne nécessite généralement pas le rendu graphique de la page, ni l'utilisation de particularités ou de fonctionnalités spécifiques au navigateur, donc un navigateur sans tête - avec ses coûts de processeur et de mémoire inférieurs et moins de pièces mobiles à planter ou à bloquer. - est idéal.

54
Mark Amery

Je recommanderais d'utiliser Selenium pour des choses telles que l'interaction avec des pages Web, que ce soit dans un navigateur complet ou un navigateur en mode sans tête, tel que Chrome sans tête. Je voudrais également dire que la belle soupe est meilleure pour observer et écrire des déclarations qui dépendent de la détection d'un élément ou de ce qui est trouvé, puis en utilisant Selenium pour exécuter des tâches interactives avec la page si l'utilisateur le souhaite.

1
LiamººT