http.cookiejar — Обработка cookie для HTTP-клиентов

Исходный код: Lib/http/cookiejar.py


Модуль http.cookiejar определяет классы для автоматической обработки HTTP-файлов cookie. Он полезен для доступа к веб-сайтам, для которых требуются небольшие порции данных - cookies - которые должны быть установлены на клиентском компьютере с помощью HTTP-ответа с веб-сервера, а затем возвращенный на сервер в последующих HTTP-запросах.

Обрабатываются как обычный протокол «cookie» Netscape, так и протокол, определенный функцией «RFC 2965». Обработка RFC 2965 по умолчанию отключена. RFC 2109 файлы cookie анализируются как файлы cookie Netscape и впоследствии обрабатываются как файлы cookie Netscape или RFC 2965 в соответствии с действующей политикой. Следует отметить, что подавляющее большинство файлов cookie в интернете - это файлы cookie Netscape. http.cookiejar пытается следовать фактическому протоколу куки Netscape (который отличается существенно от изложенного в оригинальной спецификации Netscape), включая то, чтобы принимать во внимание max-age и cookies-атрибуты port, начатое с RFC 2965.

Примечание

Различные именованные параметры, найденные в заголовках Set-Cookie и Set-Cookie2 (например, domain и expires) обычно называют attributes. Чтобы отличить их от Python атрибуты, в документации для этого модуля используется термин cookie-attribute.

Модуль определяет следующее исключение:

exception http.cookiejar.LoadError

сущности FileCookieJar поднимают это исключение на отказе загрузить cookies из файла. LoadError является подкласс OSError.

Изменено в версии 3.3: LoadError был сделан подкласс OSError вместо IOError.

Предусмотрены следующие классы:

class http.cookiejar.CookieJar(policy=None)

policy является объектом, реализующим интерфейс CookiePolicy.

Класс CookieJar хранит файлы cookie HTTP. Он извлекает файлы cookie из HTTP- запросов и возвращает их в HTTP-ответах. CookieJar сущности автоматически истекает содержавшее cookies при необходимости. Подклассы также отвечают за хранение и извлечение файлов cookie из файла или базы данных.

class http.cookiejar.FileCookieJar(filename, delayload=None, policy=None)

policy является объектом, реализующим интерфейс CookiePolicy. Другие аргументы см. в документации для соответствующего атрибуты.

CookieJar, который может загрузить cookies от и возможно сохранить cookies к, файл на диске. Кукки - НЕ загруженный из названного файла, пока или load() или метод revert() не называют. Подклассы этого класса задокументированы в разделе FileCookieJar подклассы и сотрудничество с веб-браузерами.

Изменено в версии 3.8: Параметр имени файла поддерживает путеподобный объект.

class http.cookiejar.CookiePolicy

Этот класс отвечает за определение того, следует ли принимать каждый файл cookie с/ возвращенный на сервер.

class http.cookiejar.DefaultCookiePolicy(blocked_domains=None, allowed_domains=None, netscape=True, rfc2965=False, rfc2109_as_netscape=None, hide_cookie2=False, strict_domain=False, strict_rfc2965_unverifiable=True, strict_ns_unverifiable=False, strict_ns_domain=DefaultCookiePolicy.DomainLiberal, strict_ns_set_initial_dollar=False, strict_ns_set_path=False, secure_protocols=("https", "wss"))

Аргументы конструктора должны передаваться только как аргументы ключевой. blocked_domains - последовательность доменных имен, к которым мы никогда не принимаем куки от, ни cookies возвращает . allowed_domains, если не None, это - последовательность единственных областей, для которых мы принимаем и cookies возвращает . secure_protocols представляет собой последовательность протоколов, в которые можно добавлять безопасные файлы cookie. По умолчанию https и wss (безопасный websocket) считаются защищенными протоколами. Все остальные аргументы см. в документации для объектов CookiePolicy и DefaultCookiePolicy.

