Scraping HTML

Web Scraping

Les sites web sont écrits en utilisant HTML, ce qui signifie que chaque page Web est un document structuré. Parfois, il serait bien d’obtenir des données à partir d’elles et de préserver la structure pendant que nous y sommes. Les sites web ne fournissent pas toujours leurs données dans des formats confortables tels que le csv ou json.

C’est là où le web scraping entre en jeu. Le web scraping est la pratique d’utiliser un programme d’ordinateur pour passer au crible d’une page Web et de recueillir les données dont vous avez besoin dans un format plus utile pour vous tout en préservant la structure de la donnée.

lxml et Requests

lxml est une bibliothèque assez étendue, écrite pour analyser des documents XML et HTML très rapidement, manipulant même des balises invalides au cours du processus. Nous allons aussi utiliser le module Requests à la place du module urllib2 natif à cause d’améliorations en terme de vitesse et de lisibilité. Vous pouvez facilement installer les deux en utilisant pip install lxml et pip install requests.

Commençons avec les imports:

from lxml import html
import requests

Ensuite, nous utiliserons requests.get pour récupérer la page web avec notre donnée, la parser en utilisant le module html et sauver les résultats dans `` tree``:

page = requests.get('http://econpy.pythonanywhere.com/ex/001.html')
tree = html.fromstring(page.content)

(Nous avons besoin d’utiliser page.content plutôt que page.text parce que html.fromstring attend implicitement des bytes en entrée.)

tree contient maintenant le fichier HTML entier dans une belle structure arborescente que nous pouvons parcourir de deux façons différentes: XPath et CSSSelect. Dans cet exemple, nous allons nous concentrer sur le premier.

XPath est un moyen de trouver de l’information dans des documents structurés tels que des documents HTML ou XML. Une bonne introduction à XPath est sur W3Schools .

Il existe également divers outils pour obtenir le XPath d’éléments comme Firebug pour Firefox ou l’Inspecteur Chrome. Si vous utilisez Chrome, vous pouvez faire un clic droit sur un élément, choisissez ‘Inspecter’, mettez en surbrillance le code, faites un clic droit à nouveau et choisissez ‘Copy’ puis ‘Copy XPath’

Après une analyse rapide, nous voyons que dans notre page les données sont contenues dans deux éléments - l’un est une div avec le titre ‘buyer-name’ et l’autre est un span avec la classe ‘item-price’:

<div title="buyer-name">Carson Busses</div>
<span class="item-price">$29.95</span>

Sachant cela, nous pouvons créer la requête XPath correcte et utiliser la fonction xpath lxml comme ceci:

#This will create a list of buyers:
buyers = tree.xpath('//div[@title="buyer-name"]/text()')
#This will create a list of prices
prices = tree.xpath('//span[@class="item-price"]/text()')

Voyons voir ce que nous avons exactement:

print 'Buyers: ', buyers
print 'Prices: ', prices
Buyers:  ['Carson Busses', 'Earl E. Byrd', 'Patty Cakes',
'Derri Anne Connecticut', 'Moe Dess', 'Leda Doggslife', 'Dan Druff',
'Al Fresco', 'Ido Hoe', 'Howie Kisses', 'Len Lease', 'Phil Meup',
'Ira Pent', 'Ben D. Rules', 'Ave Sectomy', 'Gary Shattire',
'Bobbi Soks', 'Sheila Takya', 'Rose Tattoo', 'Moe Tell']

Prices:  ['$29.95', '$8.37', '$15.26', '$19.25', '$19.25',
'$13.99', '$31.57', '$8.49', '$14.47', '$15.86', '$11.11',
'$15.98', '$16.27', '$7.50', '$50.85', '$14.26', '$5.68',
'$15.00', '$114.07', '$10.09']

Félicitations! Nous avons scrapé avec succès toutes les données que nous voulions à partir d’une page Web en utilisant lxml et Requests. Nous les avons stocké en mémoire, dans deux listes. Maintenant, nous pouvons faire toutes sortes de trucs cools avec elles: nous pouvons l’analyser en utilisant Python ou nous pouvons l’enregistrer dans un fichier et les partager avec le monde.

Quelques idées plus cools sur lesquelles réfléchir sont de modifier ce script pour parcourir le reste des pages de ce jeu de données exemple, ou la réécriture de cette application pour utiliser les threads pour améliorer la vitesse.