Sveučilište J. J. Strossmayera u Osijeku Odjel za matematiku Sveučilišni preddiplomski studij matematike

Seminarski rad iz kolegija Računalne mreže i usluge

PYTHON I HTTP, PYTHON I HTML

Ţeljka Salinger Bojan Ugrica Dino Vučemilović-Šimunović

Osijek, 2011. Godina

SADRŽAJ 1. HTTP PROTOKOL ...................................................................................................................... 3 1.1. Tehničke karakteristike HTTP-a ............................................................................................... 3 1.2. Nastanak HTTP-a ........................................................................................................................ 4 1.3. Proces HTTP razmjene podataka ...............................................................................................4 1.4. Sigurnosni HTTP ......................................................................................................................... 7

2. HTML I PYTHON ....................................................................................................................... 8 2.1.GET metoda ...................................................................................................................... 10 2.2.Kodovi, greške i preusmjerenja ......................................................................................... 11 2.3.Korisnost i postojanost veze .............................................................................................. 13

3. HTML ........................................................................................................................................... 14 3.1.Pisanje HTML koda .......................................................................................................... 14 4. HTML I PYTHON ...................................................................................................................... 16

5. ZAKLJUČAK......................................................................................................................................... 18

6. LITERATURA ............................................................................................................................ 19

2

1. HTTP PROTOKOL HTTP (Hypertext Transfer Protocol) je mreţni protokol koji je osnova razmjene podataka na Webu. Standard HTTP-a razvijao se pod nadzorom IETF-a (Internet Engineering Task Force1) i W3C-a (World Wibe Web Consortium2) i dosegnuo je vrhunac objavom niza RFCs-a (Request for Comments3) od kojih je najznačajniji RFC 2616 objavljen u lipnju 1999. godine koji definira verziju HTTP-a koja je u širokoj upotrebi, verziju HTTP/1.1. 1.1. Tehničke karakteristike HTTP-a HTTP je request/response (zahtjev/odgovor) protokol za komunikaciju između klijenta i posluţitelja (servera). Kod HTTP-a, npr. web pretraţivač (browser) djeluje kao klijent dok program na računalu koje je nositelj web stranice koju potraţujemo djeluje kao server. Klijent šalje HTTP zahtjev, tj. poruku serveru, koji posjeduje podatke (izvore) kao što su HTML datoteke i ima mogućnost prosljeđivanja tih podataka, koji vraća odgovor klijent. Odgovor sadrţi status izvršenja zahtjeva te u tijelu poruke moţe sadrţavati i podatke koje je klijent zatraţio. Web stranice za kojima postoji velika potraţnja koriste se web cache4 serverima koji klijentima šalju podatke u ime izvornog servera (najvišeg u hijerarhiji servera) što ubrzava vrijeme odgovora na zahtjev koji je poslao klijent. HTTP podaci (resources, izvori) se pronalaze i identificiraju pomoću URI-a (Uniform Resource Identifiers5) i URL-a (Uniform Resource Locators6) koji su, zajedno s HTML-om (Hypertext Markup Language), tokom '90-tih doveli do stvaranja World Wide Weba. Izvorna verzija HTTP-a, HTTP/1.0, unaprijeđena je u verziju HTTP/1.1 koja moţe koristiti jednu konekciju na server nekoliko puta za razliku od verzije HTTP/1.0 koja je koristila odvojene konekcije na server za svaku request/response razmjenu. Time je smanjeno vrijeme čekanja prilikom uspostavljanja TCP konekcije.

1

IETF – organizacija koja razvija i promiče internetske standarde W3C – glavna međunarodna organizacija za standarde World Wide Web-a 3 RFCs – memorandum koji opisuje metode, ponašanje, istraţivanje i inovacije u radu Interneta 4 Web cache – mehanizam za pohranu privremenih verzija web dokumenata 5 URI – niz znakova (string) koji se koristi za identifikaciju imena ili izvora na Internetu 6 URL – URI koji određuje gdje je izvor dostupan i mehanizam njegovog preuzimanja 2

3

