Construire une base de données relationnelle

Partie 2
Chapitre 4 sur 4
Partie 2 – Collecter des données sur le web avec Python

Extraire les données

Maintenant, nous avons une fonction qui permet de créer une liste contenant les liens hypertextes de la page web. Essayons-la !

links = get()
links

Cette liste contient tous les liens hypertextes de la page web. Chaque lien redirige vers un fichier ‘zip’ à télécharger qui contient un fichier ‘csv’. Cependant notre objectif est de télécharger uniquement les fichiers ‘csv’ contenus dans les fichiers ‘zips’.

  • Créons une deuxième fonction que nous appelerons download() qui permet d’extraire les fichiers csv contenus dans les liens hypertextes. Nous allons parcourir la liste des URLs et utiliser la fonction get du module Requests pour obtenir les réponses de chaque URL.

def download(urls):
    for i in urls:
        zipfile_url=i
        r = requests.get(zipfile_url)

  • La réponse HTTP contient diverses informations. Parmi les informations, il y a l’en-tête (headers) et le corps (content). L’en-tête contient le code du statut de la réponse (200), des informations sur le serveur, sur les dates de modification, sur le type de contenu, etc. Nous souhaitons extraire les contenus (le corps ‘content’) des fichiers de type zips.

if r.headers['content-type'].lower().startswith('application/zip'):

  • Une fois la condition mise sur le type de contenu (nous voulons les fichiers zips), il faut lire le corps de la réponse (le contenu). Le contenu étant un binaire dans une archive zip, nous allons créer un objet suivant le même processus.

z = zipfile.ZipFile(io.BytesIO(r.content))

  • Enfin, nous pouvons extraire le contenu du fichier zip et l’enregistrer dans l’emplacement souhaité. Nous allons créer un répertoire « Fichiers_scrapés » dans l’emplacement BASE et y extraire les fichiers csv.

rep_desti = os.path.join(BASE, "Fichiers_scrapés")
z.extractall(rep_desti)
return rep_desti

  • Nous pouvons maintenant lancer notre fonction ‘download()’ avec la liste des URLs.

download(links)

Code complet

def download(urls):
    for i in urls:
        zipfile_url=i
        r = requests.get(zipfile_url)
        if r.headers['content-type'].lower().startswith('application/zip'):
            z = zipfile.ZipFile(io.BytesIO(r.content))
            rep_desti = os.path.join(BASE, "Fichiers_scrapés")
            z.extractall(rep_desti)
return rep_desti