Ein Tutorial von Semalt: Web Scraping in Python

Ich habe kürzlich KinoPoisk (russische Version von IMDB) besucht und festgestellt, dass ich im Laufe der Jahre über 1000 Filme bewertet habe. Ich dachte, es wäre interessant, diese Daten genauer zu untersuchen: Hat sich mein Filmgeschmack im Laufe der Zeit geändert? In welchen Jahreszeiten schaue ich mehr Filme?

Bevor wir jedoch schöne Grafiken analysieren und erstellen, müssen wir die Daten abrufen. Leider haben viele Dienste keine öffentliche API, daher müssen Sie die Ärmel hochkrempeln und die HTML-Seiten analysieren.

Dieser Artikel richtet sich an Personen, die schon immer lernen wollten, wie man Web Scrapping verwendet, es aber nicht in die Hände bekommen oder nicht wissen, wo sie anfangen sollen.

Aufgabe

Unsere Aufgabe ist es, die Daten zu bereits gesehenen Filmen zu extrahieren: den Titel des Films, das Datum und die Uhrzeit der Wiedergabe, die Bewertung des Benutzers.

Tatsächlich wird unsere Arbeit in zwei Schritten erledigt:

Stufe 1: Herunterladen und Speichern von HTML-Seiten

Stufe 2: Analysieren Sie HTML in einem Format, das für die weitere Analyse geeignet ist (CSV-, JSON-, Pandas-Datenrahmen usw.).

Instrumente

Es gibt viele Python-Bibliotheken zum Senden von http-Anfragen. Das bekannteste und praktischste ist Requests.

Es ist auch erforderlich, eine Bibliothek für die HTML-Analyse auszuwählen.

BeatifulSoup, lxml

Dies sind die beiden beliebtesten Bibliotheken zum Parsen von HTML, und die Auswahl einer davon ist nur eine persönliche Präferenz. Darüber hinaus sind diese Bibliotheken eng miteinander verbunden: BeautifulSoup begann, lxml als internen Parser für die Beschleunigung zu verwenden, und in lxml wurde ein Soupparser-Modul hinzugefügt. Um die Ansätze zu vergleichen, werde ich die Daten mit BeautifulSoup analysieren und XPath-Selektoren im Modul lxml.html verwenden.

Daten herunterladen

Beginnen wir mit dem Herunterladen von Daten. Lassen Sie uns zunächst versuchen, die Seite per URL abzurufen und in einer lokalen Datei zu speichern.

Wir öffnen die resultierende Datei und sehen, dass es nicht so einfach ist: Die Site hat uns als Roboter betrachtet und zeigt die Daten nicht an.

Lassen Sie uns herausfinden, wie die Site funktioniert

Der Browser hat kein Problem damit, Informationen von der Site abzurufen. Mal sehen, wie genau es die Anfrage sendet. Dazu verwenden wir das Fenster "Netzwerk" in den "Entwicklertools" des Browsers (ich verwende hierfür Firebug). Normalerweise ist die Anforderung, die wir benötigen, die längste.

Wie wir sehen können, sendet der Browser auch an die Header UserAgent, Cookie und eine andere Anzahl von Parametern. Zuerst versuchen wir nur, den richtigen UserAgent an einen Header zu senden.

Diesmal sind wir erfolgreich und erhalten nun die notwendigen Daten. Es ist erwähnenswert, dass die Site manchmal auch die Gültigkeit von Cookies überprüft. In diesem Fall helfen Sitzungen in der Anforderungsbibliothek.

Alle Preise herunterladen

Jetzt können wir eine Seite mit Raten speichern. Normalerweise hat der Benutzer jedoch viele Raten, und es ist erforderlich, alle Seiten zu durchlaufen. Die Seitenzahl, die uns interessiert, lässt sich leicht direkt auf die URL übertragen.

Sammeln von Daten aus HTML

Kommen wir nun direkt zum Sammeln der Daten aus HTML. Der einfachste Weg, um zu verstehen, wie die HTML-Seite aufgebaut ist, ist die Verwendung der Funktion "Element überprüfen" im Browser. In diesem Fall ist alles ganz einfach: Die gesamte Tabelle mit den Raten befindet sich im Tag. Wählen Sie diesen Knoten aus:

von bs4 importieren BeautifulSoup

aus lxml HTML importieren

# Schöne Suppe

Suppe = Schöne Suppe (Text)

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

# lxml

tree = html.fromstring (Text)

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

Lassen Sie uns lernen, wie Sie den russischen Titel des Films und einen Link zur Seite des Films herausziehen (und wie Sie den Text und den Wert des Attributs erhalten).

Wenn Sie den Titel auf Englisch extrahieren müssen, ändern Sie einfach "nameRus" in "nameEng".

Ergebnisse

Wir haben gelernt, wie man Websites analysiert, haben uns mit Bibliotheksanfragen, BeautifulSoup und lxml vertraut gemacht und Daten erhalten, die für die weitere Analyse bereits gesehener Filme auf KinoPoisk geeignet sind.