Vadnica iz Semalta: Spletna strganja v Pythonu

Pred kratkim sem obiskal KinoPoisk (ruska različica IMDB) in ugotovil, da sem z leti uspel oceniti več kot 1000 filmov. Mislil sem, da bi bilo zanimivo podrobneje raziskati te podatke: so se moji filmski okusi sčasoma spremenili? V katerih letnih časih gledam več filmov?

Toda preden analiziramo in zgradimo čudovito grafiko, moramo pridobiti podatke. Žal številne storitve nimajo javnega API-ja, zato morate zavihati rokave in razčleniti html strani.

Ta članek je namenjen tistim, ki so se vedno želeli naučiti uporabljati spletno zapisovanje, vendar se tega niso lotili ali niso vedeli, kje začeti.

Naloga

Naša naloga je pridobiti podatke o že gledanih filmih: naslov filma, datum in čas gledanja, uporabnikova ocena.

Dejansko bomo naše delo opravili v dveh fazah:

Prva faza: prenos in shranjevanje html strani

2. faza: razčlenite html v obliki, primerni za nadaljnjo analizo (csv, json, podatkovni okvir pand itd.)

Instrumenti

Obstaja veliko knjižnic python za pošiljanje http-zahtev. Najbolj znana in zelo priročna je Zahteva.

Za razčlenitev html-jev je treba izbrati tudi knjižnico.

BeatifulSoup, lxml

To sta dve najbolj priljubljeni knjižnici za razčlenitev html-a in izbira ene izmed njih je le osebna želja. Poleg tega so te knjižnice med seboj tesno povezane: BeautifulSoup je za pospeševanje začel uporabljati lxml kot notranji razčlenjevalec, v lxml pa je bil dodan modul za juhe. Za primerjavo pristopov bom razčlenil podatke s programom BeautifulSoup in z uporabo izbirnikov XPath v modulu lxml.html.

Prenos podatkov

Začnimo s prenosom podatkov. Najprej poskusimo stran pridobiti po URL-ju in jo shraniti v lokalno datoteko.

Odpremo nastalo datoteko in vidimo, da ni tako preprosto: spletno mesto nas je obravnavalo kot robota in podatkov ne bo pokazalo.

Ugotovimo, kako deluje spletno mesto

Brskalnik nima težav pri pridobivanju informacij s spletnega mesta. Poglejmo, kako natančno pošlje zahtevo. Da bi to naredili, v brskalniku uporabimo ploščo "Network" v razdelku "Orodja za razvijalce" (za to uporabljam Firebug), ponavadi je zahteva, ki jo potrebujemo, najdaljša.

Kot lahko vidimo, brskalnik pošilja tudi glave UserAgent, piškotek in drugo število parametrov. Najprej bomo samo poskusili poslati pravilno UserAgent v glavo.

Tokrat smo uspešni in zdaj dobivamo potrebne podatke. Omeniti velja, da spletno mesto včasih preveri tudi veljavnost piškotka, v tem primeru pa bodo pomagale seje v knjižnici zahtevkov.

Prenesite vse cene

Zdaj lahko shranimo eno stran s cenami. Ponavadi ima uporabnik veliko stopenj, zato je treba iterati po vseh straneh. Številko strani, ki nas zanima, je enostavno prenesti neposredno na URL.

Zbiranje podatkov iz Html

Zdaj pa se lotimo neposrednega zbiranja podatkov iz html-a. Najlažji način za razumevanje strukture strani html je s pomočjo funkcije "Pregled element" v brskalniku. V tem primeru je vse precej preprosto: celotna tabela s stopnjami je v oznaki. Izberite to vozlišče:

iz bs4 uvoz BeautifulSoup

iz lxml uvoz html

# Lepa juha

juha = BeautifulSoup (besedilo)

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

# lxml

drevo = html.fromstring (besedilo)

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

Naučimo se, kako izvleči ruski naslov filma in povezavo do strani filma (tudi, kako pridobiti besedilo in vrednost atributa).

Če morate izvleči naslov v angleščini, preprosto spremenite "nameRus" v "nameEng".

Rezultati

Naučili smo se razčleniti spletna mesta, se seznanili z zahtevami knjižnic, BeautifulSoup in lxml ter prejeli podatke, primerne za nadaljnjo analizo že gledanih filmov na KinoPoisk.