Шаг 246.
Основы языка Python.
Взаимодействие с Интернетом. Обмен данными с помощью модуля urllib.request

    На этом шаге мы рассмотрим основные возможности этого модуля.

    Модуль urllib.request предоставляет расширенные возможности для получения информации из Интернета. Поддерживаются автоматические перенаправления при получении заголовка Location, возможность аутентификации, обработка cookies и др.

    Для выполнения запроса предназначена функция urlopen(). Формат функции:

  urlopen (<URL-адрес или объект запроса>[, <Данные>][, <Тайм-аут>]
    [, cafile=None][, capath=None])

    В первом параметре задается полный URL-адрес или объект, возвращаемый конструктором класса Request. Запрос выполняется методом GET, если данные не указаны во втором параметре, и методом POST в противном случае. При передаче данных методом POST автоматически добавляется заголовок Content-Type со значением application/x-www-form-urlencoded.

    Третий параметр задает максимальное время выполнения запроса в секундах. Метод возвращает объект класса HTTPRequest.

    Этот класс поддерживает следующие методы и атрибуты:

Для примера выполним запросы методами GET и POST.
>>> 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()

    На следующем шаге мы рассмотрим определение кодировки.




Предыдущий шаг Содержание Следующий шаг