Výukový program od Semalt: Web Scraping In Python

Nedávno jsem navštívil KinoPoisk (ruská verze IMDB) a zjistil jsem, že v průběhu let se mi podařilo ohodnotit více než 1000 filmů. Myslel jsem, že by bylo zajímavé prozkoumat tato data podrobněji: změnil se můj vkus filmu v průběhu času? V jakém ročním období sleduji více filmů?

Než ale analyzujeme a budujeme nádhernou grafiku, musíme data získat. Bohužel mnoho služeb nemá veřejné API, takže musíte svléknout rukávy a analyzovat stránky html.

Tento článek je určen pro ty, kteří se vždy chtěli naučit, jak používat Web Scrapping, ale nedostali na to ruce nebo nevěděli, kde začít.

Úkol

Naším úkolem je extrahovat data o již viděných filmech: název filmu, datum a čas sledování, hodnocení uživatele.

Ve skutečnosti se naše práce bude provádět ve dvou fázích:

Fáze 1: stáhněte a uložte html stránky

Fáze 2: analyzovat html ve formátu vhodném pro další analýzu (csv, json, pandas dataframe atd.)

Nástroje

Existuje mnoho pythonových knihoven pro odesílání žádostí o http. Nejslavnější a nejužitečnější je Žádost.

Je také nutné vybrat knihovnu pro analýzu html.

BeatifulSoup, lxml

Toto jsou dvě nejoblíbenější knihovny pro analýzu html a výběr jedné z nich je jen osobní preference. Navíc jsou tyto knihovny spolu úzce propojeny: BeautifulSoup začal používat lxml jako interní parser pro zrychlení a v lxml byl přidán modul soupparser. Pro porovnání přístupů analyzuji data s BeautifulSoup a pomocí XPath selektorů v modulu lxml.html.

Stahování dat

Začněme stahovat data. Nejprve se pokusíme stránku získat pomocí adresy URL a uložit ji do místního souboru.

Otevříme výsledný soubor a zjistíme, že to není tak jednoduché: web nás považoval za robota a data nezobrazí.

Pojďme zjistit, jak web funguje

Prohlížeč nemá problém získat informace z webu. Uvidíme, jak přesně to pošle požadavek. K tomu používáme panel „Síť“ v „Vývojářských nástrojích“ v prohlížeči (k tomu používám Firebug), obvykle je požadavek nejdelší.

Jak vidíme, prohlížeč také pošle záhlaví UserAgent, cookie a další počet parametrů. Nejprve se pokusíme poslat správný UserAgent do záhlaví.

Tentokrát jsme úspěšní a nyní dostáváme potřebná data. Stojí za zmínku, že někdy web také zkontroluje platnost souboru cookie. V takovém případě vám pomohou relace v knihovně Žádosti.

Stáhněte si všechny sazby

Nyní jsme schopni uložit jednu stránku s cenami. Ale obvykle má uživatel mnoho sazeb a je nutné iterovat přes všechny stránky. Číslo stránky, které nás zajímá, lze snadno přenést přímo na adresu URL.

Sběr dat z HTML

Nyní se dostaneme přímo ke sběru dat z html. Nejjednodušší způsob, jak pochopit strukturu stránky html, je pomocí funkce „Inspect element“ v prohlížeči. V tomto případě je vše velmi jednoduché: ve značce je celá tabulka s cenami. Vyberte tento uzel:

z importu bs4 BeautifulSoup

z lxml import html

# Krásná polévka

soup = BeautifulSoup (text)

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

# lxml

tree = html.fromstring (text)

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

Naučme se, jak vytáhnout ruský název filmu a odkaz na stránku filmu (také jak získat text a hodnotu atributu).

Pokud potřebujete extrahovat název v angličtině, jednoduše změňte „nameRus“ na „nameEng“.

Výsledek

Dozvěděli jsme se, jak analyzovat webové stránky, seznamujeme se s knihovnami Žádosti, BeautifulSoup a lxml, stejně jako jsme obdrželi data vhodná pro další analýzu již viděných filmů na KinoPoisk.