Небольшое обновление для 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'

Есть идеи?

Ответы на вопрос(4)

Ваш ответ на вопрос