Un tutorial din Semalt: Scraping Web în Python

Am vizitat recent KinoPoisk (versiunea rusă a IMDB) și am aflat că, de-a lungul anilor, am reușit să notez peste 1000 de filme. M-am gândit că ar fi interesant să cercetăm aceste date mai detaliat: gusturile filmului meu s-au schimbat în timp? În ce anotimpuri ale anului urmăresc mai multe filme?

Dar înainte de a analiza și construi grafică frumoasă, trebuie să obținem datele. Din păcate, multe servicii nu au API publică, așa că trebuie să îți rotiți mânecile și să analizezi paginile html.

Acest articol este destinat celor care au dorit întotdeauna să învețe cum să folosească Scrapping Web, dar nu au pus mâna pe el sau nu au știut de unde să înceapă.

Sarcină

Sarcina noastră este să extragem datele despre filmele deja văzute: titlul filmului, data și ora vizionării, evaluarea utilizatorului.

De fapt, munca noastră va fi realizată în 2 etape:

Etapa 1: descărcați și salvați pagini html

Etapa 2: analizează html într-un format adecvat pentru analize ulterioare (csv, json, panda dataframe etc.)

Instrumente

Există o mulțime de biblioteci piton pentru a trimite solicitări http. Cea mai cunoscută și foarte utilă este Cererile.

De asemenea, este necesar să alegeți o bibliotecă pentru analizarea html.

BeatifulSoup, lxml

Acestea sunt cele mai populare două biblioteci pentru analizarea html-ului și alegerea uneia dintre ele este doar o preferință personală. Mai mult, aceste biblioteci sunt strâns conectate între ele: BeautifulSoup a început să folosească lxml ca analizor intern pentru accelerare, iar în lxml, a fost adăugat un modul soupparser. Pentru a compara abordările, voi analiza datele cu BeautifulSoup și folosind selectoare XPath în modulul lxml.html.

Descărcarea datelor

Să începem descărcarea datelor. În primul rând, să încercăm doar să obținem pagina prin url și să o salvăm într-un fișier local.

Deschidem fișierul rezultat și vedem că nu este atât de simplu: site-ul ne-a considerat robot și nu va afișa datele.

Să aflăm cum funcționează site-ul

Browserul nu are nicio problemă în obținerea informațiilor de pe site. Să vedem cum trimite exact cererea. Pentru a face acest lucru, utilizăm panoul „Rețea” din „Instrumente pentru dezvoltatori” din browser (folosesc Firebug pentru asta), de obicei, cererea de care avem nevoie este cea mai lungă.

După cum putem vedea, browserul trimite, de asemenea, la anteturile UserAgent, cookie și un alt număr de parametri. În primul rând, vom încerca doar să trimitem UserAgent corect la un antet.

De data aceasta avem succes, iar acum ni se oferă datele necesare. Este demn de remarcat faptul că uneori site-ul verifică și validitatea cookie-urilor, caz în care sesiunile din biblioteca de solicitări vă vor fi de ajutor.

Descărcați toate tarifele

Acum putem salva o pagină cu tarife. Însă, de obicei, utilizatorul are o mulțime de rate și este necesar să repetați toate paginile. Numărul paginii care ne interesează este ușor de transferat direct pe adresa URL.

Colectarea datelor de la Html

Acum să trecem direct la colectarea datelor de la html. Cel mai simplu mod de a înțelege modul în care este structurată pagina html este folosind funcția „Inspecți elementul” din browser. În acest caz, totul este destul de simplu: întregul tabel cu rate este în etichetă. Selectați acest nod:

din bs4 import BeautifulSoup

de la lxml import html

# Supa frumoasa

ciorba = BeautifulSoup (text)

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

# lxml

tree = html.fromstring (text)

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

Să învățăm cum să scoatem titlul rusesc al filmului și un link către pagina filmului (de asemenea, cum să obțineți textul și valoarea atributului).

Dacă trebuie să extrageți titlul în limba engleză, schimbați „nameRus” în „nameEng”.

Rezultate

Am învățat cum să analizăm site-urile web, am făcut cunoștință cu bibliotecile Requests, BeautifulSoup și lxml, precum și am primit date adecvate pentru analiza ulterioară a filmelor deja văzute pe KinoPoisk.