Интерфейсы urllib

interfejsy urllib Сценарии на стороне клиента

Еще одна версия: в следующем сценарии загрузки на базе модуля urllib. request используется более высокоуровневый интерфейс urlretrieve из этого модуля, автоматически сохраняющий загруженный файл или вывод сценария в локальном файле на компьютере клиента. Этот интерфейс удобно использовать, когда действительно требуется сохранить полученные данные (например, чтобы сымитировать протокол FTP). Однако, если планируется немедленная обработка загружаемых данных, такая форма загрузки может оказаться менее удобной, чем только что рассмотренная версия: потребуется открыть и прочитать содержимое сохраненного файла. Кроме того, потребуется реализовать дополнительный протокол определения или получения имен локальных файлов, как в примере 13.31.

Пример 13.31. PP4E\Internet\Other\http-getfile-urllib2.py

получает файл с сервера HTTP (web) через сокеты с помощью urlllib; в этой версии используется интерфейс, сохраняющий полученные данные в локальном файле в двоичном режиме; имя локального файла передается в аргументе командной строки или выделяется из URL посредством модуля urllib.parse: аргумент с именем файла может содержать путь к каталогу в начале и параметры запроса в конце, поэтому функции os.path. split будет недостаточно (отделяет только путь к каталогу);

предостережение: имя файла следует обрабатывать функцией urllib.parse.quote, если заранее не известно, что оно не содержит недопустимых символов — смотрите следующие главы;

import sys, os, urllib.request, urllib.parse showlines = 6

try:

servername, filename = sys.argv[1:3] # первые 2 арг. командной строки? except:

servername, filename = ‘learning-python.com’, ‘/index.html’

remoteaddr = ‘http://%s%s’ % (servername, filename) # любой адрес в Сети if len(sys.argv) == 4: # получить имя файла

localname = sys.argv[3]

else:

(scheme,server,path,parms,query,frag) = urllib.parse.

urlparse(remoteaddr)

localname = os.path.split(path)[1]

print(remoteaddr, localname)

urllib.request.urlretrieve(remoteaddr, localname) # файл или сценарий remotedata = open(localname, ‘rb’).readlines() # сохранит в локальном файле for line in remotedata[:showlines]: print(line) # файлдвоичный

Запустим этот последний вариант из командной строки. Он действует точно так же, как последние две версии: подобно предыдущей версии он конструирует URL, и, как в обеих последних версиях, можно явно указать целевой сервер и путь к файлу в командной строке:

C:\\PP4E\Internet\Other> http-getfile-urllib2.py http://learning-python.com/index.html index.html b'<HTML>\n’ b’ \n’ b'<HEAD>\n’

b"<TITLE>Mark Lutz’s Python Training Services</TITLE>\n"

b'<!mstheme><link rel="stylesheet" type="text/css" href="_themes/blends/ blen…’

b'</HEAD>\n’

C:\\PP4E\Internet\Other> http-getfile-urllib2.py www.python.org /index.html http://www.python.org/index.html index.html

b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// www.w3

b’\n’ b’\n’

b'<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n’ b’\n’

b‘<head>\n

Из-за использования в этой версии интерфейса urllib.request, автоматически сохраняющего загруженные данные в локальном файле, она по духу ближе к загрузке файлов по протоколу FTP. Но этот сценарий должен также каким-то образом получить имя локального файла, в который будут записаны данные. Можно позволить сценарию вырезать из созданного URL базовое имя файла и использовать его, либо передавать имя локального файла в последнем аргументе командной строки. В предшествующем примере запуска загруженная веб-страница сохраняется в локальный файл index.html — базовое имя файла, выделенное из URL (сценарий выводит URL и имя локального файла в первой строке вывода). В следующем примере запуска имя локального файла передается явным образом как py-index.html:

C:\\PP4E\Internet\Other> http-getfile-urllib2.py

www.python.org /index.html py-index.html http://www.python.org/index.html py-index.html

b'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" http://www.w3

b’\n’

b’\n’

b'<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n’ b’\n’

b'<head>\n’

C:\\PP4E\Internet\Other> http-getfile-urllib2.py

www.rmi.net /~lutz books.html

http://www.rmi.net/~lutz books.html

b'<HTML>\n’

b’\n’

b'<HEAD>\n’

b"<TITLE>Mark Lutz’s Book Support Site</TITLE>\n"

b'</HEAD>\n’

b'<BODY BGCOLOR="#f1f1ff">\n’

C:\\PP4E\Internet\Other> http-getfile-urllib2.py

www.rmi.net /~lutz/about-pp.html

http://www.rmi.net/~lutz/about-pp.html about-pp.html

b'<HTML>\n’

b’\n’

b'<HEAD>\n’

b'<TITLE>About "Programming Python"</TITLE>\n’

b‘</HEAD>\n

b‘\n

Использованная литература:

Марк Лутц — Программирование на Python, 4-е издание, II том, 2011

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий