A kennsla frá Semalt: Vefur skafinn í Python

Ég hef heimsótt KinoPoisk (rússneska útgáfu af IMDB) undanfarið og komst að því að í gegnum árin tókst mér að meta yfir 1000 kvikmyndir. Ég hélt að það væri fróðlegt að rannsaka þessi gögn nánar: hafa kvikmyndarsmekkur minn breyst með tímanum? Á hvaða árstíðum horfi ég á fleiri kvikmyndir?

En áður en við greinum og byggjum fallega grafík verðum við að fá gögnin. Því miður hafa margar þjónustur ekki opinber API, svo þú verður að bretta upp ermarnar og greina html síðurnar.

Þessi grein er ætluð þeim sem alltaf vildu læra að nota Vefúreldingar en komust ekki í hönd eða vissu ekki hvar á að byrja.

Verkefni

Verkefni okkar er að vinna úr gögnum um kvikmyndir sem þegar hafa sést: titil myndarinnar, dagsetning og tími áhorfs, mat notandans.

Reyndar mun vinna okkar fara fram í tveimur áföngum:

Stig 1: halaðu niður og vistaðu HTML síður

2. stig: parse html á sniði sem hentar til frekari greiningar (csv, json, pandas dataframe osfrv.)

Hljóðfæri

Það er mikið af python-bókasöfnum til að senda http-beiðnir. Frægasta og mjög handhæga er Beiðnir.

Það er einnig nauðsynlegt að velja bókasafn fyrir HTML-þáttun.

BeatifulSoup, lxml

Þetta eru tvö vinsælustu bókasöfnin til að flokka html og það að velja eitt af þeim er bara persónulegt val. Ennfremur eru þessi bókasöfn nátengd hvort öðru: BeautifulSoup byrjaði að nota lxml sem innri þáttun til að flýta fyrir og í lxml var soupparser eining bætt við. Til að bera saman aðferðirnar mun ég greina gögnin með BeautifulSoup og nota XPath valara í einingunni lxml.html.

Sækir gögn

Byrjum að hala niður gögnum. Fyrst af öllu, við skulum bara reyna að fá síðuna eftir url og vista hana í staðbundinni skrá.

Við opnum skrána sem myndast og sjáum að það er ekki svo einfalt: vefurinn taldi okkur vera vélmenni og mun ekki sýna gögnin.

Við skulum komast að því hvernig vefurinn virkar

Vafrinn á ekki í neinum vandræðum með að fá upplýsingar frá vefnum. Við skulum sjá hvernig það sendir nákvæmlega beiðnina. Til að gera þetta notum við „Network“ spjaldið í „Developer Tools“ í vafranum (ég nota Firebug fyrir þetta), venjulega er beiðnin sem við þurfum lengst.

Eins og við sjáum sendir vafrinn einnig til hausana UserAgent, kex og annan fjölda breytna. Í fyrsta lagi reynum við bara að senda réttan UserAgent í haus.

Í þetta skiptið tekst okkur vel og nú fáum við nauðsynleg gögn. Þess má geta að stundum kannar vefsíðan einnig réttmæti kex, en þá hjálpar fundur í bókasafni beiðna.

Sæktu öll verð

Nú getum við vistað eina síðu með afslætti. En venjulega hefur notandinn mikið af afslætti og það er nauðsynlegt að endurtaka allar síðurnar. Það er auðvelt að flytja blaðsíðunúmerið sem vekur áhuga okkar beint á slóðina.

Söfnun gagna frá HTML

Nú skulum við komast beint að því að safna gögnum úr HTML. Auðveldasta leiðin til að skilja hvernig HTML síða er uppbyggð er með því að nota aðgerðina „Skoða frumefni“ í vafranum. Í þessu tilfelli er allt nokkuð einfalt: allt borðið með taxta er í merkinu. Veldu þennan hnút:

frá bs4 innflutningi BeautifulSoup

frá lxml innflutningi html

# Falleg súpa

súpa = falleg súpa (texti)

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

# lxml

tré = html.fromstring (texti)

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

Við skulum læra hvernig á að draga fram rússneskan titil myndarinnar og tengil á síðu myndarinnar (einnig hvernig á að fá textann og gildi eigindarinnar).

Ef þú þarft að draga titil út á ensku, breyttu bara „nameRus“ í „nameEng“.

Úrslit

Við lærðum hvernig á að flokka vefsíður, kynntumst bókasafnskröfum, BeautifulSoup og lxml, auk móttekinna gagna sem henta til frekari greiningar á kvikmyndum sem þegar hafa sést á KinoPoisk.