1.2. Nastanak HTTP-a Engleski fizičar Tim Bernes- Lee osnovao je projekt „World Wide Web― te su on i njegov tim zasluţni za nastanak izvornog HTTP protokola (HTTP V0.9), HTML-a, tehnologije potrebne za web servere i web pretraţivače. Prvotna verzija sadrţavala je samo jednu metodu, GET metodu koja je serveru slala zahtjev za određenom stranicom, a odgovor servera je uvijek bila HTML stranica. Protokol se tokom godina unaprijeđivao; proširen je dodatnim operacijama i sigurnošću te je postao učinkovitiji. RFC 1945 sluţbeno je predstavio HTTP V1.0 1996. godine. Te iste godine puštena je i HTTP/1.1 verzija koju je do lipnja 1996. koristilo 65% web pretraţivača. Sluţbena HTTP/1.1 verzija izašla je u siječnju 1997., a dopunjenu verziju objavio je RFC 2616 u lipnju 1999. godine. 1.3. Proces HTTP razmjene podataka HTTP razmjena podataka sastoji se od niza request/response poruka. HTTP klijent pokreće zahtjev tako što uspostavlja TCP7 konekciju na određenom portu domaćina (najčešće je to port 80). HTTP server koji „osluškuje― na tom portu čeka zahtjev klijenta te kada ga primi, šalje odgovor koji se sastoji od retka stanja, npr „HTTP/1.1 200 OK― i njegove poruke koja moţe biti traţeni podatak, poruka o grešci ili nešto drugo. Poruka koju klijent šalje, tj, zahtjev sastoji se od 

Linije zahtjeva, npr. GET /images/logo.png HTTP/1.1 koja od servera traţi podatak /images/logo.png Zaglavlja, npr. Accept-Language: en

  

Prazne linije Proizvoljnog tijela poruke

Linija zahtjeva i zaglavlja moraju završiti s 8, prazna linija smije sadrţavati samo i ne smije sadrţavati drugi prazan prostor. U HTTP/1.1 protokolu sva zaglavlja osim Host su proizvoljna.

7 8

TCP – pruţa pouzdano i poredano slanje podataka putem Interneta CR – carrieage return, kontrolni znak za početak nove linije teksta, LF – line feed, znak za kraj linije teksta

4

HTTP određuje devet metoda koje predstavljaju radnju koju ţelimo izvršiti nad određenim izvorom. Taj izvor moţe biti statičkog ili dinamičkog podrijetla (statičke ili dinamičke web stranice) što ovisi o implementaciji servera. 

HEAD - potraţuje odgovor koji je identičan GET zahtjevu, ali ne sadrţi tijelo odgovora. Ovo je korisno za dohvaćanje meta-podataka9 koji se nalaze u zaglavju odgovora bez preuzimanja cijelog sadrţaja.



GET - zahtjev za prikaz određenog sadrţaja izvora



POST - dostavlja podatke izvoru koje treba obraditi (npr. iz HTML oblika). Podaci se nalaze u tijelu zahtjeva. To moţe rezultirati stvaranjem novog izvora i/ili izmjenom postojećeg.



PUT - učitava prikaz određenog izvora



DELETE - briše određeni izvor.



TRACE - odašilje nazad primljeni zahtjev tako da klinejt moţe vidjeti promjene ili dodatke koje je postavio server posrednik.



OPTIONS - vraća HTTP metode koje server podrţava za određeni URL. Koristi se kako bi se provjerila funkcionalnost servera tako da se šalje '*' umjesto zahtjeva za izvorom.



CONNECT - pretvara konkeciju zahtjeva u TCP/IP tako što olakšava SSL kriptiranu komunikaciju (HTTPS) kroz nekriptirani HTTP proxy



PATCH - koristi se za stvaranje pojedinačnih promjena u izvoru.

HTTP serveri moraju implementirati barem GET i HEAD metode i kad god je to moguće, OPTIONS metodu. Neke metode (npr. HEAD, GET, OPTIONS, TRACE) smatraju se sigurnim metodama što znači da su namjenjene za dohvaćanje informacija i ne bi trebale mijenjati stanje servera, tj ne bi trebale uzrokovati promjene na stranici (osim onih bezopasnih, tipa povećanje brojača posjeta web stranice). Suprotno tome, metode kao što su POST, PUT, DELETE uzrokuju promjene na serveru ili uzrokuju vanjske promjene kao što su financijske transakcije ili razmjena e-maila. Unatoč sigurnosti GET zahtjeva, obrada tih zahtjeva od strane servera nije tehnički ograničena što znači da nemarnim programiranjem moţe doći do netrivijalnih promjena na serveru. Metode kao što su TRACE, TRACK i DEBUG smatraju se nesigurnima jer ih se moţe zloupotrijebiti za prikupljanje informacija ili za zaobilaţenje sigurnosnih kontrola. 9

Meta-podaci –„ podaci o podacima―, daju informacije o samim podacima

5

