За обработку 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()
.