Een tutorial van Semalt: webscraping in Python

Ik heb onlangs KinoPoisk (Russische versie van IMDB) bezocht en ontdekte dat ik in de loop der jaren meer dan 1000 films heb kunnen beoordelen. Ik dacht dat het interessant zou zijn om deze gegevens gedetailleerder te onderzoeken: is de smaak van mijn film in de loop van de tijd veranderd? In welke seizoenen van het jaar kijk ik meer films?

Maar voordat we prachtige grafische afbeeldingen analyseren en bouwen, moeten we de gegevens ophalen. Helaas hebben veel services geen openbare API, dus u moet uw handen uit de mouwen steken en de html-pagina's parseren.

Dit artikel is bedoeld voor diegenen die altijd al hebben willen leren om Web Scrapping te gebruiken, maar het niet in handen hebben gekregen of niet wisten waar ze moesten beginnen.

Taak

Onze taak is om de gegevens over reeds bekeken films te extraheren: de titel van de film, de datum en tijd van kijken, de beoordeling van de gebruiker.

Ons werk zal in feite in 2 fasen worden gedaan:

Fase 1: html-pagina's downloaden en opslaan

Fase 2: html parseren in een formaat dat geschikt is voor verdere analyse (csv, json, panda's dataframe etc.)

Instrumenten

Er zijn veel python-bibliotheken voor het versturen van http-verzoeken. De bekendste en erg handigste is Request.

Het is ook nodig om een bibliotheek te kiezen voor html-parsering.

BeatifulSoup, lxml

Dit zijn de twee meest populaire bibliotheken voor het ontleden van html en het kiezen van een van hen is slechts een persoonlijke voorkeur. Bovendien zijn deze bibliotheken nauw met elkaar verbonden: BeautifulSoup begon lxml te gebruiken als interne parser voor versnelling, en in lxml werd een soupparser-module toegevoegd. Om de benaderingen te vergelijken, zal ik de gegevens ontleden met BeautifulSoup en XPath-kiezers gebruiken in de module lxml.html.

Gegevens downloaden

Laten we beginnen met het downloaden van gegevens. Laten we eerst proberen de pagina op url te krijgen en deze op te slaan in een lokaal bestand.

We openen het resulterende bestand en zien dat het niet zo eenvoudig is: de site beschouwde ons als robot en geeft de gegevens niet weer.

Laten we eens kijken hoe de site werkt

De browser heeft geen probleem om informatie van de site te halen. Laten we eens kijken hoe het verzoek precies wordt verzonden. Om dit te doen gebruiken we het "Netwerk" paneel in de "Ontwikkelaarstools" in de browser (ik gebruik hiervoor Firebug), meestal is het verzoek dat we nodig hebben het langste.

Zoals we kunnen zien, verzendt de browser ook naar headers UserAgent, cookie en een ander aantal parameters. Eerst proberen we gewoon de juiste UserAgent naar een koptekst te sturen.

Deze keer zijn we succesvol en nu krijgen we de nodige gegevens. Het is vermeldenswaard dat de site soms ook de geldigheid van de cookie controleert, in welk geval sessies in de Request-bibliotheek zullen helpen.

Download alle tarieven

Nu kunnen we één pagina met tarieven opslaan. Maar meestal heeft de gebruiker veel tarieven en is het noodzakelijk om alle pagina's te herhalen. Het paginanummer dat ons interesseert, is eenvoudig rechtstreeks naar de url over te zetten.

Gegevens verzamelen uit html

Laten we nu direct beginnen met het verzamelen van de gegevens uit html. De gemakkelijkste manier om te begrijpen hoe de html-pagina is gestructureerd, is door de functie "Inspect element" in de browser te gebruiken. In dit geval is alles vrij eenvoudig: de hele tabel met tarieven staat in de tag. Selecteer dit knooppunt:

van bs4 importeer BeautifulSoup

van lxml import html

# Mooie soep

soup = BeautifulSoup (tekst)

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

# lxml

tree = html.fromstring (tekst)

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

Laten we leren hoe we de Russische titel van de film kunnen halen en een link naar de filmpagina (ook hoe we de tekst en de waarde van het attribuut kunnen krijgen).

Als je de titel in het Engels moet uitpakken, verander dan "nameRus" in "nameEng".

Resultaten

We leerden hoe we websites konden parseren, maakten kennis met de aanvragen van bibliotheken, BeautifulSoup en lxml en ontvingen gegevens die geschikt waren voor verdere analyse van reeds bekeken films op KinoPoisk.