Stop guessing what′s working and start seeing it for yourself.
Login ou cadastro
Q&A
Question Center →

Un tutorial di Semalt: Web Scraping in Python

Recentemente ho visitato KinoPoisk (versione russa di IMDB) e ho scoperto che oltre anni sono riuscito a valutare oltre 1000 film. Ho pensato che sarebbe stato interessante ricercare questi dati in modo più dettagliato: i gusti del mio film sono cambiati nel tempo? Durante 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 come usare Web Scrapping ma non ci hanno messo le mani sopra o non sapevano da dove cominciare.

Compito

Il nostro compito è 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: parse html in un formato adatto per ulteriori analisi (csv, json, pandas dataframe ecc.)

Instruments

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

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

BeatifulSoup, lxml

Queste sono le due librerie più popolari per l'analisi di html e la scelta di una di esse è solo una preferenza personale. Inoltre, queste librerie sono strettamente collegate l'una all'altra: BeautifulSoup ha iniziato a usare 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 utilizzando i selettori XPath nel modulo lxml.html.

Download dei dati

Iniziamo a scaricare i dati. Prima di tutto, proviamo a recuperare la pagina per url e salvarla su un file locale.

Apriamo il file risultante e vediamo che non è così semplice: il sito ci considera robot e non mostra i dati.

Scopriamo come funziona il sito

Il browser non ha problemi ad ottenere informazioni dal sito. Vediamo esattamente come invia la richiesta. Per fare ciò usiamo il pannello "Rete" negli "Strumenti per sviluppatori" nel browser (io uso Firebug per questo), di solito, la richiesta di cui abbiamo bisogno è la più lunga.

Come possiamo vedere, il browser invia anche intestazioni UserAgent, cookie e un altro numero di parametri. In primo luogo, cercheremo semplicemente di 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 un sacco di 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 "Controlla elemento" nel browser. In questo caso, tutto è abbastanza semplice: l'intera tabella con le tariffe è nel tag. Seleziona questo nodo:

da bs4 import BeautifulSoup

da lxml import html

# Beautiful Soup

soup = BeautifulSoup (text)

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 è necessario estrarre il titolo in inglese basta cambiare "nameRus" in "nameEng".

Risultati

Abbiamo imparato come analizzare i siti Web, avere familiarità con le librerie Requests, BeautifulSoup e lxml, nonché i dati ricevuti adatti per ulteriori analisi dei film già visti su KinoPoisk.

Post a comment

Post Your Comment

Skype

semaltcompany

WhatsApp

16468937756

Telegram

Semaltsupport