Metode PUT i DELETE definirane su tako da budu idempotente što znači da više identičnih zahtjeva ima jednaki učinak kao i jedan pojedinačni zahtjev. Metoda POST nije nuţno idempotentna te slanje više identičnih POST zahtjeva nekoliko puta moţe utjecati na stanje servera. To svojstvo je ponekad poţeljno, a nekad je rezultat slučajnosti. U tom slučaju, web browseri mogu prikazati prozor upozorenja kako bi upozorili korsinike da ponovno učitavanje stranice moţe dovesti do ponovnog slanja POST zahtjeva. Općenito ovisi o web aplikaciji kako će postupiti u slučaju kada je POST zahtjev poslan više puta. U HTTP/1.0 protokolu prvi redak zove se redak statusa i sadrţi numerički kod statusa10 (kao što je 404) i tekstualni dio koji predstavlja objašnjenje (npr. „Not found―). Način na koji će klijent obraditi taj odgovor ovisi o kodu i o zaglavlju odgovora. Kod HTTP/0.9 i 1.0 protokola konekcija se zatvara nakon jedne razmjene request/ response poruka. U HTTP/1.1 protokolu predstavljen je mehanizam u kojemu konekcija traje („ţivi―) te se moţe koristiti za više od jedne razmjene request/response poruka. U takvim trajnim konekcijama osjetno je smanjeno kašnjenje nakon slanja zahtjeva jer klijent ne mora ponovno pregovarati o uspostavljanju TCP konekcije nakon što je prvotni zahtjev poslan. Naveden je primjer11 razgovora između klijenta i servera koji se nalazi na www.example.com i odvija se na portu 80. Zahtjev klijenta: GET /index.html HTTP/1.1 Host: www.example.com

Zahtjev klijenta u ovom slučaju se sastoji od linije zahtjeva i samo jednog zaglavlja nakon kojeg slijedi prazna linija. „Host― zaglavlje razlikuje različita DNS12 imena koja dijele istu IP adresu što dopušta tzv. virtualni hosting (virtual hosting13). U HTTP/1.0 verziji je to proizvoljno, dok je u verziji 1.1. obavezno. Odgovor servera: HTTP/1.1 200 OK Date: Mon, 23 May 2005 22:38:34 GMT Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux) Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT Etag: "3f80f-1b6-3e1cb03b" 10

Svi kodovi statusa mogu se naći na stranici http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html Primjer je preuzet s http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol 12 DNS – Domain Name System, hijerarhijski sustav prevođenja internetskih domena u IP adrese 13 Virtual hosting – mogućnost da više računala posjeduje istu IP adresu 11

6

Accept-Ranges: bytes Content-Length: 438 Connection: close Content-Type: text/html; charset=UTF-8

Odgovor servera sadrţi praznu liniju i tekst traţene stranice. ETag (entity tag) zaglavlje provjerava jel li cache verzija traţenog izvora jednaka trenutnoj verziji izvora na serveru. Content-Type govori o tipu podataka prenešenih http porukom, a Content-Length o količini prenešenih podataka u byteima. Accept-Ranges zaglavlje pokazuje da server moţe obraditi određeni raspon bytova unutar dokumenta što je korisno u slučaju kada klijent treba samo dijelove dokumenta. Connection: close zaglavlje pokazuje da će server zatvoriti TCP konekciju odmah po završetku prijenosa podataka danih u odgovoru.

1.4. Sigurnosni HTTP Postoje dvije metode uspostavljanja sigurne HTTP konekcije: http URI shema i HTTP/1.1 Upgrade header. Pretraţivači uglavnom joše ne podrţavaju drugu metodu pa je HTTPS glavna metoda uspostavljanja sigurne konekcije. Takva konekcija označena je prefiskom https:// umjesto http:// u URL adresi. Sintaksa https URI shema identična je sintaksi http sheme, ali ona dodatno signalizira pretraţivaču da koristi dodatni sloj enkripcije SSL/TLS14. SSL se posebno koristi za HTTP jer moţe pruţati zaštitu čak i kad je samo jedna strana koja sudjeluje u konekciji autentificirana što je čest slučaj na Internetu jer je obično server taj koji daje autentifikaciju. Kod HTTP/1.1 Upgrade header tokom razmjene poruka klijent započinje konekciju slanje zahtjeva koji sadrţi čisti tekst te kasnije ili klijent ili server mogu zatraţiti nadogradnju konekcije do TLS-a. Najčešće taj zahtjev dolazi od strane servera.

14

