Programování spiderů v Pythonu 4 - odkazy, historie a TOR

Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: Jakub Tětek
Datum: 9.6.2014
Hodnocení/Hlasovalo: 1.53/19

V dnešní epizodě série o tvorbě internetových spiderů v Pythonu si ukážeme některé z dalších možností knihovny Mechanize, kterou jsme doposud používali k interakci s webem. Mimo jiné se podíváme i na práci s odkazy, které nám umožní plnohodnotné procházení webu, a na používání Toru v kombinaci s Mechanize.

Odkazy

Bot PythonOdkaz je jeden z nejdůležitějších prvků internetu, a je proto užitečné s odkazy umět pracovat i programově.

import mechanize
br = mechanize.Browser()
br.open("http://www.soom.cz/")

Pokud chceme získat seznam všech odkazů nacházejících se na stránce, můžeme použít metody links.

br.links()

Tím získáme iterátor, který můžeme použít například ve smyčce for. Pokud z něj chceme udělat seznam, využijeme vestavěné funkce list.

list(br.links())

Seznam odkazů můžeme filtrovat. Pokud bychom například chtěli vyhledat všechny odkazy jejichž text (mezi tagy <a>) začíná na „Hack“, můžeme tak učinit pomocí regexu. Napíšeme si tedy regex Hack.* a zavoláme funkci links s příslušným parametrem.

br.links(text_regex=r"Hack.*")

Podobně můžeme vyhledávat url tak, že regex místo nepředáme do text_regex, ale do proměnné url_regex. Vyhledávání všech absolutních odkazů mířících na stránky používající protokol HTTP by pak vypadalo následovně.

br.links(url_regex=r"http:\/\/.*")

Pokud bychom chtěli na odkaz „kliknout“, můžeme tak učinit zavoláním metody prohlížeče follow_link. Té můžeme dát stejné parametry jako metodě links. Pokud nechceme kliknout na první odkaz vyhovující filtrům, můžeme v parametrech proměnné nr předat pořadí odkazu, který má být následován. Pořadí odkazů je počítáno od 0.

Následující kód ukazuje následování šestého odkazu, který vyhovuje regexu Hack.* (šestého proto, že jsou odkazy počítány od nuly – 5 je tedy šestý odkaz). Objekt odpovědi uložíme do proměnné response.

response = br.follow_link(text_regex=r"Hack.*", nr=5)

Pracujeme s historií

Jak jsem již v jednom z předchozích dílů této série psal, instance prohlížeče Mechanize je ve své podstatě plnohodnotným prohlížečem. Jen se neovládá graficky (myší), ale programově. Nepřekvapí tedy, že stejně jako u běžných prohlížečů, je i v Mechanize jednou ze základních funkcí historie navštívených stránek.

V historii prohlížeče se můžeme vrátit jednoduše pomocí metody prohlížeče back.

br.back()

Pokud tedy budeme pokračovat v příkladu s odkazy, touto metodou se můžeme vrátit zpět na domovskou stránku Soom.cz, což lze ověřit metodou geturl, která vrací adresu aktuálně načtené stránky.

Pokud bychom chtěli obnovit stránku, můžeme tak učinit pomocí metody reload.

br.reload()

User-Agent

Někdy je potřeba změnit user-agenta – textový řetězec říkající, který prohlížeč uživatel používá. To dělá Mechanize svojí metodou addheaders, která nám umožní přidat hlavičku User-Agent. Takto se budeme serverům jevit, jako bychom prohlíželi stránky v Google Chromu.

br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.132 Safari/537.36')]

Tor

Nejen při používání prohlížeče grafického, ale i prohlížeče programově ovládaného, je někdy potřeba si zachovat anonymitu. K tomu může sloužit například Tor. Tento krátký tutoriál, jak ho s Mechanize používat, předpokládá, že už ho máte nainstalovaný a že vám běží na počítači.

Problém je, že Tor funguje jako SOCKS proxy, kterou Mechanize neumí využívat. To vyřešíme vrstvou mezi nimi, která SOCKS proxy zprostředkuje jako HTTP proxy. Pro tento účel použijeme Privoxy.

Podle vámi používaného package managera správným příkazem nainstalujte Privoxy. Pro Debian-based systémy bude příkaz vypadat takto:

# apt-get install privoxy

Nyní máme Privoxy nainstalovanou a stačí ji jen nakonfigurovat, aby pracovala s Torem. V hlavním konfiguračním souboru nacházejícím se v /etc/privoxy/config (umístění se může lišit podle používané distribuce) najdeme následující řádek:

# forward-socks5 / 127.0.0.1:9050 .

a odkomentujeme ho (odstraníme mřížku na začátku řádky).

Nyní jen Privoxy restartujeme, aby námi pozměněný konfigurační soubor nabyl platnosti.

# /etc/init.d/privoxy restart

Nyní již můžeme používat Tor jako HTTP a HTTPS proxy běžící na localhostu, na defaultním portu Privoxy - 8118. Vytvoříme si tedy objekt prohlížeče.

import mechanize
br = mechanize.Browser()

Kdybychom nechtěli použít Tor, začali bychom prohlížeč Mechanize běžně používat, ale my před tím ještě nastavíme, jaká proxy má být použita. Privoxy běžící na portu 8118 a zprostředkovávající TOR nastavíme takto:

br.set_proxies({"http": "localhost:8118", "https": "localhost:8118"})

Pokud chceme zkontrolovat, zda jsme opravdu připojeni anonymně přes Tor můžeme stáhnout stránku Anonymity checkeru od Soomu:

response = br.open('https://www.soom.cz/projekty/anonymity-checker-on-line')
print(response.read())

Tento program spustíme v terminálu a jeho výstup přesměrujeme jako soubor do prohlížeče.

chromium <(python mechanize_tor.py)

Pro dnešek je to vše. Příště si ukážeme, jak sledovat změny webové stránky. Získáme VPS zdarma a naučíme se používat CRON.