• 4 heures
  • Facile

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 03/06/2021

[BONUS] Collectez des citations automatiquement avec Scrapy

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

La librairie standard de Python a beau être fournie et disponible, elle n’est pas pour autant exhaustive. Que faire si vous n’y trouvez pas votre bonheur? Vous voudrez en importer d’une source externe.

La communauté Python est, comme je vous l’ai expliqué plus tôt, très active et a produit plusieurs milliers de modules. Pip est l’outil de gestion de paquets utilisé pour installer et gérer des modules externes. Il est installé automatiquement quand vous installez Python. Vous les trouverez toutes sur PyPI, l’index des librairies Python (Python Package Index).

Comment installer une librairie ?

Très simplement ! Vous écrivez  python3 -m pip install ma_librairie .

Prenons un exemple.

Une des librairies les plus populaires pour récupérer de l’information sur Internet est Scrapy. Il s’agit d’un scraper entièrement personnalisable, en d’autres termes un petit robot que vous pouvez configurer vous-même pour qu’il cherche ce que vous souhaitez.

Pour l’installer, nous écrivons la ligne de commande suivante dans la console :

>>> python3 -m pip install scrapy

C’est d’ailleurs la toute première instruction de leur page d’accueil.

Et voilà, c’est installé !

Le fichier requirements.txt

Une bonne pratique est de réunir toutes les librairies externes dans un fichier qui s’appelle  requirements.txt  et qui se trouve à la racine de votre dossier (au même niveau que  san_antonio.py ). Ainsi, il vous suffit d’écrire  python3 -m pip install -r requirements.txt  pour que toutes les librairies s’installent d’un seul coup !

Avant de continuer et de configurer Scrapy, j’ai nettoyé un peu le code en le réorganisant. Je vous laisse regarder avant de passer à la suite !

# -*- coding: utf8 -*-
import json
import random
# Give a Json file and return a List
def read_values_from_json(path, key):
values = []
with open(path) as f:
data = json.load(f)
for entry in data:
values.append(entry[key])
return values
# Give a json and return a list
def clean_strings(sentences):
cleaned = []
# Store quotes on a list. Create an empty list and add each sentence one by one.
for sentence in sentences:
# Clean quotes from whitespace and so on
clean_sentence = sentence.strip()
# don't use extend as it adds each letter one by one!
cleaned.append(clean_sentence)
return cleaned
# Return a random item in a list
def random_item_in(object_list):
rand_numb = random.randint(0, len(object_list) - 1)
return object_list[rand_numb]
# Return a random value from a json file
def random_value(source_path, key):
all_values = read_values_from_json(source_path, key)
clean_values = clean_strings(all_values)
return random_item_in(clean_values)
#####################
###### QUOTES #######
#####################
# Gather quotes from San Antonio
def random_quote():
return random_value('quotes.json', 'quote')
######################
#### CHARACTERS ######
######################
# Gather characters from Wikipedia
def random_character():
return random_value('characters.json', 'character')
######################
#### INTERACTION ######
######################
# Print a random sentence.
def print_random_sentence():
rand_quote = random_quote()
rand_character = random_character()
print(">>>> {} a dit : {}".format(rand_character, rand_quote))
def main_loop():
while True:
print_random_sentence()
message = ('Voulez-vous voir une autre citation ?'
'Pour sortir du programme, tapez [B].')
choice = input(message).upper()
if choice == 'B':
break
# This will stop the loop!
if __name__ == '__main__':
main_loop()

C'est quoi cette ligne  __name__ == '__main__':  ?

Une fois n'est pas coutume, je vous donne un code tout cuit ! Vous apprendrez à l'écrire vous-mêmes en avançant dans Python. Vous êtes trop impatient·e·s pour attendre ? C'est le moment d'une petite recherche sur votre moteur de recherche préféré ! :D

Bien, nous sommes prêt·e·s à commencer.

Utiliser Scrapy

Mon objectif n’est pas de faire un cours sur Scrapy mais de vous montrer comment lire une documentation. Vous verrez, c’est parfois facile, parfois moins, et il n’y a pas de règle précise. L’essentiel est de s’accrocher !

Heureusement pour nous, les développeurs derrière Scrapy ont tout prévu. Ils ont créé un robot d’exemple avec toutes les instructions ! \o/

À nous de l’adapter !

Suivons les instructions et créons un nouveau document  characters_scrapper.py . A l’intérieur, je colle le code fourni par Scrapy et je commence à l’adapter.

Comment fonctionne un scraper ?

Il va sur une url que nous lui donnons puis va trouver les éléments qui correspondent à un sélecteur CSS.

CSS ? Pour Couch Surfer Stylé ?

😀

Non… Pour Cascading StyleSheet. Vous n’avez pas besoin d’être expert en CSS pour configurer un scraper basique. Il vous suffit de trouver le sélecteur.

CSS est un langage qui sert à la mise en page d’un site. Sans CSS, le web est bien triste !

Démonstration !

Rendez-vous sur cette page Wikipedia qui affiche une liste de personnages. Nous voulons récupérer le nom de tous les personnages.

Afin de trouver le sélecteur, je clique droit sur l’élément que je souhaite cibler et je clique sur “inspecter l’élément”. Le sélecteur est le nom de la balise HTML (a dans mon cas).

Sans aucune notion d’HTML et de CSS il n’est pas possible de configurer un scraper. Mais pas de panique ! Vous pouvez reprendre mon exemple et l’adapter à vos besoins très facilement. Et vous pourrez approfondir vos notions d’HTML et CSS plus tard dans ce cours.

Voici mon scraper :

import scrapy
class BlogSpider(scrapy.Spider):
name = 'characterspider'
start_urls = ['https://fr.wikipedia.org/wiki/Cat%C3%A9gorie:Personnage_d\'animation']
def parse(self, response):
for link in response.css('div#mw-pages div.mw-content-ltr li'):
yield {'character': link.css('a ::text').extract_first()}

Pour récupérer les personnages, et les stocker dans un nouveau fichier  characters.json , je lance la commande suivante :  

$ scrapy runspider characters.py -o characters.json

Et là, magie ! Tous mes personnages apparaissent !

Je vous laisse prendre connaissance avec l’intégralité du code à cette adresse :  voir le code final du Scraper.

Bravo ! C’est terminé ! Vous pouvez être fièr·e de vous !

Vous connaissez maintenant l’existence des scrapers et vous avez une petite idée des informations que vous pouvez récolter.

Pour information, ces robots sont utilisés par de nombreuses industries pour agréger les données “publiques” accessibles librement ou pour publier du contenu massivement en l’automatisant. Vous pourriez ainsi, tout à fait illégalement, scraper le site du Monde, copier l’intégralité des articles et les publier sur votre site. Il s’agit d’une technique si répandue que Google a créé un formulaire pour dénoncer les sites de scraping ! Lire l’article de MyPoseo sur Google Scraper Report.

L’utilisation de robot est également une technique d’acquisition assez répandue. Airbnb a ainsi utilisé un scraper pour augmenter sa base d’utilisateurs (lire l’analyse de GrowthHackers 🇬🇧) !

Sans devenir parano, songez à toutes les données que de tels robots peuvent récupérer sur vous...

Code de ce chapitre

 Cliquez sur l'image pour visualiser le code source ou cliquez sur ce lien.

Pour télécharger le projet, cliquez sur "Clone or Download" puis sur "Download Zip".

Cliquez sur l'image !
Cliquez sur l'image !
Exemple de certificat de réussite
Exemple de certificat de réussite