LINUX.ORG.RU

[python] urlopen без автоматического редиректа

 


0

1

Доброго времени суток.

Есть код, который через urllib2.urlopen получает страницу на которой есть редирект. Мне надо получить с неё куки, но автоматически происходит переход по редиректу, и куки с исходной страницы я не получаю. Вопрос, можно ли как-то отключить переход по автоматическому редиректу?

Заранее спасибо!


Ответ на: комментарий от baverman

Не совсем... Там есть HTTPRedirectHandler... Интуиция мне подсказывает что это хрень как раз и отвечает за редирект... Но вот что с ней сделать чтобы она перестала редиректить, пока не понял....

Daeloce
() автор топика
Ответ на: комментарий от Daeloce

Но вот что с ней сделать чтобы она перестала редиректить, пока не понял....

Есть два варианта.

1) Убрать этот хендлер из списка обработчиков. Но там не всё так просто, и связано с знанием реализации открывателя.

2) Самому инстанцировать OpenerDirector и добавить нужные, без обработчика редиректа. Примерно так:

opener = OpenerDirector()

h_classes = [ProxyHandler, UnknownHandler, HTTPHandler,
    HTTPSHandler, HTTPDefaultErrorHandler,
    FTPHandler, FileHandler, HTTPErrorProcessor]
    
for klass in h_classes:
    opener.add_handler(klass())
baverman ★★★
()
Ответ на: комментарий от baverman

Ага, спасибо, частично заработало!

Только теперь мне валиться ошибка 301(что и правильно, так как она соответствует редиректу), но как теперь данные получить со страницы с редиректом, а именно куки?

Т.е. я делаю:

try:
  res = opener.open(req);
except:
  print res.info()

Он естественно ругается, т.к. не знает что такое res... Как теперь получить данные?

Daeloce
() автор топика
Ответ на: комментарий от Daeloce
from urllib2 import (OpenerDirector, UnknownHandler, HTTPHandler,
    HTTPDefaultErrorHandler, HTTPErrorProcessor, HTTPCookieProcessor, HTTPError)

opener = OpenerDirector()

h_classes = [UnknownHandler, HTTPHandler,
    HTTPDefaultErrorHandler, HTTPErrorProcessor]

cookieprocessor = HTTPCookieProcessor()

opener.add_handler(cookieprocessor)
for klass in h_classes:
    opener.add_handler(klass())

try:
    res = opener.open('http://google.com')
except HTTPError, e:
    print e.headers
    print 'Cookies', list(cookieprocessor.cookiejar)
baverman ★★★
()
Ответ на: комментарий от Daeloce

Чтобы не отлавливать ошибки убрал еще HTTPErrorProcessor

Он не только ошибки редиректа отлавливает.

baverman ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.