DefaultCookiePolicy реализует стандартные правила принятия/отклонения для файлов cookie Netscape и RFC 2965. По умолчанию, cookies RFC 2109 (т.е. файлы cookie, полученные в заголовке Set-Cookie с версией cookie-атрибут 1), обрабатываются согласно правилам RFC 2965. Однако, если обработка RFC 2965 выключена, или rfc2109_as_netscape - True, RFC, 2 109 куки „понижено“ CookieJar сущность до куки Netscape, установив version атрибут Cookie сущность к 0. DefaultCookiePolicy также содержит некоторые параметры, позволяющие осуществлять определенную настройку политики.

class http.cookiejar.Cookie

Этот класс представляет файлы cookie Netscape, RFC 2109 и RFC 2965. Не ожидается, что пользователи http.cookiejar строят свои собственные Cookie сущности. Вместо этого, при необходимости, вызовите make_cookies() на CookieJar сущность.

См.также

Модуль urllib.request открытие URL-адреса с автоматической обработкой cookie-файлов.

Модуль http.cookies классы cookie HTTP, в основном полезные для серверных код. Модули http.cookiejar и http.cookies не зависят друг от друга.

https://curl.haxx.se/rfc/cookie_spec.html спецификация исходного протокола Netscape cookie. Хотя это все еще доминирующий протокол, протокол «Netscape cookie», реализованный всеми основными браузерами (и http.cookiejar), имеет только проходящее сходство с тем, что нарисован в cookie_spec.html.

RFC 2109 - механизм управления состоянием HTTP устарел RFC 2965. Использует Set-Cookie с версией = 1.

RFC 2965 - механизм управления состоянием HTTP протокол Netscape с исправленными ошибками. Использует Set-Cookie2 вместо Set-Cookie. Не широко используемый.

http://kristol.org/cookie/errata.html неоконченные ошибки RFC 2965.

RFC 2964 - использование управления состоянием HTTP

Объекты CookieJar и FileCookieJar

Объекты CookieJar поддерживают протокол итератора для итерации над содержащимися объектами Cookie.

CookieJar имеет следующие методы:

Добавьте правильный заголовок Cookie в request.

Если позволяет политика (т.е. rfc2965 и hide_cookie2 атрибуты CookieJar CookiePolicy сущность соответственно являются верными и ложными), заголовок Cookie2 также добавляется, когда это уместно.

Объект request (обычно urllib.request.Request сущность) должен поддержать методы get_full_url(), get_host(), get_type(), unverifiable(), has_header(), get_header(), header_items(), add_unredirected_header() и origin_req_host атрибут, как зарегистрировано urllib.request.

Изменено в версии 3.3: request объект нуждается в origin_req_host атрибут. Удалена зависимость от устаревшего метода get_origin_req_host().

CookieJar.extract_cookies(response, request)

Извлеченные кукки из HTTP response и хранит их в CookieJar, где позволено политикой.

CookieJar будет искать допустимые заголовки Set-Cookie и Set-Cookie2 в аргументе response и хранить файлы cookie при необходимости (при условии утверждения метода CookiePolicy.set_ok()).

Объект response (обычно результат вызова метода urllib.request.urlopen() или подобного) должен поддерживать метод info(), возвращающий метод email.message.Message сущность.

Объект request (обычно urllib.request.Request сущность) должен поддержать методы get_full_url(), get_host(), unverifiable() и origin_req_host атрибут, как зарегистрировано urllib.request. Запрос - используемый, чтобы установить дефолт значения для куки-атрибуты, а также для проверки, что куки разрешены, чтобы быть установленными.

Изменено в версии 3.3: request объект нуждается в origin_req_host атрибут. Удалена зависимость от устаревшего метода get_origin_req_host().

CookieJar.set_policy(policy)

Задайть CookiePolicy сущность для использования.

CookieJar.make_cookies(response, request)

Возвращает последовательность объектов Cookie, извлеченных из объекта response.

См. документацию для extract_cookies() для интерфейсов, требуемых response и аргументов request.

Установить Cookie если политика говорит, что OK.

Установить Cookie, без проверки политики на предмет необходимости ее установки.

CookieJar.clear([domain[, path[, name]]])

Очистить некоторые куки.