SSL/TLS – sigurnosni protokoli koji omogućavaju sigurnu komunikaciju putem Interneta

7

2. HTTP I PYTHON U sljedećem dijelu pokušat ćemo pribliţiti određene stvari i navedene karakteristike HTTP protokola s primjenom u programiranju pomoću Pythona. Proći ćemo nekoliko metoda u HTTPu i implementacije u Pythonu, greške koje se mogu pojaviti, preusmjeravanja stranica i postojanosti same veze sa serverom15. Za početak definirat ćemo osnovnu terminologiju. URL su stringovi koji govore web pretraţivaču (IE, Mozilla, Chrome) kako dohvatiti resurse s www-a (World Wide Web). Oni su podklasa potpunog skupa svih mogućih URI-a, tj oni su URI-ji konstriurani tako da mogu davati intrukcije za dohvaćanje dokumenta umjesto da sluţe samo kao identifikatori. Npr. promotrimo jednostavan URL poput: http://www.index.hr Kada ga proslijedimo do web pretraţivača ovaj URL bit će interpretiran tako da prvo pribavi IP adresu hosta www.index.hr, ostvari TCP vezu s IP adresom na standardnom portu 80, a onda zatraţi izvorni dokument koji „ţivi― na toj stranici. Primjer kompliciranijeg URL-a je http://www.index.hr/indexrotator/items/4367/kucni%20ljubimci.jpg Ovdje URL specificira više informacija: 

protokol će opet biti HTTP



www.index.hr bit će pretvoren u IP



koristimo port 8080 umjesto 80



kada se veza uspostavi, server će zatraţiti izvor pod nazivom /indexrotator/items/ 4367/kucni%20ljubimci.jpg Primjetimo da svi znakovi osim alfanumeričkih moraju biti kodirani postotkom, tj

pripadnim znakom %, a zatim dvoznamenkastim heksadecimalnim brojem jedinstveno određenim za svaki znak. Tu podrazumijevamo nekoliko interpunkcijskih znakova: $-_.+!*'(),— i specijalne granične znakove kao što je na primjer „ / ― (poznatije kao kosa crta). U gornjem primjeru (/indexrotator/items/4367/kucni%20ljubimci.jpg) pojavljuje se znak %20 što je znak za razmak u URL-u, a npr. znak %2F predstavlja kosu crtu. Kako bi bolje razumjeli postotno kodiranje, promotrit ćemo kako Python interpretira sljedeće izraze, kako dolazi do određenih dijelova web adrese (komponenti putanje do traţenog izvora) te 15

Svi primjeri u ovom poglavlju preuzeti su iz [1]

8

uočiti kako oni nisu ekvivalentni. 1) kucni%2Fljubimci%2Fmacke ovo Python shvaća kao jednu komponentu putanje do traţenog izvora 2) kucni%2Fljubimci/macke

ovo se interpretira kao 2 zasebne komponente putanje odvojene znakom „ / ―

3) kucni/ljubimci/macke

ovaj izraz se interpetira kao 3 odvojene komponente putanje do traţenog izvora

Za razumijevanje HTTP-a u vidu Pythona nuţno je prvo definirati Python biblioteku urllib2, jednu od standardnih Pythonovih datoteka koja sluţi za dohvaćanje URL-ova

koristeći veliki izbor protokola, a najčešće je to HTTP. Biblioteka urllib2 ima „otvarač― URLova kao funkciju pod nazivom urlopen(), ali kako ta funkcija odlazni zahtjev i dolazni odgovor zadrţava skrivenim, tj. nama nevidljivim tokom izvršavanja programa mi ćemo preuzeti sljedeći, već isprogramirani novi „otvarač― URL-a koji će zapravo biti samo modificirana verzija već postojeće urlopen() funkcije. Jedina razlika je što novi definirani otvarač omogućuje ispis odlaznih zahtjeva i dolaznih odgovora, umjesto da ih drţi prikrivenima. Novi „otvarač― URL-a definiramo na sljedeći način. #!/usr/bin/env python # Foundations of Python Network Programming - Chapter 9 verbose_handler.py # HTTP request handler for urllib2 that prints requests and responses. import StringIO, httplib, urllib2 class VerboseHTTPResponse(httplib.HTTPResponse): def _read_status(self): s = self.fp.read() print '-' * 20, 'Response', '-' * 20 print s.split('\r\n\r\n')[0] self.fp = StringIO.StringIO(s) return httplib.HTTPResponse._read_status(self) class VerboseHTTPConnection(httplib.HTTPConnection): response_class = VerboseHTTPResponse def send(self, s): print '-' * 50 print s.strip() httplib.HTTPConnection.send(self, s) class VerboseHTTPHandler(urllib2.HTTPHandler): def http_open(self, req):

