Juhendaja Semaltalt: veebi kraapimine Pythonis

Olen hiljuti külastanud KinoPoiskit (IMDB venekeelne versioon) ja avastasin, et aastate jooksul õnnestus mul hinnata üle 1000 filmi. Arvasin, et oleks huvitav neid andmeid lähemalt uurida: kas mu filmimaitse on aja jooksul muutunud? Millistel aastaaegadel ma rohkem filme vaatan?

Kuid enne ilusa graafika analüüsimist ja üles ehitamist peame andmed hankima. Kahjuks pole paljudel teenustel avalikku API-d, nii et peate varrukad üles keerama ja html-lehti parsima.

See artikkel on mõeldud neile, kes on alati tahtnud õppida veebirakenduse kasutamist, kuid ei saanud sellest kätt ega teadnud, kust alustada.

Ülesanne

Meie ülesanne on hankida andmed juba nähtud filmide kohta: filmi pealkiri, vaatamise kuupäev ja kellaaeg, kasutaja hinnang.

Tegelikult tehakse meie tööd kahes etapis:

1. etapp: laadige alla ja salvestage html-lehed

2. etapp: parserige html edasiseks analüüsiks sobivas vormingus (csv, json, pandas dataframe jne)

Instrumendid

Http-päringute saatmiseks on palju python-teeke. Kõige kuulsam ja käepärasem on taotlused.

Samuti on vaja valida teegi HTML-i parsimiseks.

BeatifulSoup, lxml

Need on kaks kõige populaarsemat teeki html-i parsimiseks ja ühe neist valimine on lihtsalt isiklik eelistus. Veelgi enam, need teegid on üksteisega tihedalt seotud: BeautifulSoup hakkas kiirenduse jaoks kasutama sisemist parserit lxml ja lxml-s lisati suppparser-moodul. Lähenemisviiside võrdlemiseks parseldan andmed BeautifulSoupiga ja XPath-selektorite abil moodulis lxml.html.

Andmete allalaadimine

Alustame andmete allalaadimist. Esiteks proovime lihtsalt saada lehe URL-i abil ja salvestada see kohalikku faili.

Avame saadud faili ja näeme, et see pole nii lihtne: sait pidas meid robotiks ega näita andmeid.

Saame teada, kuidas sait töötab

Brauseril pole probleeme saidilt teabe hankimisega. Vaatame, kui täpselt ta taotluse saadab. Selleks kasutame brauseri "Arendaja tööriistades" paneeli "Võrk" (selle jaoks kasutan Firebugi), tavaliselt on meil vajaminev taotlus kõige pikem.

Nagu näeme, saadab brauser ka päistesse UserAgent, küpsise ja veel mitu parameetrit. Esiteks proovime lihtsalt päisesse saata õige UserAgent.

Seekord oleme edukad ja nüüd antakse meile vajalikud andmed. Väärib märkimist, et mõnikord kontrollib sait ka küpsise kehtivust, sellisel juhul aitavad päringute teegis istungid.

Laadige alla kõik hinnad

Nüüd on meil võimalik salvestada üks leht koos tariifidega. Kuid tavaliselt on kasutajal palju tariife ja seda on vaja korrata kõigil lehtedel. Meid huvitavat lehe numbrit on lihtne otse URL-i üle kanda.

Andmete kogumine HTML-ist

Läheme nüüd otse andmete kogumisele HTML-ist. Lihtsaim viis html-lehe ülesehitusest aru saamiseks on brauseri funktsiooni "Kontrolli elementi" abil. Sel juhul on kõik üsna lihtne: kogu tabel koos määradega on sildis. Valige see sõlm:

alates bs4-st importige BeautifulSoup

alates lxml impordi html

# Ilus supp

supp = BeautifulSoup (tekst)

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

# lxml

puu = html.froming (tekst)

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

Õppime, kuidas tõmmata välja filmi venekeelne pealkiri ja link filmi lehele (ka kuidas saada tekst ja atribuudi väärtus).

Kui teil on vaja pealkiri inglise keeles lahti tõmmata, muutke "nameRus" väärtuseks "nameEng".

Tulemused

Õppisime veebisaitide sõelumist, tutvusime raamatukogude taotluste, BeautifulSoupi ja lxml-iga ning saime andmeid, mis sobivad juba KinoPoiskis nähtud filmide edasiseks analüüsimiseks.