Un tutoriel de Semalt: Web Scraping en Python

J'ai récemment visité KinoPoisk (version russe d'IMDB) et j'ai découvert qu'au fil des ans, j'ai réussi à évaluer plus de 1000 films. J'ai pensé qu'il serait intéressant de rechercher ces données plus en détail: les goûts de mon film ont-ils changé au fil du temps? Pendant quelles saisons de l'année est-ce que je regarde plus de films?

Mais avant d'analyser et de créer de beaux graphiques, nous devons obtenir les données. Malheureusement, de nombreux services n'ont pas d'API publique, vous devez donc retrousser vos manches et analyser les pages html.

Cet article est destiné à ceux qui ont toujours voulu apprendre à utiliser la mise à la ferraille Web, mais qui n'y ont pas mis la main ou ne savaient pas par où commencer.

Tâche

Notre tâche consiste à extraire les données sur les films déjà vus: le titre du film, la date et l'heure de visionnage, la note de l'utilisateur.

En fait, notre travail va se faire en 2 étapes:

Étape 1: télécharger et enregistrer des pages html

Étape 2: analyser le HTML dans un format adapté à une analyse plus approfondie (csv, json, pandas dataframe, etc.)

Instruments

Il existe de nombreuses bibliothèques python pour envoyer des requêtes http. Le plus célèbre et le plus pratique est celui des requêtes.

Il est également nécessaire de choisir une bibliothèque pour l'analyse html.

BeatifulSoup, lxml

Ce sont les deux bibliothèques les plus populaires pour analyser le HTML et choisir l'une d'entre elles n'est qu'une préférence personnelle. De plus, ces bibliothèques sont étroitement liées les unes aux autres: BeautifulSoup a commencé à utiliser lxml comme analyseur interne pour l'accélération, et en lxml, un module soupparser a été ajouté. Pour comparer les approches, je vais analyser les données avec BeautifulSoup et utiliser les sélecteurs XPath dans le module lxml.html.

Téléchargement des données

Commençons à télécharger des données. Tout d'abord, essayons simplement d'obtenir la page par URL et de l'enregistrer dans un fichier local.

Nous ouvrons le fichier résultant et voyons que ce n'est pas si simple: le site nous considérait comme un robot et n'affichera pas les données.

Voyons comment fonctionne le site

Le navigateur n'a aucun problème à obtenir des informations sur le site. Voyons comment exactement il envoie la demande. Pour ce faire, nous utilisons le panneau "Réseau" dans les "Outils du développeur" dans le navigateur (j'utilise Firebug pour cela), généralement, la demande dont nous avons besoin est la plus longue.

Comme nous pouvons le voir, le navigateur envoie également aux en-têtes UserAgent, cookie et un autre nombre de paramètres. Tout d'abord, nous allons simplement essayer d'envoyer le bon UserAgent dans un en-tête.

Cette fois, nous réussissons, et maintenant nous recevons les données nécessaires. Il convient de noter que parfois le site vérifie également la validité des cookies, auquel cas les sessions dans la bibliothèque de demandes seront utiles.

Télécharger tous les tarifs

Maintenant, nous pouvons enregistrer une page avec des tarifs. Mais généralement, l'utilisateur a beaucoup de tarifs, et il est nécessaire de parcourir toutes les pages. Le numéro de page qui nous intéresse est facile à transférer directement sur l'url.

Collecte de données à partir de HTML

Passons maintenant directement à la collecte des données html. La façon la plus simple de comprendre comment la page html est structurée est d'utiliser la fonction "Inspecter l'élément" dans le navigateur. Dans ce cas, tout est assez simple: l'intégralité du tableau des tarifs est dans le tag. Sélectionnez ce nœud:

de bs4 import BeautifulSoup

depuis lxml import html

# Belle soupe

soupe = BeautifulSoup (texte)

film_list = soup.find ('div', ('class': 'profileFilmsList'))

# lxml

tree = html.fromstring (texte)

film_list_lxml = tree.xpath ('// div [@class =' 'profileFilmList' ']') [0]

Apprenons à retirer le titre russe du film et un lien vers la page du film (également comment obtenir le texte et la valeur de l'attribut).

Si vous devez extraire le titre en anglais, remplacez simplement "nameRus" par "nameEng".

Résultats

Nous avons appris à analyser des sites Web, nous nous sommes familiarisés avec les bibliothèques Requests, BeautifulSoup et lxml, ainsi que les données reçues appropriées pour une analyse plus approfondie des films déjà vus sur KinoPoisk.