9

return self.do_open(VerboseHTTPConnection, req)

Nadalje, u primjerima ćemo ga koristiti, tj pozivati ga na sljedeći način: >>> from verbose_http import VerboseHTTPHandler >>> import urllib, urllib2 >>> opener = urllib2.build_opener(VerboseHTTPHandler)

Ovako definiran otvarač bit će nam koristan jer moţemo proučiti HTTP protokol i njegovo ponašanje u praksi uz više detalja nego što bi dobili funkcijom urlopen().

2.1. GET metoda Ova metoda bi se mogla zvati osovinom HTTP protokola. Kada je HTTP protokol nastao, imao je samo jednu funkciju, tj. GET metodu koja je imenovala i vraćala hypertext dokument od samog servera. GET metoda je prva stvar koja se prenosi kao dio HTTP zahtjeva i odmah je popraćena u zaglavlju samog zahtjeva. Obično kod jednostavnih GET metoda zahtjev završava praznom linijom koja označava kraj zaglavlja kako bi server trenutno mogao stati s čitanjem i poslati odgovor klijentu. Promotrimo to na sljedećem primjeru: >>> info = opener.open('http://www.ietf.org/rfc/rfc2616.txt') -------------------------------------------------GET /rfc/rfc2616.txt HTTP/1.1 ... Host: www.ietf.org ... -------------------- Response -------------------HTTP/1.1 200 OK ... Content-Type: text/plain

Primjećujemo da smo ovdje iskoristili prethodno isprogramirani „otvarač― koji nam dopušta da vidimo rezultat, tj ono što GET metoda radi. Primjetimo da isto tako HTTP odgovor počinje statusnom linijom koja sadrţi informacije o HTTP verziji, statusnom kodu i kratku poruku (HTTP/1.1 200 OK) Kreirani info objekt nam navedene stvari iz statusne linije moţe proslijediti kao svoje atribute, a isto tako omogućava ispitivanje zaglavlja kroz objekt koji je oblikovan poput rječnika. >>> info.code 200

10

>>> info.msg 'OK' >>> sorted(info.headers.keys()) ['accept-ranges', 'connection', 'content-length', 'content-type', 'date', 'etag', 'last-modified', 'server', 'vary'] >>> info.headers['Content-Type'] 'text/plain'

Dakle, osnovna svrha GET metode je potraţnja HTTP servera za određenim dokumentom kako bi se njegov sadrţaj mogao skinuti (downloadati) i najčešće prikazati na lokalnom računalu.

2.2. Kodovi, greške, preusmjeravanja

Kada smo razmatrali GET metodu, primjetili smo da u statusnoj liniji odgovora uz HTTP verziju imamo statusni kod i kratku poruku. U našem slučaju ta je poruka glasila: 200 OK. Što to znači? Listu svih mogućih odgovora moţemo pronaći u RFC 2616, a ovdje ćemo nabrojati samo neke od mogućih: 

200 OK - zahtjev je uspio



301 Moved Permanently - izvoru koji se nalazio na traţenom URL-u je pridruţen novi URL koji je specificiran u zaglavlju HTTP odgovora. Ako imamo neke bookmarke ili ostale kopije linka moţemo ih sa sigurnošću prepraviti na novi URL.



303 See Other - originalni URL moţe se i dalje koristiti za ovaj zahtjev, ali se informacija isto tako moţe prikazati na drugom URL-u. On se opet nalazi u zaglavlju odgovora



304 Not Modified - u ovom slučaju i odgovor 200 OK bi bio zadovoljavajući, ali ova poruka nam govori da klijent već posjeduje aţuriranu kopiju izvora kojeg traţi, tj nema promjena od zadnjeg preuzimanja, tako da će odgovor sadrţavati samo zaglavlje, bez prijenosa tijela poruke



404 Not Found - URL ne imenuje valjan izvor



500 Initial Server Error - web stranica je „pokidana― što moţe biti posljedica programerske pogreške, konfiguracijskih problema ili nemogućnosti pristupa izvorima