При вызове без аргументов очистите все файлы cookie. Если задан один аргумент, будут удалены только куки-файлы, принадлежащие этому domain. Если задано два аргумента, куки-файлы, принадлежащие указанному domain и URL-адресу path, удаляются. Если задано три аргумента, то куки-файл с указанными domain, path и name удаляется.

Вызывает KeyError, если соответствующего файла cookie не существует.

CookieJar.clear_session_cookies()

Удалить все файлы cookie сеанса.

Браки все содержавшее cookies, у которого есть истинный discard атрибут (обычно, потому что у них было или cookies-атрибут не max-age или expires или явное cookies-атрибут discard). Для интерактивных браузеров конец сеанса обычно соответствует закрытию окна браузера.

Обратите внимание, что метод save() в любом случае не сохранит файлы cookie сеанса, если вы не спросите об ином, передав аргумент true ignore_discard.

FileCookieJar реализует следующие дополнительные методы:

FileCookieJar.save(filename=None, ignore_discard=False, ignore_expires=False)

Сохранение файлов cookie в файл.

Этот базовый класс поднимает NotImplementedError. Подклассы могут оставить этот метод нереализованным.

filename - имя файла для сохранения файлов cookie. Если параметр filename не указан, параметр self.filename имеет значение используемый (по умолчанию - значение значение, переданное конструктору, если таковое имеется); если self.filename None, то ValueError поднимается.

ignore_discard: сохранить даже файлы cookie, которые будут отброшены. ignore_expires: сохранение даже файлов cookie, срок действия которых истек

Файл перезаписывается, если он уже существует, в результате чего удаляются все содержащиеся в нем файлы cookie. Сохраненные файлы cookie можно восстановить позже с помощью методов load() или revert().

FileCookieJar.load(filename=None, ignore_discard=False, ignore_expires=False)

Загрузка файлов cookie из файла.

Старые файлы cookie хранятся, если они не перезаписаны вновь загруженными.

Аргументы как для save().

Названный файл должен быть в формате, понятом под классом, или LoadError будет поднят. Кроме того, OSError может быть поднят, например, если файл не существует.

Изменено в версии 3.3: IOError используемый будет поднят, это теперь алиас OSError.

FileCookieJar.revert(filename=None, ignore_discard=False, ignore_expires=False)

Очистить все файлы cookie и перезагрузить файлы cookie из сохраненного файла.

revert() может создавать те же исключения, что и load(). Если будет неудача, то состояние объекта не будет изменен.

FileCookieJar сущности имеют следующие публичные атрибуты:

FileCookieJar.filename

Имя файла по умолчанию, в котором хранятся файлы cookie. Эта атрибут может быть назначена.

FileCookieJar.delayload

Если значение равно true, лениво загружайте файлы cookie с диска. Это атрибут не должно быть назначено. Это только подсказка, так как это влияет только на производительность, а не поведение (если куки-файлы на диске не изменяются). Объект CookieJar может игнорировать его. None классов FileCookieJar, входящих в стандартную библиотеку, лениво загружает куки.

FileCookieJar подклассы и сотрудничество с веб-браузерами

Для чтения и письма предусмотрены следующие CookieJar подклассы.

class http.cookiejar.MozillaCookieJar(filename, delayload=None, policy=None)

FileCookieJar, который может загрузить от и сохранить cookies на диск в формате файла Mozilla cookies.txt (который является также используемый браузерами рыси и Netscape).

Примечание

При этом теряется информация о RFC 2965 cookies, а также о более новых или нестандартных cookie-атрибуты, таких как port.

Предупреждение

Резервное копирование файлов cookie перед сохранением, если у вас есть файлы cookie, потеря/повреждение которых было бы неудобно (есть некоторые тонкости, которые могут привести к незначительным изменениям в файле по мере загрузки/сохранения в оба конца).

Также обратите внимание, что файлы cookie, сохраненные во время работы Mozilla, будут забиты Mozilla.

class http.cookiejar.LWPCookieJar(filename, delayload=None, policy=None)

FileCookieJar, который может загрузить от и сохранить cookies на диск в формате, совместимом с форматом файла libwww-perl библиотеки Set-Cookie3. Это удобно, если вы хотите хранить куки в читаемом человеком файле.

