En selvstudie fra Semalt: Webskrapning i Python

Jeg har besøgt KinoPoisk (russisk version af IMDB) for nylig og fundet ud af, at jeg gennem årene lykkedes at bedømme over 1000 film. Jeg troede, at det ville være interessant at undersøge disse data mere detaljerede: har min filmsmag ændret sig over tid? I hvilke årstider ser jeg flere film?

Men inden vi analyserer og bygger smuk grafik, er vi nødt til at hente dataene. Desværre har mange tjenester ikke offentlig API, så du er nødt til at rulle ærmerne op og analysere html-siderne.

Denne artikel er beregnet til dem, der altid har ønsket at lære, hvordan man bruger Web-ophugning, men ikke fik deres hånd på det eller ikke vidste, hvor de skal starte.

Opgave

Vores opgave er at udtrække data om allerede set film: filmens titel, dato og klokkeslæt for se, brugerens vurdering.

Faktisk vil vores arbejde blive udført i to faser:

Trin 1: download og gem HTML-sider

Trin 2: analyser html i et format, der er egnet til yderligere analyse (csv, json, pandas dataframe osv.)

Instrumenter

Der er en masse python-biblioteker til afsendelse af http-anmodninger. Den mest berømte og meget praktiske er Forespørgsler.

Det er også nødvendigt at vælge et bibliotek til parsning af html.

BeatifulSoup, lxml

Dette er de to mest populære biblioteker til parsning af html, og at vælge et af dem er bare en personlig præference. Desuden er disse biblioteker tæt forbundet med hinanden: BeautifulSoup begyndte at bruge lxml som en intern parser til acceleration, og i lxml blev der tilføjet et soupparser-modul. For at sammenligne tilgange skal jeg analysere dataene med BeautifulSoup og bruge XPath-vælgere i modulet lxml.html.

Download af data

Lad os begynde at downloade data. Først og fremmest, lad os bare prøve at få siden efter url og gemme den i en lokal fil.

Vi åbner den resulterende fil og ser, at det ikke er så enkelt: webstedet betragtede os som robot og viser ikke dataene.

Lad os finde ud af, hvordan webstedet fungerer

Browseren har ikke noget problem med at få information fra webstedet. Lad os se, hvordan den nøjagtigt sender anmodningen. For at gøre dette bruger vi panelet "Netværk" i "Udviklerværktøjer" i browseren (jeg bruger Firebug til dette), normalt er den anmodning, vi har brug for, den længste.

Som vi kan se, sender browseren også overskrifter UserAgent, cookie og et andet antal parametre. Først skal vi bare prøve at sende korrekt UserAgent til en header.

Denne gang har vi succes, og nu får vi de nødvendige data. Det er værd at bemærke, at webstedet undertiden også kontrollerer gyldigheden af cookien, i hvilket tilfælde sessioner i Requests-biblioteket hjælper.

Download alle priser

Nu er vi i stand til at gemme en side med priser. Men normalt har brugeren en masse priser, og det er nødvendigt at iterere gennem alle sider. Det sidetal, der interesserer os, er let at overføre direkte til url'en.

Indsamling af data fra html

Lad os nu komme direkte i at indsamle dataene fra html. Den nemmeste måde at forstå, hvordan html-siden er struktureret, er ved at bruge funktionen "Kontroller element" i browseren. I dette tilfælde er alt ganske enkelt: hele tabellen med satser er i tagget. Vælg denne knude:

fra bs4 import BeautifulSoup

fra lxml import html

# Smuk suppe

suppe = smuk suppe (tekst)

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

# lxml

træ = html.fromstring (tekst)

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

Lad os lære, hvordan man trækker russisk titel på filmen og et link til filmens side (også hvordan man får teksten og værdien af attributten).

Hvis du har brug for at udtrække titel på engelsk, skal du bare ændre "nameRus" til "nameEng".

Resultater

Vi lærte, hvordan man analyserer websteder, blev fortrolige med biblioteksanmodninger, BeautifulSoup og lxml samt modtagne data, der er egnede til yderligere analyse af allerede set film på KinoPoisk.

mass gmail