Сообщить об ошибке.

Чтение и передача cookie, модулем urllib.request в Python

За обработку cookie в модуле urllib.request отвечает класс обработчика URL-адреса urllib.request.HTTPCookieProcessor(cookiejar=None).

Для хранения файлов cookie, которые устанавливает сайт необходимо добавляем обработчик файлов urllib.request.HTTPCookieProcessor() с созданным хранилищем http.cookiejar.CookieJar(). При этом все запросы к сайту, в одной сессии, будут хранить установленные этим сайтом cookie, как это делает браузер.

>>> import http.cookiejar, urllib.request
# создаем хранилище файлов cookie
>>> cj = http.cookiejar.CookieJar()
# добавляем обработчик файлов cookie
>>> opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
# Установим `opener` глобально, чтобы его можно 
# было использовать с функцией `urllib.request.urlopen()`.
>>> urllib.request.install_opener(opener)
# делаем HTTPS запрос на страницу сайта 
>>> request = urllib.request.Request('http://google.ru/')
>>> response = urllib.request.urlopen(request)
# вытаскиваем заголовок 'Set-Cookie' из хранилища
>>> cookie = response.headers.get_all('Set-Cookie')

Проанализируем установленные сайтом google.ru файлы cookie. Для расшифровки и анализа cookie, будем используем модуль http.cookies, который поможет сериализовать строку с установленными куками:

# используем модуль http.cookies для 
# расшифровки строки cookie
# переменная cookie содержит куки из примера выше
>>> cooks = http.cookies.SimpleCookie()
>>> for item in cookie:
...     cooks.load(item)

# Сайт http://google.ru/ поставил 2 куки
>>> cooks.keys()
# dict_keys(['1P_JAR', 'NID'])

# Представление Morsel куки с именем '1P_JAR'
>>> cooks['1P_JAR']
# <Morsel: 1P_JAR=2021-02-17-13; Domain=.google.ru; 
# expires=Fri, 19-Mar-2021 13:13:34 GMT; Path=/; Secure>

# значение cookie с именем '1P_JAR'
>>> cooks['1P_JAR'].value
# '2021-02-17-13'

# значение cookie с именем 'NID'
>>> cooks['NID'].value
'209=HI6jDoac4e6IQ68Rt3v4NkZ332aWRDUeqY-OnJsZUpKbz2oSjVz9ze2qDNVps2......'

# Так выглядит заголовок cookie с именем '1P_JAR' 
# при новом запросе к посещенному сайту.
>>> cooks['1P_JAR'].output()
# 'Set-Cookie: 1P_JAR=2021-02-17-13; Domain=.google.ru; 
# expires=Fri, 19-Mar-2021 13:13:34 GMT; Path=/; Secure'

# Так выглядят все заголовки cookie, при новом запросе к посещенному сайту.
>>> print(cooks.output())
# Set-Cookie: 1P_JAR=2021-02-17-13; .... Path=/; Secure
# Set-Cookie: NID=209=HI6jDoac4e6IQ.... HttpOnly; Path=/

В следующем примере показано использование DefaultCookiePolicy. Включим файлы cookie RFC 2965, что станет более строгими в отношении доменов при установке и возврате файлов cookie Netscape, а так же заблокируем некоторые домены от установки файлов cookie или их возврата:

import urllib.request
from http.cookiejar import CookieJar, DefaultCookiePolicy
policy = DefaultCookiePolicy(
    rfc2965=True, strict_ns_domain=policy.DomainStrict,
    blocked_domains=["ads.net", ".ads.net"])
cj = CookieJar(policy)
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")

В этом примере показано, как установить какие-то другие cookie через передаваемые заголовки headers:

>>> import urllib.request
>>> headers={}
headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
headers['Set-Cookie'] = '1P_JAR=2021-02-17-13; Domain=.google.ru; Path=/; Secure'
# указываем заголовки с cookie, в качестве 
# аргумента объекта Request
req = urllib.request.Request('https://google.ru/', headers)
# отправка GET запроса
response = urllib.request.urlopen(req)
data_page = response.read()

В этом примере показано, как открыть URL-адрес с ранее сохраненными cookie в стиле Netscape, Mozilla или Lynx (предполагается, что расположение файла cookie определяется соглашением Unix/Netscape):

import os, http.cookiejar, urllib.request
cj = http.cookiejar.MozillaCookieJar()
cj.load(os.path.join(os.path.expanduser("~"), ".netscape", "cookies.txt"))
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")

Как очистить файлы cookie в urllib.request?

Если необходимо очистить файлы cookie в cj, просто вызовите cj.clear().