Изменено в версии 3.8: Параметр имени файла поддерживает путеподобный объект.

Объекты CookiePolicy

Объекты, реализующие интерфейс CookiePolicy, имеют следующие методы:

CookiePolicy.set_ok(cookie, request)

Возвращает логическое значение значение, указывающее, следует ли принимать файлы cookie с сервера.

cookie является Cookie сущность. request - это объект, реализующий интерфейс, определенный документацией для CookieJar.extract_cookies().

CookiePolicy.return_ok(cookie, request)

Булев значение возвращает , указывающий, должно ли cookies быть возвращенный к серверу.

cookie является Cookie сущность. request - это объект, реализующий интерфейс, определенный документацией для CookieJar.add_cookie_header().

CookiePolicy.domain_return_ok(domain, request)

Возвращает False если файлы cookie не должны быть возвращенный, данный домен cookie.

Этот метод является оптимизацией. Это устраняет необходимость проверки каждого файла cookie с определенным доменом (что может включать чтение многих файлов). Возвращение true из domain_return_ok() и path_return_ok() оставляет всю работу return_ok().

Если параметр domain_return_ok() возвращает значение true для домена cookie, вызывается метод path_return_ok() для пути cookie. В противном случае path_return_ok() и return_ok() никогда не вызываются для этого домена cookie. Если path_return_ok() возвращает значение true, return_ok() вызывается с самим объектом Cookie для полной проверки. В противном случае return_ok() никогда не вызывается для этого пути cookie.

Обратите внимание, что domain_return_ok() вызывается для каждого домена cookie, а не только для домена request. Например, функция может быть вызвана как с ".example.com", так и с "www.example.com", если домен запроса является "www.example.com". То же самое касается и path_return_ok().

Аргумент request является документированным для return_ok().

CookiePolicy.path_return_ok(path, request)

Возвращает False если файлы cookie не должны быть возвращенный, укажите путь cookie.

См. документацию для domain_return_ok().

В дополнение к реализации методов, описанных выше, реализации интерфейса CookiePolicy должны также предоставлять следующие атрибуты, указывающие, какие протоколы должны быть используемый, и каким образом. Все эти атрибуты могут быть назначены в.

CookiePolicy.netscape

Осуществите протокол Netscape.

CookiePolicy.rfc2965

Осуществите протокол RFC 2965.

CookiePolicy.hide_cookie2

Не добавляйте заголовок Cookie2 к запросам (присутствие этого заголовка указывает к серверу, что мы понимаем cookies RFC 2965).

Наиболее полезным способом определения класса CookiePolicy является подкласс из DefaultCookiePolicy и переопределение некоторых или всех методов, описанных выше. Сам CookiePolicy может быть используемый как „пустой политикой“, чтобы позволить устанавливать и принимать любого и все cookies (это вряд ли будет полезно).

Объекты DefaultCookiePolicy

Реализует стандартные правила приема и возврата файлов cookie.

Куки-файлы как RFC 2965, так и Netscape. Обработка RFC 2965 по умолчанию отключена.

Самый простой способ предоставить собственную политику - переопределить этот класс и вызвать его методы в переопределенных реализациях перед добавлением собственных дополнительных проверок:

import http.cookiejar
class MyCookiePolicy(http.cookiejar.DefaultCookiePolicy):
    def set_ok(self, cookie, request):
        if not http.cookiejar.DefaultCookiePolicy.set_ok(self, cookie, request):
            return False
        if i_dont_want_to_store_this_cookie(cookie):
            return False
        return True

В дополнение к функциям, необходимым для реализации интерфейса CookiePolicy, этот класс позволяет блокировать и разрешать доменам установку и получение файлов cookie. Есть также некоторые переключатели жесткости, которые позволяют немного ужесточить довольно свободные правила протокола Netscape (ценой блокировки некоторых доброкачественных файлов cookie).

Предоставляется черный список домена и белый список (по умолчанию оба отключены). В настройке и возврате файлов cookie участвуют только домены, не включенные в черный список и присутствующие в белом списке (если белый список активен). Используйте аргумент конструктора blocked_domains, и blocked_domains() и методы set_blocked_domains() (и соответствующий аргумент и методы для allowed_domains). Если задать белый список, его можно снова отключить, установив значение None.

