Samouczek z gry Semalt: Web Scraping w Pythonie

Ostatnio odwiedziłem KinoPoisk (rosyjską wersję IMDB) i dowiedziałem się, że przez lata udało mi się ocenić ponad 1000 filmów. Pomyślałem, że interesujące byłoby zbadanie tych danych bardziej szczegółowo: czy mój gust filmowy zmienił się z czasem? W jakich porach roku oglądam więcej filmów?

Ale zanim przeanalizujemy i zbudujemy piękną grafikę, musimy uzyskać dane. Niestety, wiele usług nie ma publicznego API, więc musisz zakasać rękawy i przeanalizować strony HTML.

Ten artykuł jest przeznaczony dla tych, którzy zawsze chcieli nauczyć się korzystać z funkcji Web Scrapping, ale nie dostali jej w ręce lub nie wiedzieli od czego zacząć.

Zadanie

Naszym zadaniem jest wyodrębnienie danych o już oglądanych filmach: tytuł filmu, data i godzina oglądania, ocena użytkownika.

W rzeczywistości nasza praca będzie przebiegać w 2 etapach:

Etap 1: pobierz i zapisz strony HTML

Etap 2: parsowanie html w formacie odpowiednim do dalszej analizy (ramka danych csv, json, panda itp.)

Instrumenty

Istnieje wiele bibliotek pythonowych do wysyłania żądań HTTP. Najbardziej znanym i bardzo przydatnym jest Zapytania.

Konieczne jest również wybranie biblioteki do analizy składni HTML.

BeatifulSoup, lxml

Są to dwie najpopularniejsze biblioteki do analizowania html, a wybranie jednej z nich jest tylko osobistą preferencją. Co więcej, biblioteki te są ze sobą ściśle powiązane: BeautifulSoup zaczęła używać lxml jako wewnętrznego parsera dla przyspieszenia, aw lxml dodano moduł zparowujący zupę. Aby porównać podejścia, przeanalizuję dane za pomocą BeautifulSoup i używając selektorów XPath w module lxml.html.

Pobieranie danych

Zacznijmy pobieranie danych. Przede wszystkim spróbujmy pobrać stronę przez adres URL i zapisać ją w pliku lokalnym.

Otwieramy plik wynikowy i widzimy, że nie jest to takie proste: strona uważała nas za robota i nie wyświetla danych.

Dowiedzmy się, jak działa strona

Przeglądarka nie ma problemu z uzyskaniem informacji z witryny. Zobaczmy, jak dokładnie wysyła żądanie. Aby to zrobić, używamy panelu „Sieć” w „Narzędziach programisty” w przeglądarce (używam do tego Firebug), zwykle żądanie jest najdłuższe.

Jak widzimy, przeglądarka wysyła również do nagłówków UserAgent, plików cookie i innej liczby parametrów. Najpierw spróbujemy wysłać poprawny UserAgent do nagłówka.

Tym razem odnosimy sukcesy, a teraz otrzymujemy niezbędne dane. Warto zauważyć, że czasami strona sprawdza również poprawność pliku cookie, w którym to przypadku sesje w bibliotece Żądania pomogą.

Pobierz wszystkie stawki

Teraz jesteśmy w stanie zapisać jedną stronę ze stawkami. Ale zwykle użytkownik ma wiele stawek i konieczne jest iterowanie po wszystkich stronach. Numer strony, który nas interesuje, można łatwo przenieść bezpośrednio na adres URL.

Zbieranie danych z HTML

Teraz przejdźmy bezpośrednio do zbierania danych z HTML. Najłatwiejszym sposobem zrozumienia struktury strony HTML jest użycie funkcji „Sprawdź element” w przeglądarce. W tym przypadku wszystko jest dość proste: cała tabela ze stawkami znajduje się w znaczniku. Wybierz ten węzeł:

z bs4 importuj BeautifulSoup

z lxml importuj HTML

# Piękna zupa

zupa = BeautifulSoup (tekst)

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

# lxml

drzewo = html.fromstring (tekst)

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

Nauczmy się, jak wyciągnąć rosyjski tytuł filmu i link do strony filmu (także jak uzyskać tekst i wartość atrybutu).

Jeśli chcesz wyodrębnić tytuł w języku angielskim, zmień „nameRus” na „nameEng”.

Wyniki

Nauczyliśmy się analizować strony internetowe, zapoznaliśmy się z bibliotekami Requests, BeautifulSoup i lxml, a także otrzymaliśmy dane odpowiednie do dalszej analizy oglądanych filmów na KinoPoisk.