503 Service Unavailable - greška ukazuje da HTTP zahtjev ne moţe biti ispunjen zbog neke privremene greške. Najbolji primjer ove greške Twiterovim korisnicima je Fail Whale. Preusmjeravanja su vrlo česta na webu. Npr. savjesni web programeri prilikom izrade velikog redizajna neke stranice najčešće ostave kôd 301 na sve svoje stare URL-ove kako ne bi drugima uništili bookmarke, vanjske linkove ili rezultate pretraţivanja koji još uvijek 11

pokazuju na njih. Isto tako broj preusmjeravanja se znatno povećava kod određenih web stranica koje imaju preferirana imena posluţitelja koja ţele prikazati korisnicima, ali također omogućavaju korisnicima da unosom nekog od različitih imena posluţitelja uspiju pristupiti ţeljenoj stranici. Kako bi ilustrirali zadnju tvrdnju, promotrimo npr slučaj Google-a. Google preferira da njegovo ime stranice počinje s www pa ako pokušamo otvoriti stranicu google.com bit ćemo preusmjereni na stranicu preferiranu od strane samog Google-a tj. na www.google.com. Konkretan primjer iz Pythona uz pomoć našeg predefiniranog „otvarača― je: >>> info = opener.open('http://google.com/') -------------------------------------------------GET / HTTP/1.1 ... Host: google.com ... -------------------- Response -------------------HTTP/1.1 301 Moved Permanently Location: http://www.google.com/ ... -------------------------------------------------GET / HTTP/1.1 ... Host: www.google.com ... -------------------- Response -------------------HTTP/1.1 200 OK ... >>> info.code 200

U ovom slučaju urllib2 datoteka odradila je preusmjeravanje za nas tako da odgovor prikazuje samo konačni kod: 200 OK. Gledajući kod u odgovoru ne moţemo uvijek sa sigurnošću reći je li došlo do preusmjeravanja jer uz sve moguće promjene uvijek postoji mogućnost da loše napisan server jednostavno vrati krivu stranicu. Jedini način da biblioteka urllib2 zabiljeţi preusmjeravanje je taj da u zahtjevu proslijedimo objekt umjesto jednostavnog proslijeđivanja URL-a kao stringa. Pogledajmo kako bi to izgledalo: >>> request = urllib2.Request('http://www.twitter.com') >>> info = urllib2.urlopen(request) >>> request.redirect_dict {'http://twitter.com/': 1}

12

Isto tako iz ovog primjera vidimo da Twitter ima drugačiju filozofiju od Google-a jer preferira naziv koji ga prikazuje bez www-a. 2.3. Korisnost i postojanost veze U HTTP 1.1 serveri će standardno ostaviti otvorenu TCP konekciju čak i nakon što dostave svoj odgovor. Ovo je korisno jer nam omogućava stvaranje dodatnih zahtjeva na istom socketu uz izbjegavanje kreiranja novog socketa za svaki podatak koji ţelimo skinuti (downloadati). U biblioteci urllib2 imamo klasu HTTPConnection koja iskorištava prednosti ovog svojstva. U suštini, kad koristimo funkcije kao što su urlopen() ili open() na objektu „otvarača―, klasa HTTPConnection se stvara u pozadini, tako da ju ni ne vidimo. Ona je zatim iskorištena za jedan zahtjev, a potom odbačena. Ako ćemo imati više upita na istu stranicu, bilo bi korisno zbog toga koristiti stalnu konekciju, kao što moţemo vidjeti na sljedećem primjeru. >>> import httplib >>> c = httplib.HTTPConnection('www.python.org') >>> c.request('GET', '/') >>> original_sock = c.sock >>> content = c.getresponse().read() # get the whole page >>> c.request('GET', '/about/') >>> c.sock is original_sock True

Vidimo da je rezultat primjera takav da dva uzastopna zahtjeva koriste samo jedan zajednički socket. RFC 2616, ako ga bolje proučimo, definira zaglavlje pod nazivom Connection, a upravo ono eksplicitno govori da je proslijeđeni zahtjev zadnji koji će biti napravljan na tom socketu. Na poslijetku, u primjeru vidimo na koji način moţemo ubaciti zaglavlje Connection kako bi kreirali novi socket za nadolazeće zahtjeve. >>> c = httplib.HTTPConnection('www.python.org') >>> c.request('GET', '/', headers={'Connection': 'close'}) >>> original_sock = c.sock >>> content = c.getresponse().read() >>> c.request('GET', '/about/') >>> c.sock is original_sock False

13