Домены в списках блокировки или разрешения, которые не начинаются с точки, должны быть равны домену cookie для сопоставления. Например, "example.com" соответствует записи черного списка "example.com", но "www.example.com" не. Домены, начинающиеся с точки, также сопоставляются с более конкретными доменами. Например, и "www.example.com", и "www.coyote.example.com" совпадают ".example.com" (но сам "example.com" нет). IP-адреса являются исключением и должны точно совпадать. Например, если blocked_domains содержит "192.168.1.2" и ".168.1.2", 192.168.1.2 блокируется, а 193.168.1.2 - нет.

DefaultCookiePolicy реализует следующие дополнительные методы:

DefaultCookiePolicy.blocked_domains()

Возвращает последовательность заблокированных доменов (в виде кортежа).

DefaultCookiePolicy.set_blocked_domains(blocked_domains)

Задайте последовательность заблокированных доменов.

DefaultCookiePolicy.is_blocked(domain)

Возвращает находится ли domain в черном списке для установки или получения файлов cookie.

DefaultCookiePolicy.allowed_domains()

Возвращает None, или последовательность разрешенных доменов (в виде кортежа).

DefaultCookiePolicy.set_allowed_domains(allowed_domains)

Задайте последовательность разрешенных доменов или None.

DefaultCookiePolicy.is_not_allowed(domain)

Возвращает отсутствует ли domain в белом списке для установки или получения файлов cookie.

DefaultCookiePolicy сущности имеют следующие атрибуты, которые все инициализируются из аргументов конструктора с тем же именем и которым могут быть присвоены.

DefaultCookiePolicy.rfc2109_as_netscape

Если это правда, запрос, что снижение CookieJar сущность cookies RFC 2109 (т.е. cookies, полученное в заголовке Set-Cookie с cookies-атрибут вариантов 1) к печенью Netscape, устанавливая версию атрибут Cookie сущность к 0. Дефолт значение - None, в этом случае RFC 2 109 куки, понижен, если и только если обработка RFC 2965 выключена. Поэтому RFC 2 109 куки понижены по умолчанию.

Общая строгость switches:

DefaultCookiePolicy.strict_domain

Не позволяйте сайтам устанавливать двухкомпонентные области со страной-код области верхнего уровня как .co.uk, .gov.uk, .co.nz.etc. Это далеко не идеально и не гарантированно работать!

RFC 2965 переключатели строгости протокола:

DefaultCookiePolicy.strict_rfc2965_unverifiable

Следуйте правилам RFC 2965 для непроверяемых транзакций (обычно непроверяемой транзакцией является транзакция, являющаяся результатом перенаправления или запроса изображения, размещенного на другом сайте). Если это ложно, файлы cookie never блокируются на основании возможности проверки

Коммутаторы строгости протокола Netscape:

DefaultCookiePolicy.strict_ns_unverifiable

Применять правила RFC 2965 к непроверяемым транзакциям даже для файлов cookie Netscape.

DefaultCookiePolicy.strict_ns_domain

Флаги, указывающие, насколько строгими должны быть правила соответствия доменов для файлов cookie Netscape. Для получения информации о приемлемых значения см. ниже.

DefaultCookiePolicy.strict_ns_set_initial_dollar

Игнорировать куки в Set-Cookie: заголовки, имена которых начинаются с '$'.

DefaultCookiePolicy.strict_ns_set_path

Не разрешать установку файлов cookie, путь которых не соответствует URI запроса пути.

strict_ns_domain представляет собой коллекцию флагов. Его значение строится или- ing вместе (например, DomainStrictNoDots|DomainStrictNonDomain означает, что установлены оба флага).

DefaultCookiePolicy.DomainStrictNoDots

При настройке файлов cookie префикс хоста не должен содержать точку (например, www.foo.bar.com не может задать файл cookie для .bar.com, поскольку www.foo содержит точку).

DefaultCookiePolicy.DomainStrictNonDomain

