Un tutorial da Semalt: Web Scraping In Python

Ho visitato KinoPoisk (versione russa di IMDB) di recente e ho scoperto che nel corso degli anni sono riuscito a valutare oltre 1000 film. Ho pensato che sarebbe stato interessante approfondire la ricerca di questi dati: i gusti dei miei film sono cambiati nel tempo? In quali stagioni dell'anno guardo più film?

Ma prima di analizzare e costruire una grafica meravigliosa, dobbiamo ottenere i dati. Sfortunatamente, molti servizi non hanno API pubbliche, quindi devi rimboccarti le maniche e analizzare le pagine html.

Questo articolo è destinato a coloro che hanno sempre voluto imparare a utilizzare Web Scrapping ma non ci hanno messo le mani o non sapevano da dove iniziare.

Compito

Il nostro compito è quello di estrarre i dati sui film già visti: il titolo del film, la data e l'ora della visione, la valutazione dell'utente.

In effetti, il nostro lavoro verrà svolto in 2 fasi:

Fase 1: scaricare e salvare pagine html

Fase 2: analizzare HTML in un formato adatto per ulteriori analisi (csv, json, pandas dataframe ecc.)

strumenti

Esistono molte librerie Python per l'invio di richieste http. Il più famoso e molto utile è Richieste.

È anche necessario scegliere una libreria per l'analisi html.

BeatifulSoup, lxml

Queste sono le due librerie più popolari per l'analisi dell'html e sceglierne una è solo una preferenza personale. Inoltre, queste librerie sono strettamente collegate tra loro: BeautifulSoup ha iniziato a utilizzare lxml come parser interno per l'accelerazione e in lxml è stato aggiunto un modulo soupparser. Per confrontare gli approcci, analizzerò i dati con BeautifulSoup e usando i selettori XPath nel modulo lxml.html.

Download dei dati

Iniziamo a scaricare i dati. Prima di tutto, proviamo a ottenere la pagina tramite url e salvarla in un file locale.

Apriamo il file risultante e vediamo che non è così semplice: il sito ci ha considerato robot e non mostrerà i dati.

Scopriamo come funziona il sito

Il browser non ha problemi a ottenere informazioni dal sito. Vediamo come invia esattamente la richiesta. Per fare ciò, utilizziamo il pannello "Rete" in "Strumenti per gli sviluppatori" nel browser (per questo utilizzo Firebug), in genere la richiesta di cui abbiamo bisogno è la più lunga.

Come possiamo vedere, il browser invia anche alle intestazioni UserAgent, cookie e un altro numero di parametri. Innanzitutto, proveremo a inviare UserAgent corretto a un'intestazione.

Questa volta abbiamo successo e ora ci vengono dati i dati necessari. Vale la pena notare che a volte il sito controlla anche la validità dei cookie, nel qual caso le sessioni nella libreria Richieste aiuteranno.

Scarica tutte le tariffe

Ora siamo in grado di salvare una pagina con le tariffe. Ma di solito l'utente ha molte tariffe ed è necessario scorrere tutte le pagine. Il numero di pagina che ci interessa è facile da trasferire direttamente all'URL.

Raccolta di dati da HTML

Ora passiamo direttamente alla raccolta dei dati da HTML. Il modo più semplice per capire come è strutturata la pagina html è utilizzare la funzione "Ispeziona elemento" nel browser. In questo caso, tutto è abbastanza semplice: l'intera tabella con le tariffe è nel tag. Seleziona questo nodo:

da bs4 importare BeautifulSoup

da lxml import html

# Zuppa bella

soup = BeautifulSoup (testo)

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

# lxml

tree = html.fromstring (testo)

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

Impariamo come estrarre il titolo russo del film e un link alla pagina del film (anche come ottenere il testo e il valore dell'attributo).

Se devi estrarre il titolo in inglese, modifica "nameRus" in "nameEng".

risultati

Abbiamo imparato ad analizzare i siti Web, abbiamo fatto conoscenza con le richieste di librerie, BeautifulSoup e lxml, oltre a ricevere dati adatti per un'ulteriore analisi dei film già visti su KinoPoisk.