3. HTML (HyperText Markup Language) HTML je programski jezik koji se koristi za kreiranje dokumenata na World Wide Web-u. HTML se koristi za stvaranje hipertekstualnih datoteka (datoteka koje sadrţavaju linkove). Osnovna posebnost HTML-a je definiranje veza (linkova) između dokumenata. HTML koristi URL da adresira druge dokumente. Za pregled HTML stranice korisnik treba interpreter kao što je Microsoft Internet Explorer, Netscape Navigator... koji pregledava HTML sadrţaj. Sam jezik vrlo je jednostavan za naučiti pa je ta jednostavnost pridonijela velikoj popularizaciji World Wide Weba. Povijest HTML-a započinj krajem prve polovice 20. stoljeća kada se razmišljalo na koji način skladištiti tekstualne i grafičke informacije te na koji način iste logički povezati. Ta i slične ideje (a i rješenja) su se desetljećima pojavljivali kao odgovor na razne probleme. Jedan od češćih problema koji je usko povezan sa idejom HTML-a bio je na koji način označiti tj. formatirati tekst i slike. S proširenjem interneta početkom '90-ih i pojavom prvih interpretera internet stranica (među prvima Cello, Viola, MidasWWW) pojavio se i HTML. Od tada do danas HTML je doţivio dosta promjena i verzija. 3.1. Pisanje HTML koda HTML naredbe pišu se u vidu tzv. tag - ova. Jedan tag je naredba koja govori našem pretraţivaču što i kako napraviti tj. na koji način prikazati sadrţaj naših stranice. HTML tagovi su „case insensitive― tj. svejedno je pišemo li ih malim ili velikim slovima. Tagovi se pišu unutar oznaka „― (bez znakova navoda), npr. . Ovaj tag se nalazi na početku svakog HTML dokumenta i on govori našem pretraţivaču da je datoteka koju je upravo počeo učitavati baš HTML dokument i da ga kao takvog treba i prikazati. Na kraj HTML dokumenta se stavlja završni HTML tag: . Ovaj tag govori pretraţivaču da je to kraj našeg HTML dokumenta. Većina tagova ima i početni i završni tag. Završni tag se dobiva dodavanjem znaka "/" i označava mjesto na kojem prestaje djelovanje početnog taga. Postoje i tagovi kod kojih ne moramo stavljati završni tag kao što je recimo tag
koji sluţi za prelazak u novi red. Svaki HTML dokument sastoji se od dva dijela: zaglavlja (head) i tijela (body). Zaglavlje se odvaja tagovima i , a tijelo dokumenta tagovima: i . Sve ono što napišemo u zaglavlju dokumenta neće se prikazati u prozorupretraţivača već obično sluţi samo za pruţanje neke informacije o našoj stranici. Tako ćemo u okviru 14

zaglavlja svakako staviti tagove: i između kojih ćemo staviti naslov naše stranice. To je onaj naslov koji se pojavljuje u naslovnoj liniji pretraţivača. S druge strane, sve ono što napišemo između tagova i predstavljat će tijelo našeg dokumenta i pojavit će se kao sadrţaj naše web stranice u prozoru browsera. Dakle, svaki HTML dokument mora imati sljedeću strukturu: ovdje stavimo naslov naše stranice ovdje stavimo tekst koji želimo da bude vidljiv na stranici

Poznavanje strukture i sadrţaja HTML koda omogućuje nam da bolje razumijemo funkcioniranje web stranice, njihov prikaz i način njihovog dohvaćanja pomoću programskih jezika kao što je Python. HTML kod sadrţi mnoštvo različitih naredbi koje olakšavaju korisniku čitanje web sadrţaja, ali većina njih nije ključna za samo funkcioniranje web stranice, nego većinom sluţi za uljepšavanje prikaza web stranica.

15

4. HTML I PYTHON Dohvaćanje informacija s web stranice počinje analizom stranice pomoću web pretraţivača i pronalaţenjem puta do traţene informacije. U Pythonu koristimo urllib2 bibilioteku, a HTML kod stranice moramo sami pročitati tako što u web pretraţivaču odaberemo opciju View Source i u kodu koji se prikaţe pronađemo traţeni podatak. U kodu se nalazi tag koji napravi POST na određeni URL koristeći samo jedan parametar: inputstring. Sljedeći primjer prikazuje jednostavni Python program koji koristi samo standardnu bibilioteku za obavljanje ovog postupka. #!/usr/bin/env python # Foundations of Python Network Programming - Chapter 10 fetch_urllib2.py # Submitting a form and retrieving a page with urllib2 import urllib, urllib2 data = urllib.urlencode({'inputstring': 'Phoenix, AZ'}) info = urllib2.urlopen('http://forecast.weather.gov/zipcity.php', data) content = info.read() open('phoenix.html', 'w').write(content)

