En tutorial fra Semalt: Web Scraping In Python

Jeg har besøkt KinoPoisk (russisk versjon av IMDB) nylig og fant ut at jeg gjennom årene klarte å rangere over 1000 filmer. Jeg tenkte at det ville være interessant å undersøke disse dataene mer detaljert: har filmsmakene mine endret seg over tid? I hvilke årstider ser jeg flere filmer?

Men før vi analyserer og bygger vakker grafikk, må vi få dataene. Dessverre har mange tjenester ikke offentlig API, så du må rulle opp ermene og analysere HTML-sidene.

Denne artikkelen er beregnet på de som alltid ønsket å lære hvordan du bruker Web Scrapping, men ikke fikk tak i den eller ikke visste hvor de skulle begynne.

Oppgave

Vår oppgave er å trekke ut dataene om allerede sett filmer: filmens tittel, dato og klokkeslett for se, brukerens rangering.

Faktisk skal arbeidet vårt gjøres i to trinn:

Trinn 1: last ned og lagre HTML-sider

Fase 2: analyser html i et format som er egnet for videre analyse (csv, json, pandas dataframe etc.)

instrumenter

Det er mange python-biblioteker for sending av http-forespørsler. Den mest kjente og veldig hendige er forespørsler.

Det er også nødvendig å velge et bibliotek for parsing av html.

BeatifulSoup, lxml

Dette er de to mest populære bibliotekene for parsing av html, og å velge ett av dem er bare en personlig preferanse. Dessuten er disse bibliotekene tett koblet til hverandre: BeautifulSoup begynte å bruke lxml som en intern parser for akselerasjon, og i lxml ble en soupparser-modul lagt til. For å sammenligne tilnærmingene, vil jeg analysere dataene med BeautifulSoup og bruke XPath-velgere i modulen lxml.html.

Laster ned data

La oss begynne å laste ned data. Først av alt, la oss bare prøve å få siden etter url og lagre den i en lokal fil.

Vi åpner den resulterende filen og ser at det ikke er så enkelt: nettstedet betraktet oss som robot og vil ikke vise dataene.

La oss finne ut hvordan nettstedet fungerer

Nettleseren har ikke noe problem med å få informasjon fra nettstedet. La oss se nøyaktig hvordan den sender forespørselen. For å gjøre dette bruker vi "Network" -panelet i "Developer Tools" i nettleseren (jeg bruker Firebug for dette), vanligvis er forespørselen vi trenger den lengste.

Som vi ser, sender nettleseren også overskrifter UserAgent, cookie og et annet antall parametere. Først skal vi bare prøve å sende riktig UserAgent til en topptekst.

Denne gangen lykkes vi, og nå får vi nødvendige data. Det er verdt å merke seg at noen ganger nettstedet også sjekker gyldigheten av informasjonskapsler, i hvilke tilfeller økter i Requests-biblioteket vil hjelpe.

Last ned alle priser

Nå kan vi lagre en side med priser. Men vanligvis har brukeren mange priser, og det er nødvendig å iterere gjennom alle sider. Sidetallet som interesserer oss er enkelt å overføre direkte til url.

Innsamling av data fra HTML

La oss nå komme direkte til å samle inn dataene fra html. Den enkleste måten å forstå hvordan html-siden er strukturert er ved å bruke funksjonen "Inspiser element" i nettleseren. I dette tilfellet er alt ganske enkelt: hele tabellen med priser er i taggen. Velg denne noden:

fra bs4 import BeautifulSoup

fra lxml import html

# Vakker suppe

suppe = BeautifulSoup (tekst)

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

# lxml

tree = html.fromstring (tekst)

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

La oss lære hvordan du drar ut russisk tittel på filmen og en lenke til filmens side (også hvordan du får teksten og verdien av attributtet).

Hvis du trenger å trekke ut tittelen på engelsk, bare endre "nameRus" til "nameEng".

resultater

Vi lærte hvordan vi skulle analysere nettsteder, ble kjent med biblioteksforespørsler, BeautifulSoup og lxml, samt mottatt data som er egnet for videre analyse av filmer som allerede er sett på KinoPoisk.

mass gmail