Sunday, August 30, 2015

თავი 12(12,1 - 12,2)



თავი 12


წიგნში მოყვანილი მაგალითები ძირითადად ფოკუსირებული იყო ფაილის წაკითხვაზე და ამ ფაილში მონაცემების ძებნაზე, თუმცა არსებობს ინფორმაციის ბევრი წყარო და მათგან ერთია ინტერნეტი.
ამ თავში მოვახდენთ ვებ ბრაუზერის სიმულირებას და მოვიძიებთ ვებ გვერდებს
HyperText Transport Protocol - ის  (HTTP) მეშვეობით. შემდეგ წავიკითხავთ ვებ გვერდის  მონაცემებს და გავარჩევთ.


12.1 HyperText Transport Protocol - HTTP


ქსელის პროტოკოლი რომლითაც იმართება ვები სინამდვილეში საკმაოდ მარტივია და პითონში არის ჩაშენებული მხარდაჭერა sockets, რომელიც პითონის პროგრამაში ქსელის კავშირს და მონაცემების მოძიებას ხდის ძალიან ადვილს.
Socket ჰგავს ფაილს. გარდა ამისა უზრუნველყოფს ორმხრივ კავშირს ორ პროგრამას შორის ერთი სოკეტით. თქვენ შეგიძლიათ წაკითხვაც და ჩაწერაც ერთი და იგივე სოკეტში. სოკეტში რამეს თუ დაწერთ, გადაიგზავნება აპლიკაციაში სოკეტის მეორე ბოლოში და რამეს თუ წაიკითხავთ სოკეტიდან მოგეცემა მონაცემები, რომელიც სხვა აპლიკაციიდან გამოიგზავნა.
მაგრამ თუ ცდი სოკეტის წაკითხვას, როცა სოკეტის მეორე ბოლოდან პროგრამას  არ აქვს გამოგზავნილი მონაცემები უბრალოდ დაჯდები და დაელოდები. პროგრამები სოკეტის ორივე ბოლოში თუ ელოდებიან რაიმე მონაცემს და არ გზავნიან რამეს, ისინი დაელოდებიან ძალიან დიდი ხანი.
პროგრამების (რომელთაც აქვთ ურთიერთობა ინტერნეტთან) მნიშვნელოვანი ნაწილია, რომ ჰქონდეს გარკვეული სახის პროტოკოლი. პროტოკოლი ეს არის წესების ზუსტი წყება, რომელიც განსაზღვრავს თუ რომელი იქნება პირველი, რას გააკეთებენ, რა არის პასუხი მესიჯზე, შემდეგ ვინ გაგზავნის და.ა.შ.  ამ თვალსაზრისით ორი აპლიკაცია სოკეტის ორივე ბოლოში „ცეკვავს“ და ფრთხილობენ რომ ერთმანეთს ფეხსაცმელზე არ დააბიჯონ.
არსებობს ქსელის პროტოკოლის აღწერის ბევრი დოკუმენტაცია. Hyper-
Text Transport Protocol აღწერილია შემდეგ დოკუმენტში:

http://www.w3.org/Protocols/rfc2616/rfc2616.txt

ესაა დიდი და კომპლექსური 176 გვერდიანი დოკუმენტი ბევრი დეტალით. საინტერესოდ თუ გეჩვენება, წაკითხვა არ მოგერიდოს, მაგრამ 36-ე გვერდს თუ გადახედავ, ნახავ სინტაქსს GET მოთხოვნისთვის. დეტალურად თუ წაიკითხავ აღმოაჩენ, რომ ვებ სერვერზე დოკუმენტის მოთხოვნისას ვუკავშირდებით www.py4inf.com სერვერს 80 პორტზე და შემდეგ ვგზავნით ამ ფორმის ხაზს:

GET http://www.py4inf.com/code/romeo.txt HTTP/1.0

სადაც მეორე პარამეტრი არის ვებ გვერდი რასაც ვითხოვთ და შემდეგ ჩვენ ასევე ვგზავნით ცარიელი ხაზს. ვებ სერვერი გვიპასუხებს რაიმე თავსართი ინფორმაციით დოკუმენტის შესახებ და ცარიელი ხაზით რასაც მოჰყვება დოკუმენტის შინაარსი.


12.2 The World’s Simplest Web Browser


ყველაზე ადვილი გზა იმის საჩვენებლად თუ როგორ მუშაობს HTTP პროტოკოლი არის დაწერო პითონის მარტივი პროგრამა, რომელიც უკავშირდება ვებ-სერვერს და იცავს HTTP პროტოკოლის წესებს, ითხოვს დოკუმენტს და აჩვენებს რასაც სერვერი უგზავნის.

import socket

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('www.py4inf.com', 80))
mysock.send('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n')

while True:
data = mysock.recv(512)
if ( len(data) < 1 ) :
break
print data

mysock.close()


პირველად პროგრამა უკავშირდება www.py4inf.com სერვერს მე-80 პორტზე. მას შემდეგ, რაც ჩვენი პროგრამა თამაშობს ვებ ბრაუზერის როლს, HTTP ამბობს: ჩვენ უნდა გავუგზავნოთ GET ბრძანება, რასაც მოყვება ცარიელი ხაზი.
                       
                       


როცა გავგზავნით ცარიელ ხაზს, დავწერთ მარყუჟს, რომელიც სოკეტიდან იღებს 512 სიმბოლოს მოცულობის მონაცემს და ბეჭდავს მონაცემებს სანამ წასაკითხი მონაცემი აღარ იქნება ( recv() აბრუნებს ცარიელ სტრინგს)

პროგრამას აქვს შემდეგი ამონაბეჭდი:

HTTP/1.1 200 OK
Date: Sun, 14 Mar 2010 23:52:41 GMT
Server: Apache
Last-Modified: Tue, 29 Dec 2009 01:31:22 GMT
ETag: "143c1b33-a7-4b395bea"
Accept-Ranges: bytes
Content-Length: 167
Connection: close
Content-Type: text/plain

But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief


ამონაბეჭდი იწყება „სათაურით“ რომელსაც ვებ სერვერი გზავნის დოკუმენტის აღსაწერად. მაგალითად, „სათაურში“ Content-Type აჩვენებს რომ დოკუმენტი არის მარტივი(ჩვეულებრივი) ტექსტური დოკუმენტი (text/plain).

მას შემდეგ, რაც სერვერმა გამოგზავნა „სათაური“, ამატებს ცარიელ ხაზს სათაურის დასასრულის საჩვენებლად და შემდეგ გზავნის romeo.txt ფაილის ნამდვილ მონაცემებს.

ეს მაგალითი გვაჩვენებს თუ როგორ გავაკეთოთ დაბალი დონის ქსელური კავშირი სოკეტთან. სოკეტების გამოყენება შეიძლება ვებ სერვერებთან საკომუნიკაციოდ ან მეილ სერვერებთან თუ მრავალი სხვა ტიპის სერვერთან. ეს ყველაფერი საჭიროა დოკუმენტის საპოვნელად, რომელიც აღწერს პროტოკოლს და კოდის დასაწერად, რომ გაგზავნო და მიიღო მონაცემები პროტოკოლის შესაბამისად.
პროტოკოლი, რომელსაც ყველაზე ხშირად ვიყენებთ არის HTTP (ანუ ვებ გვერდი) პროტოკოლი. პითონს აქვს სპეციალური ბიბლიოთეკა სპეციალურად გაკეთებული HTTP პროტოკოლის მხარდაჭერით დოკუმენტების და მონაცემების ვებზე მოსაძებნად.