Небольшое обновление для 2017 года. Кажется, теперь urllib2 правильно сохраняет файлы cookie после перенаправления. Я слишком перенес свой код на запросы lib, пытаясь решить загадочную проблему с отсутствующим cookie, но в итоге обнаружил, что в одном из моих полей POST есть дополнительный '\ r \ n'. Это привело к неудачной авторизации и отсутствию файла cookie. Исправление этой проблемы в моем исходном коде на основе urllib2 также привело к корректному поведению.
ользую liburl2 с CookieJar / HTTPCookieProcessor в попытке смоделировать вход на страницу для автоматизации загрузки.
Я видел некоторые вопросы и ответы на этот вопрос, но ничего, что решает мою проблему. Я теряю свой cookie, когда я имитирую логин, который заканчивается перенаправлением 302. Ответ 302 - это то, где cookie устанавливается сервером, но urllib2 HTTPCookieProcessor, похоже, не сохраняет cookie во время перенаправления. Я попытался создать класс HTTPRedirectHandler, чтобы игнорировать перенаправление, но это не помогло. Я попытался ссылаться на CookieJar глобально для обработки файлов cookie из HTTPRedirectHandler, но 1. Это не сработало (потому что я обрабатывал заголовок из перенаправителя, а используемой мной функции CookieJar extract_cookies требовался полный запрос) и 2. Это ужасный способ справиться с этим.
Мне, вероятно, нужно какое-то руководство по этому вопросу, так как я довольно зеленый с Python. Я думаю, что я в основном лаю здесь правильное дерево, но, возможно, сосредотачиваюсь не на той ветви.
cj = cookielib.CookieJar()
cookieprocessor = urllib2.HTTPCookieProcessor(cj)
class MyHTTPRedirectHandler(urllib2.HTTPRedirectHandler):
def http_error_302(self, req, fp, code, msg, headers):
global cj
cookie = headers.get("set-cookie")
if cookie:
# Doesn't work, but you get the idea
cj.extract_cookies(headers, req)
return urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers)
http_error_301 = http_error_303 = http_error_307 = http_error_302
cookieprocessor = urllib2.HTTPCookieProcessor(cj)
# Oh yeah. I'm using a proxy too, to follow traffic.
proxy = urllib2.ProxyHandler({'http': '127.0.0.1:8888'})
opener = urllib2.build_opener(MyHTTPRedirectHandler, cookieprocessor, proxy)
Дополнение: я тоже пытался использовать механизацию, но безуспешно. Вероятно, это новый вопрос, но я задам его здесь, поскольку это та же самая конечная цель:
Этот простой код, использующий mechanize, при использовании с исходящим URL-адресом 302 (http://fxfeeds.mozilla.com/firefox/headlines.xml) - обратите внимание, что то же поведение происходит, когда не используется set_handle_robots (False). Я просто хотел убедиться, что это не так:
import urllib2, mechanize
browser = mechanize.Browser()
browser.set_handle_robots(False)
opener = mechanize.build_opener(*(browser.handlers))
r = opener.open("http://fxfeeds.mozilla.com/firefox/headlines.xml")
Выход:
Traceback (most recent call last):
File "redirecttester.py", line 6, in <module>
r = opener.open("http://fxfeeds.mozilla.com/firefox/headlines.xml")
File "build/bdist.macosx-10.6-universal/egg/mechanize/_opener.py", line 204, in open
File "build/bdist.macosx-10.6-universal/egg/mechanize/_urllib2_fork.py", line 457, in http_response
File "build/bdist.macosx-10.6-universal/egg/mechanize/_opener.py", line 221, in error
File "build/bdist.macosx-10.6-universal/egg/mechanize/_urllib2_fork.py", line 332, in _call_chain
File "build/bdist.macosx-10.6-universal/egg/mechanize/_urllib2_fork.py", line 571, in http_error_302
File "build/bdist.macosx-10.6-universal/egg/mechanize/_opener.py", line 188, in open
File "build/bdist.macosx-10.6-universal/egg/mechanize/_mechanize.py", line 71, in http_request
AttributeError: OpenerDirector instance has no attribute '_add_referer_header'
Есть идеи?