Vadovas iš „Semalt“: „Web Scraping In Python“

Neseniai lankiausi „KinoPoisk“ (rusiška IMDB versija) ir sužinojau, kad metams bėgant man pavyko įvertinti daugiau nei 1000 filmų. Pagalvojau, kad būtų įdomu ištirti šiuos duomenis išsamesniais būdais: ar bėgant laikui pasikeitė mano filmo skonis? Kuriais metų laikais aš žiūriu daugiau filmų?

Bet prieš analizuodami ir kurdami gražią grafiką, turime gauti duomenis. Deja, daugelyje paslaugų nėra viešojo API, todėl jūs turite apsiversti rankoves ir išanalizuoti html puslapius.

Šis straipsnis skirtas tiems, kurie visada norėjo išmokti naudotis žiniatinklio žiniatinklio žiniaraščiu, bet nesigilino į tai ar nežinojo, nuo ko pradėti.

Užduotis

Mūsų užduotis yra išgauti duomenis apie jau matytus filmus: filmo pavadinimą, žiūrėjimo datą ir laiką, vartotojo vertinimą.

Tiesą sakant, mūsų darbas bus atliekamas dviem etapais:

1 etapas: atsisiųskite ir išsaugokite html puslapius

2 etapas: analizuokite html formatu, tinkamu tolesnei analizei (csv, json, pandas dataframe ir kt.)

Prietaisai

Yra daugybė python bibliotekų, skirtų siųsti http užklausas. Garsiausias ir labai patogus yra „Prašymai“.

Taip pat būtina pasirinkti HTML analizės biblioteką.

„BeatifulSoup“, lxml

Tai yra dvi populiariausios html analizės bibliotekos, o pasirinkti vieną iš jų yra tik asmeninis pasirinkimas. Be to, šios bibliotekos yra glaudžiai susijusios viena su kita: „BeautifulSoup“ pradėjo naudoti „lxml“ kaip vidinį greitintuvo analizatorių, o „xxml“ buvo pridėtas „sriubos paketo“ modulis. Norėdami palyginti metodus, išanalizuosiu duomenis naudodamas „BeautifulSoup“ ir naudodamas XPath parinkiklius modulyje lxml.html.

Duomenų atsisiuntimas

Pradėkime atsisiųsti duomenis. Visų pirma, pabandykime gauti puslapį URL ir išsaugoti jį vietiniame faile.

Atidarome gautą failą ir pamatome, kad jis nėra toks paprastas: svetainė mus laikė robotais ir nerodys duomenų.

Sužinokime, kaip veikia svetainė

Naršyklė neturi problemų iš svetainės gauti informaciją. Pažiūrėkime, kaip tiksliai ji siunčia užklausą. Tam naudojame naršyklės „Kūrėjo įrankių“ skydelį „Tinklas“ (tam aš naudoju „Firebug“), paprastai užklausa, kurios mums reikia, yra ilgiausia.

Kaip matome, naršyklė taip pat siunčia antraštes „UserAgent“, slapuką ir kitą parametrų skaičių. Pirmiausia tiesiog pabandysime nusiųsti teisingą „UserAgent“ į antraštę.

Šį kartą mums sekasi, o dabar mums suteikiami reikiami duomenys. Verta paminėti, kad kartais svetainė taip pat patikrina slapuko galiojimą, tokiu atveju sesijos užklausų bibliotekoje padės.

Atsisiųskite visas kainas

Dabar mes galime išsaugoti vieną puslapį su įkainiais. Bet paprastai vartotojas turi daug įkainių, todėl būtina kartoti visuose puslapiuose. Mus dominantį puslapio numerį lengva perkelti tiesiai į URL.

Duomenų rinkimas iš HTML

Dabar pereikime prie duomenų rinkimo iš HTML. Lengviausias būdas suprasti, kaip html puslapis yra struktūruotas, naudojant naršyklės funkciją „Patikrinti elementą“. Šiuo atveju viskas yra gana paprasta: visa lentelė su įkainiais yra etiketėje. Pasirinkite šį mazgą:

iš „bs4“ importuoti „BeautifulSoup“

iš lxml importuoti html

# Graži sriuba

sriuba = „BeautifulSoup“ (tekstas)

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

# lxml

medis = html.fromstring (tekstas)

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

Išmokime, kaip ištraukti rusišką filmo pavadinimą ir nuorodą į filmo puslapį (taip pat kaip gauti tekstą ir atributo vertę).

Jei jums reikia išgauti pavadinimą anglų kalba, tiesiog pakeiskite „nameRus“ į „nameEng“.

Rezultatai

Mes išmokome analizuoti svetaines, susipažinome su bibliotekų užklausomis, „BeautifulSoup“ ir „lxml“, taip pat gavome duomenis, tinkamus tolesnei jau matytų filmų „KinoPoisk“ analizei.