Tutorial iz Semalta: Web Scraping In Python

Nedavno sam posjetio KinoPoisk (ruska verzija IMDB-a) i saznao da sam tijekom godina uspio ocijeniti preko 1000 filmova. Mislio sam da bi bilo zanimljivo istražiti ove podatke: jesu li se moji filmski ukusi vremenom promijenili? Tijekom kojih godišnjih doba gledam još filmova?

Ali prije nego što analiziramo i izgradimo prekrasnu grafiku, moramo doći do podataka. Nažalost, mnoge usluge nemaju javni API, pa morate zasukati rukave i raščlaniti html stranice.

Ovaj je članak namijenjen onima koji su uvijek željeli naučiti kako koristiti Web Scrapping, ali nisu uspjeli dobiti ili nisu znali gdje započeti.

Zadatak

Naš je zadatak izvući podatke o već gledanim filmovima: naslov filma, datum i vrijeme gledanja, korisničku ocjenu.

U stvari, naš posao će se obavljati u 2 faze:

Prva faza: preuzimanje i spremanje html stranica

Faza 2: raščlaniti html u formatu prikladnom za daljnju analizu (csv, json, podatkovni okvir pande itd.)

instrumenti

Postoji puno knjižnica python za slanje http-zahtjeva. Najpoznatiji i vrlo zgodan je zahtjev.

Za analizu html-a potrebno je odabrati i biblioteku.

BeatifulSoup, lxml

To su dvije najpopularnije biblioteke za analizu html-a, a odabir jedne od njih je samo osobna preferencija. Štoviše, ove su knjižnice usko povezane jedna s drugom: BeautifulSoup je počeo upotrebljavati lxml kao unutarnji raščlanjivač za ubrzanje, a u lxml je dodan modul za razdvajanje supa. Da bih usporedio pristupe, analizirat ću podatke s BeautifulSoupom i pomoću XPath selektora u modulu lxml.html.

Preuzimanje podataka

Počnimo s preuzimanjem podataka. Prije svega, pokušajmo doći do stranice url i spremiti je u lokalnu datoteku.

Otvorimo rezultirajuću datoteku i vidimo da nije sve tako jednostavno: web lokacija nas je smatrala robotom i neće prikazivati podatke.

Otkrijmo kako stranica radi

Preglednik nema problema s dobivanjem informacija s web mjesta. Pogledajmo kako točno šalje zahtjev. Da bismo to učinili, koristimo ploču "Mreža" u "Alati za razvojne programere" u pregledniku (za to koristim Firebug), obično je zahtjev koji nam je potreban najduži.

Kao što vidimo, preglednik također šalje zaglavlja UserAgent, kolačić i drugi broj parametara. Prvo ćemo pokušati poslati ispravni UserAgent u zaglavlje.

Ovaj smo put uspješni, a sada nam se daju potrebni podaci. Vrijedi napomenuti da ponekad web mjesto također provjerava valjanost kolačića, u tom slučaju će vam pomoći sesije u biblioteci Zahtjevi.

Preuzmite sve cijene

Sada smo u mogućnosti da spremimo jednu stranicu s cijenama. Ali obično korisnik ima puno stopa, a potrebno je iterati kroz sve stranice. Broj stranice koji nas zanima lako je prenijeti izravno na URL.

Prikupljanje podataka s HTML-a

A sada krenimo izravno na prikupljanje podataka iz html-a. Najlakši način za razumijevanje strukture HTML stranice je korištenjem funkcije "Ispitaj element" u pregledniku. U ovom je slučaju sve prilično jednostavno: cijela tablica s stopama nalazi se u oznaci. Odaberite ovaj čvor:

iz bs4 uvoza BeautifulSoup

iz lxml uvoza html

# Lijepa juha

juha = BeautifulSoup (tekst)

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

# lxml

stablo = html.fromstring (tekst)

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

Naučimo kako izvući ruski naslov filma i vezu na stranicu filma (također kako doći do teksta i vrijednosti atributa).

Ako trebate izdvojiti naslov na engleskom jeziku, samo promijenite "nameRus" u "nameEng".

Rezultati

Naučili smo kako raščlaniti web stranice, upoznali smo se s zahtjevima knjižnica, BeautifulSoup i lxml, kao i dobili podatke pogodne za daljnju analizu već gledanih filmova na KinoPoisk.