U ovom slučaju morali smo pročitati i razumjeti kôd kako bismo mogli prikupiti traţenu informaciju. Biblioteka mechanize radi na drugačiji način. Potrebno je znati samo prvotnu stranicu, a biblioteka sama proučava HTML kod i pronalazi sve form tagove prisutne na stranici. >>> import mechanize >>> br = mechanize.Browser() >>> response = br.open('http://www.weather.gov/') >>> for form in br.forms(): ... print '%r %r %s' % (form.name, form.attrs.get('id'), form.action) ... for control in form.controls: ... print ' ', control.type, control.name, repr(control.value) None None http://search.usa.gov/search » hidden v:project 'firstgov' » text query '' » radio affiliate ['nws.noaa.gov'] » submit None 'Go' None None http://forecast.weather.gov/zipcity.php » text inputstring 'City, St' » submit Go2 'Go' 'jump' 'jump' http://www.weather.gov/ » select menu ['http://www.weather.gov/alerts-beta/'] button None None

16

Na ovaj način izbjegli smo čitanje HTML koda zbog biblioteke mechanize. Na stranicama koje imaju sakrivena imena formi i polja teško je na ovaj način uočiti tag formu koju traţimo. U tom slučaju sami pregledavamo HTML kod ili na stranici pomoću opcije Inspect element direktno pristupamo elementu traţene forme u hijerarhiji dokumenta. Nakon što smo odredili formu koju trebamo, moţemo napisati program koji učitava traţenu stranicu, postavlja ţeljenu vrijednost u polje, a zatim daje naredbu za slanje dane forme. #!/usr/bin/env python # Foundations of Python Network Programming - Chapter 10 fetch_mechanize.py # Submitting a form and retrieving a page with mechanize import mechanize br = mechanize.Browser() br.open('http://www.weather.gov/') br.select_form(predicate=lambda(form): 'zipcity' in form.action) br['inputstring'] = 'Phoenix, AZ' response = br.submit() content = response.read() open('phoenix.html', 'w').write(content)

Problem korištenja biblioteke mechanize za ovakav oblik jednostavnih zahtjeva leţi u tome što su za dohvat stranice potrebna dva HTTP zahtjeva, dok je u prvom primjeru dohvaćanje stranice obavljeno jednim HTTP zahtjevom.

17

5. ZAKLJUČAK HTTP je osnovni protokol koji koristimo za razmjenu podataka putem Interneta. On se temelji na principu razmjene zahtjeva između klijenta i odgovora koji šalje server na klijentov zahtjev. Poruke imaju svoju zadanu strukturu, a HTTP uz pomoć devet definiranih metoda koje se mogu nalaziti u poruci klijenta razlikuje različite zahtjeve klijenta za određenim sadrţajem. U trenutnoj verziji HTTP-a konekcija koja se uspostavi između klijenta i servera moţe se koristiti i nekoliko puta što je ubrzalo razmjenu informacija na Internetu. HTTP protokolu su dodani i sigurnosni protokoli koji najčešće traţe autentifikaciju klijenta i/ili servera što pridonosi sigurnosti razmjene podataka. HTML je prezentacijski jezik za kreiranje web stranica. On sadrţi niz naredbi za oblikovanje teksta i same stranice. Njegovo poznavanje omogućava nam rukovanjem web stranicama te preuzimanje sadrţaja što nam moţe koristiti prilikom programiranja u programskim jezicima kao što je Python. Prilikom programiranja ili stvaranja web aplikacija potrebno je poznavati HTTP protokol i određeni dio HTML koda te je programiranje moguće izvršiti u programskom jeziku Pythonu. Njegova sintaksa i pripadajuće naredbe su jednostavne i direktne, ali striktno određene. Ovdje su iznešeni samo dijelovi nekih metoda HTTP-a koje se mogu implementirati u Pythonu te neki od primjera kako uz pomoć Pythona moţemo proanalizirati HTTP protokol.

18

6. LITERATURA

[1] B. Rhodes, J. Goerzen, Foundations od Python Network Programming, Apress, 2010. [2] http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol

(11.05.2011.)

[3] www.w3.org

(10.05.2011.)

[4] ools.ietf.org

(10.05.2011.)

[5] http://www.portalalfa.com

(10.05.2011.)

[6] http://www.boddie.org.uk

(10.05.2011.)

[7] http://web.zpr.fer.hr

(10.05.2011.)

19