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()