cookies, которое явно не определило cookies-атрибут domain, может только быть возвращенный к области, равной области, которые устанавливают cookies (например. spam.example.com не будет возвращенный cookie из example.com, у которого не было domain cookie-атрибут).

DefaultCookiePolicy.DomainRFC2965Match

Устанавливая cookies, потребуйте полного матча области RFC 2965.

Для удобства предусмотрены следующие атрибуты, которые являются наиболее полезными сочетаниями вышеперечисленных флагов:

DefaultCookiePolicy.DomainLiberal

Эквивалентно 0 (т. е. все вышеперечисленные флаги строгости домена Netscape отключены).

DefaultCookiePolicy.DomainStrict

Эквивалентный DomainStrictNoDots|DomainStrictNonDomain.

Объекты куки

Cookie сущности имеют Python атрибуты примерно соответствующий стандарту cookie-атрибуты, указанному в различных стандартах cookie. Корреспонденция не непосредственная, потому что там сложные правила для назначения дефолта значения, потому что max-age и cookies-атрибуты expires содержат эквивалентную информацию, и потому что cookies RFC 2109 может быть „понижено“ http.cookiejar от версии 1 до версии 0 (Netscape) cookies.

Присвоение этих атрибуты не должно быть необходимым, кроме как в редких случаях в методе CookiePolicy. Класс не обеспечивает внутреннюю согласованность, поэтому вы должны знать, что вы делаете, если вы делаете это.

Cookie.version

Целое число или None. Файлы cookie Netscape имеют version 0. RFC 2965 и RFC 2109 cookies имеют version cookie-атрибут 1. Тем не менее, обратите внимание, что http.cookiejar может «понизить» файлы cookie RFC 2109 до файлов cookie Netscape, в этом случае version равен 0.

Cookie.name

Имя файла cookie (строка).

Cookie.value

cookies значение (строка), или None.

Cookie.port

Строка, представляющая порт или набор портов (например, „80“, или „80,8080“), или None.

Cookie.path

Путь cookie (a строка, например. '/acme/rocket_launchers').

Cookie.secure

True, если cookies должно только быть возвращенный по безопасному соединению.

Cookie.expires

Целочисленная дата истечения срока действия в секундах с момента или None. См. также метод is_expired().

Cookie.discard

True, если это файл cookie сеанса.

Cookie.comment

Строковый комментарий с сервера, объясняющий функцию этого файла cookie или None.

Cookie.comment_url

URL-адрес, связанный с комментарием с сервера, объясняющим функцию этого файла cookie или None.

Cookie.rfc2109

True если этот cookie был получен как RFC 2109 cookie (т е. файл cookie поступил в заголовок Set-Cookie и значение версии cookie-attribute в этом заголовке был 1). Это атрибут предоставляется потому, что http.cookiejar может «понизить» файлы cookie RFC 2109 до файлов cookie Netscape, в этом случае version равен 0.

Cookie.port_specified

True если порт или набор портов был явно указан сервером (в заголовке Set-Cookie/ Set-Cookie2).

Cookie.domain_specified

True, если домен был явно указан сервером.

Cookie.domain_initial_dot

True если домен, явно указанный сервером, начинается с точки ('.').

Файлы cookie могут иметь дополнительные нестандартные cookie-атрибуты. Доступ к ним можно получить следующими способами:

Cookie.has_nonstandard_attr(name)

Возвращает True если cookie имеет имя cookie-атрибут.

Cookie.get_nonstandard_attr(name, default=None)

Если cookie имеет имя cookie-атрибут, возвращает его значение. В противном случае, возвращает default.

Cookie.set_nonstandard_attr(name, value)

Задайте значение именованного cookie-атрибут.

Класс Cookie также определяет следующий метод:

Cookie.is_expired(now=None)

True, прошел ли срок действия куки-файла по запросу сервера. Если задано значение now (в секундах после эпохи), возвращает , истек ли срок действия файла cookie в указанное время.

Примеры

Первый пример показывает наиболее распространенное использование http.cookiejar:

import http.cookiejar, urllib.request
cj = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")

В этом примере показано, как открыть 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/")

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

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/")