Http HEAD request s bonusem
Jako User agenta pro http požadavky v jazyce Python používám opener z modulu urllib2. Jeho použití je jednoduché a opener má poměrně inteligentní návrh. Nedokázal jsem však najít způsob, jak pomocí něj uskutečnit HEAD požadavek na danou internetovou stránku. Podařilo se mi to až s modulem httplib a to po dlouhém hledání.
httplib
Použití httplib, stejně jako použití jiných komponent krajtí knihovny, není těžké. Přesto si myslím, že mohlo být ještě více intuitivnější a záhy vysvětlím proč. Nejdříve si totiž musíme importovat modul do programu.
import httplib
Nyní je řešení jen na pár řádků programu. Vytvoří se objekt, který obstará spojení se serverem a pak se metodou .request nastaví parametry http požadavku. Minimálně je potřeba zadat typ požadavku (HEAD) a relativní umístění dokumentu na serveru. Požadavek je vykonán metodou .getresponse, jež vrátí instanci objektu HTTPResponse.
connection = httplib.HTTPConnection("ifanda.cz") # bez http:// connection.request("HEAD", "/clanky") header = conn.getresponse() header.status # vypíše kód stavu požadavku, tedy 200 header.msg.gettype() # vypíše MIME type # print dir(header.msg) # co všechno z hlavičky zjistíme
Hotovo po 4 řádcích kódu a já si stěžuji, že je to málo intuitivní. Ano, klidně bych si totiž dokázal představit, že by metoda .request příjmala jako druhý parametr celou URL. Takto, pokud máme na začátku zadanou celou URL, musíme ji před použitím zpracovat na jednotlivé díly. Naštěstí k tomuto účelu existuje modul urlparse.
urlparse
Jak už název napovídá, urlparse je modul pro zpracování URL, tedy adres přesně určujících jednotlivé zdroje v Internetu. Pro jednoduché použití stačí jedna funkce, konktrétně urlsplit(), která vrací tuple jednotlivých částí zadané URL.
from urlparse import urlsplit url_tuple = urlsplit("http://ifanda.cz/clanky/index.php?sekce=python#NEEXISTUJE") print url_tuple
Co je tedy nyní uchováno v tuple url_tuple? Funkce urlsplit() zadanou adresu zparsuje na
("http", "ifanda.cz", "/clanky/index.php", "sekce=python", "NEEXISTUJE")
Z toho jde pěkně vidět, jak urlsplit() funguje. Popsanou tabulku hodnot v tuple, lze najít za jedním z odkazů na konci článku.
httplib a urlparse společně
Na závěr vytvořím funkci, která oba moduly spojí dohromady. Aby měla funkce smysl, řekněme, že bude zjišťovat MIME typ souboru, který je identifikován pomocí URL. Samozřejmě využiji všechny postupy popsané výše.
import httplib from urlparse import urlsplit def get_content_type( url ): turl = urlsplit(url) # použití urlparse conn = httplib.HTTPConnection(turl[1]) conn.request("HEAD", "/" + turl[2] + "?" + turl[3]) header = conn.getresponse() return header.msg.gettype()