Ik heb onlangs een bezoek gebracht aan KinoPoisk (Russische versie van IMDB) en ontdekte dat over de jaar heb ik meer dan 1000 films beoordeeld. Ik dacht dat het interessant zou zijn om deze gegevens gedetailleerder te onderzoeken: zijn mijn films in de loop van de tijd veranderd? In welke seizoenen van het jaar kijk ik meer films?
Maar voordat we mooie grafische afbeeldingen analyseren en bouwen, moeten we de gegevens ophalen. Helaas hebben veel services geen openbare API, dus u moet uw mouwen opstropen en de html-pagina's analyseren.
Dit artikel is bedoeld voor diegenen die altijd al wilden weten hoe ze Scrappen met het web moesten gebruiken, maar ze niet in handen kregen of niet wisten waar ze moesten beginnen.
Taak
Het is onze taak om de gegevens over reeds bekeken films te extraheren: de titel van de film, de datum en tijd van kijken, de waardering van de gebruiker.
Ons werk zal in feite in twee fasen worden uitgevoerd:
Fase 1: html-pagina's downloaden en opslaan
Fase 2: parseer html in een formaat dat geschikt is voor verdere analyse (csv, json, pandas dataframe etc.)
Instrumenten
Er zijn veel python-bibliotheken voor het verzenden van http-verzoeken. De meest bekende en erg handige is Verzoeken.
Het is ook noodzakelijk om een bibliotheek te kiezen voor html-parsing.
BeatifulSoup, lxml
Dit zijn de twee meest populaire bibliotheken voor het parseren van HTML en het kiezen van een van deze is slechts een persoonlijke voorkeur. Bovendien zijn deze bibliotheken nauw met elkaar verbonden: BeautifulSoup begon lxml te gebruiken als een interne parser voor versnelling, en in lxml werd een soupparsermodule toegevoegd. Om de benaderingen te vergelijken, zal ik de gegevens parsen met BeautifulSoup en met behulp van XPath selectors in de module lxml.html.
Downloaden van gegevens
Laten we beginnen met het downloaden van gegevens. Allereerst proberen we de pagina op url te krijgen en 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 zal de gegevens niet weergeven.
Laten we achterhalen hoe de site werkt
De browser heeft geen probleem om informatie van de site te krijgen. Laten we eens kijken hoe het precies het verzoek verzendt. Om dit te doen gebruiken we het paneel "Netwerk" in de "Developer Tools" in de browser (ik gebruik Firebug hiervoor), meestal is de vraag die we nodig hebben de langste.
Zoals we kunnen zien, stuurt de browser ook naar de headers UserAgent, cookie en een ander aantal parameters. Eerst proberen we de juiste UserAgent naar een header 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 cookies controleert, in welk geval sessies in de bibliotheek van verzoeken zullen helpen.
Alle tarieven downloaden
Nu kunnen we één pagina met tarieven opslaan. Maar meestal heeft de gebruiker veel tarieven en is het nodig om alle pagina's te doorlopen. Het paginanummer dat ons interesseert, is eenvoudig rechtstreeks naar de URL over te dragen.
Gegevens verzamelen uit HTML
Laten we nu direct de gegevens uit html ophalen. De eenvoudigste manier om te begrijpen hoe de html-pagina is gestructureerd, is door de functie "Inspecteer element" in de browser te gebruiken. In dit geval is alles vrij eenvoudig: de hele tabel met tarieven bevindt zich in de tag. Selecteer dit knooppunt:
from bs4 import BeautifulSoup
from lxml import html
# Beautiful Soup
soup = BeautifulSoup(text)
film_list = soup.find('div', ('class': 'profileFilmsList'))
# lxml
tree = html.fromstring(text)
film_list_lxml = tree.xpath('//div[@class = ''profileFilmList'']')[0]
Laten we leren hoe je de Russische titel van de film en een link eruit kunt trekken naar de filmpagina (ook hoe je de tekst en de waarde van het attribuut kunt krijgen).
Als u de titel in het Engels wilt uitpakken, wijzigt u "nameRus" in "nameEng".
Resultaten
We hebben geleerd websites te ontleden, hebben kennis gemaakt met de verzoeken van bibliotheken, BeautifulSoup en lxml, evenals ontvangen gegevens die geschikt zijn voor verdere analyse van reeds geziene films op KinoPoisk.
Post a comment