Шрифт:
Листинг
# Использовать указанный прокси
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 — имя локального файла, в который закачан объект, headers — результат метода info для объекта, возвращенного urlopen.
Для обеспечения интерактивности функция 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
…
Функции для анализа URL
Согласно документу RFC 2396 URL должен строиться по следующему шаблону:
Листинг
scheme://netloc/path;parameters?query#fragment
где
Листинг
scheme
Адресная схема. Например: http, ftp, gopher.
Листинг
netloc
Местонахождение в сети.
Листинг
path
Путь к ресурсу.
Листинг
params
Параметры.
Листинг
query
Строка запроса.
Листинг
frag
Идентификатор фрагмента.
Одна из функций уже использовалась для формирования URL — urllib.urlencode. Кроме нее в модуле urllib имеются и другие функции:
Листинг
quote(s, safe='/')
Функция экранирует символы в URL, чтобы их можно было отправлять на web–сервер. Она предназначена для экранирования пути к ресурсу, поэтому оставляет '/' как есть. Например:
Листинг
>>> urllib.quote(«rnd@onego.ru»)
'rnd%40onego.ru'
>>> urllib.quote(«a = b + c»)
'a%20%3D%20b%20%2B%20c'
>>> urllib.quote(«0/1/1»)
'0/1/1'
>>> urllib.quote(«0/1/1», safe="")
'0%2F1%2F1'
quote_plus(s, safe='')
Функция экранирует некоторые символы в URL (в строке запроса), чтобы их можно было отправлять на web–сервер. Аналогична quote, но заменяет пробелы на плюсы.
Листинг
unquote(s)
Преобразование, обратное quote_plus. Пример:
Листинг
>>> urllib.unquote('a%20%3D%20b%20%2B%20c')
'a = b + c'
unquote_plus(s)
Преобразование, обратное quote_plus. Пример:
Листинг
>>> urllib.unquote_plus('a+=+b+%2B+c')