На этом шаге мы рассмотрим основные возможности этого модуля.
Модуль urllib.request предоставляет расширенные возможности для получения информации из Интернета. Поддерживаются автоматические перенаправления при получении заголовка Location, возможность аутентификации, обработка cookies и др.
Для выполнения запроса предназначена функция urlopen(). Формат функции:
urlopen (<URL-адрес или объект запроса>[, <Данные>][, <Тайм-аут>] [, cafile=None][, capath=None])
В первом параметре задается полный URL-адрес или объект, возвращаемый конструктором класса Request. Запрос выполняется методом GET, если данные не указаны во втором параметре, и методом POST в противном случае. При передаче данных методом POST автоматически добавляется заголовок Content-Type со значением application/x-www-form-urlencoded.
Третий параметр задает максимальное время выполнения запроса в секундах. Метод возвращает объект класса HTTPRequest.
Этот класс поддерживает следующие методы и атрибуты:
>>> from urllib.request import urlopen >>> res = urlopen("http://mail.ru/testrobots.php") >>> print (res.read(34).decode("cp1251") ) <!DOCTYPE html><html id="nojs" lan
>>> res = urlopen("http://mail.ru/testrobots.php") >>> print (res.readline(100).decode("cp1251") ) <!DOCTYPE html><html id="nojs" lang="ru" class=" nonRetina"><head> <!--MAIL.RU--><meta http-equiv="X-
>>> res = urlopen("http://mail.ru/testrobots.php") >>> res.readlines(1) [b'<!DOCTYPE html><html id="nojs" lang="ru" class=" nonRetina"><head> <!--MAIL.RU--><meta http-equiv="X-UA-Compatible" content="IE=edge"/>& lt;meta charset="utf-8"/> <title>Mail.Ru: . . . Пропуск фрагмента . . . feed=http://news.mail.ru/rss/&id=5; cycle=1"/><script>\n']
>>> res = urlopen("http://mail.ru/testrobots.php") >>> for line in res: print(line)
>>> res = urlopen("http://mail.ru/testrobots.php") >>> info = res.info() >>> info.items() [('Server', 'nginx/1.14.1'), ('Date', 'Sun, 06 Jan 2019 07:48:34 GMT'), ('Content-Type', 'text/html; charset=utf-8'), ('Content-Length', '299131'), ('Connection', 'close'), . . . Пропуск фрагмента . . . ('X-Content-Type-Options', 'nosniff'), ('Strict-Transport-Security', 'max-age=16070400')] >>> info.get("Content-Type") 'text/html; charset=utf-8' >>> info.get_content_type(), info.get_content_charset() ('text/html', 'utf-8') >>> info.get_content_maintype(), info.get_content_subtype() ('text', 'html')
>>> res.code, res.msg
(200, 'OK')
>>> from urllib.request import urlopen >>> from urllib.parse import urlencode >>> data = urlencode ({"color": "Красный", "var" : 15}, encoding ="cp1251") >>> # Отправка данных методом GET >>> url = "http://mail.ru/testrobots.php?" + data >>> res = urlopen(url) >>> print (res.read(34).decode ("cp1251")) <!DOCTYPE html><html id="nojs" lan >>> res.close() >>> # Отправка данных методом POST >>> url = "http://mail.ru/testrobots.php" >>> res = urlopen(url,data.encode("cp1251") ) >>> print (res.read(34).decode("cp1251")) <!DOCTYPE html><html id="nojs" lan >>> res.close()
Если необходимо задать свое название робота и передать дополнительные заголовки, то следует создать экземпляр класса Request и передать его в функцию urlopen() вместо интернет-адреса. Конструктор класса Request имеет следующий формат:
Request (<URL-адрес> [, data=None][, headers={}] [, origin_req_host=None] [, unverifiable=False] [, method=None] )
В первом параметре указывается URL-адрес. Запрос выполняется методом GET, если данные не указаны во втором параметре, или методом POST в противном случае. При передаче данных методом POST автоматически добавляется заголовок Content-Type со значением application/x-www-form-urlencoded. Третий параметр задает заголовки запроса в виде словаря. Четвертый и пятый параметр используются для обработки cookies. Шестой параметр, поддержка которого появилась в Python 3.3, указывает метод передачи данных в виде строки - например: "GET" или "HEAD". За дополнительной информацией по этим параметрам обращайтесь к документации. В качестве примера выполним запросы методами GET и POST.
>>> from urllib.request import urlopen, Request >>> from urllib.parse import urlencode >>> headers = { "User-Agent": "MySpider/1.0", "Accept": "text/html, text/plain, application/xml", "Accept-Language": "ru, ru-RU", "Accept-Charset": "windows-1251", "Referer": "/index.php" } >>> data = urlencode ({"color": "Красный", "var" : 15}, encoding ="cp1251") >>> # Отправка данных методом GET >>> url = "http://mail.ru/testrobots.php?" + data >>> request = Request (url, headers=headers) >>> res = urlopen (request) >>> print (res.read(34).decode("cp1251")) <!DOCTYPE html><html id="nojs" lan >>> # Отправка данных методом POST >>> url = "http://mail.ru/testrobots.php" >>> request = Request(url, data.encode("cp1251"), headers=headers) >>> res = urlopen (request) >>> print (res.read(34).decode("cp1251")) <!DOCTYPE html><html id="nojs" lan >>> res.close()
На следующем шаге мы рассмотрим определение кодировки.