Желілік обьектілерді жүктеудің функциялары

Белгілі URL бойынша WWW-объектісінің қарапайым жағдайы келесі мысалда көрсетілген.

import urllib

doc = urllib.urlopen("http://python.onego.ru").read()

print doc[:40]

urllib.urlopen() функциясы read() әдісімен оқитын, файлтәрізді обьект құрады. Осы обьектің басқа әдістері: readline(), readlines(), fileno(), close() әдеттегі файл бойынша жұмыс істейді, сондай-ақ Message-объект серверінен алынғанмен сәйкестерді қайтаратын info() әдісі бар. Бұл обьектіні қосымша мәлімет алу үшін қолдануға болады:

>>> import urllib

>>> f = urllib.urlopen("http://python.onego.ru")

>>> print f.info()

Date: Sat, 25 Dec 2004 19:46:11 GMT

Server: Apache/1.3.29 (Unix) PHP/4.3.10

Content-Type: text/html; charset=windows-1251

Content-Length: 4291

>>> print f.info()['Content-Type']

text/html; charset=windows-1251

urllib.urlopen() функциясы көмегімен күрделілек заттарды істеуге болады, мысалы, web-серверге форма мәлімметтерін жіберу. Белгілі болғандай, web-формалардың толтырылған мәліметтері web-серверге GET әдісін немесе POST әдісін қолдануымен жіберілуі мүмкін. GET әдісі URL-дегі "?" белгісінен кейін барлық жіберілген параметрлернің кодталуымен байланысты, ал POST әдісінің жағдайында мәліметтер HTTP-сұрауының денесінде жіберіледі. Жіберудің екі нұсқасы төменде келтірілген:

import urllib

data = {"search": "Python"}

enc_data = urllib.urlencode(data)

# метод GET

f = urllib.urlopen("http://searchengine.com/search" + "?" + enc_data)

print f.read()

# метод POST

f = urllib.urlopen("http://searchengine.com/search", enc_data)

print f.read()

Кейбір жағдайларда мәліметтер қайталаныатын аттарға ие. Бұл жағдайда urllib.urlencode() параметірі ретінде сөздік орнына ат-мән жұбының тізбектілігін қолдануға болады:

>>> import urllib

>>> data = [("n", "1"), ("n", "3"), ("n", "4"), ("button", "Привет"),]

>>> enc_data = urllib.urlencode(data)

>>> print enc_data

n=1&n=3&n=4&button=%F0%D2%C9%D7%C5%D4

urllib модулі прокси-сервер арқылы веб-обьектілерді жүктеуге мүмкіндік береді. Егер ештене көрсетпесек,нақты ОЖ тәсілі қабылдануымен берілген прокси-сервер қолданылады. Unix-те прокси-сервер http_proxy, ftp_proxy және т.б. айнымалы арасында беріледі. Windows-та прокси-серверлер реестрде жазылған, ал Mac OS-та олар Internet конфигурациясынан алынады. Прокси-серверді proxies к urllib.urlopen() атты параметр сияқты беруге болады.

# Использовать указанный прокси

proxies = proxies={'http': 'http://www.proxy.com:3128'}

f = urllib.urlopen(some_url, proxies=proxies)

# Не использовать прокси

f = urllib.urlopen(some_url, proxies={})

# Использовать прокси по умолчанию

f = urllib.urlopen(some_url, proxies=None)

f = urllib.urlopen(some_url)

urlretrieve() функциясы берілген URL желілік обьектісін файлда жазуға мүмкіндік береді. Ол келесідей параметрлерге ие:

urllib.urlretrieve(url[, filename[, reporthook[, data]]])

Мұндағы url-желілік обьектінің URL-і, filename- обьекті сыйдыру үшін локальды файл аты, reporthook- жүктеме күйі жайлы хабарлама үшін шақырылатын функия, data-POST ( егер ол қолданылса) әдісі үшін мәліметтер. Функция (filepath, headers) кортежді қайтарады, мұндағы filepath – локальды файл аты.

urllib.urlretrieve() функциясының интерактивтілігін қамтамасыз ету үшін reporthook() берілген функциясын уақыт өте келе шақырады. Бұл функцияда үш аргумент жіберіледі:қабылданған блоктар саны, өлшемі, блоктың және байттағы (бұл параметр -1-ге тең, егер ол белгілі болса) қабылданған жалпы өлшемі.

Келесі мысалда бағдарлама үлкен файл қабылдайды.

FILE = 'boost-1.31.0-9.src.rpm'

URL = 'http://download.fedora.redhat.com/pub/fedora/linux/core/3/SRPMS/' + FILE

def download(url, file):

import urllib, time

start_t = time.time()

def progress(bl, blsize, size):

dldsize = min(bl*blsize, size)

if size != -1:

p = float(dldsize) / size

try:

elapsed = time.time() - start_t

est_t = elapsed / p - elapsed

except:

est_t = 0

print "%6.2f %% %6.0f s %6.0f s %6i / %-6i bytes" % (

p*100, elapsed, est_t, dldsize, size)

else:

print "%6i / %-6i bytes" % (dldsize, size)

urllib.urlretrieve(URL, FILE, progress)

download(URL, FILE)

Бұл бағдарлама келесідей шығарады

0.00 % 1 s 0 s 0 / 6952309 bytes

0.12 % 5 s 3941 s 8192 / 6952309 bytes

0.24 % 7 s 3132 s 16384 / 6952309 bytes

0.35 % 10 s 2864 s 24576 / 6952309 bytes

0.47 % 12 s 2631 s 32768 / 6952309 bytes

0.59 % 15 s 2570 s 40960 / 6952309 bytes

0.71 % 18 s 2526 s 49152 / 6952309 bytes

0.82 % 20 s 2441 s 57344 / 6952309 bytes

Наши рекомендации