В настоящее время я пытаюсь войти на сайт с использованием Python, однако, похоже, сайт отправляет файл cookie и оператор перенаправления на той же странице. Кажется, что Python следит за тем, что перенаправление таким образом мешает мне читать cookie-сообщение на странице входа. Как предотвратить использование urlib (или urllib2) python после перенаправления?
Как предотвратить Python urllib (2) от перенаправления
Ответ 1
Вы могли бы сделать пару вещей:
- Создайте свой собственный HTTPRedirectHandler, который перехватывает каждую переадресацию
- Создайте экземпляр HTTPCookieProcessor и установите этот открыватель, чтобы у вас был доступ к файлу cookiejar.
Это небольшая вещь, которая показывает как
import urllib2
#redirect_handler = urllib2.HTTPRedirectHandler()
class MyHTTPRedirectHandler(urllib2.HTTPRedirectHandler):
def http_error_302(self, req, fp, code, msg, headers):
print "Cookie Manip Right Here"
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()
opener = urllib2.build_opener(MyHTTPRedirectHandler, cookieprocessor)
urllib2.install_opener(opener)
response =urllib2.urlopen("WHEREEVER")
print response.read()
print cookieprocessor.cookiejar
Ответ 2
Если вам нужно только остановить перенаправление, тогда есть простой способ сделать это. Например, я хочу получать файлы cookie и для лучшей производительности я не хочу перенаправляться на любую другую страницу. Также я надеюсь, что код будет сохранен как 3xx. допустим, например, 302.
class MyHTTPErrorProcessor(urllib2.HTTPErrorProcessor):
def http_response(self, request, response):
code, msg, hdrs = response.code, response.msg, response.info()
# only add this line to stop 302 redirection.
if code == 302: return response
if not (200 <= code < 300):
response = self.parent.error(
'http', request, response, code, msg, hdrs)
return response
https_response = http_response
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj), MyHTTPErrorProcessor)
Таким образом, вам даже не нужно заходить в urllib2.HTTPRedirectHandler.http_error_302()
Еще более распространенным является то, что мы просто хотим прекратить перенаправление (по мере необходимости):
class NoRedirection(urllib2.HTTPErrorProcessor):
def http_response(self, request, response):
return response
https_response = http_response
И обычно используйте его так:
cj = cookielib.CookieJar()
opener = urllib2.build_opener(NoRedirection, urllib2.HTTPCookieProcessor(cj))
data = {}
response = opener.open('http://www.example.com', urllib.urlencode(data))
if response.code == 302:
redirection_target = response.headers['Location']
Ответ 3
urllib2.urlopen
вызывает build_opener()
, который использует этот список классов обработчиков:
handlers = [ProxyHandler, UnknownHandler, HTTPHandler,
HTTPDefaultErrorHandler, HTTPRedirectHandler,
FTPHandler, FileHandler, HTTPErrorProcessor]
Вы можете попробовать вызвать urllib2.build_opener(handlers)
самостоятельно со списком, который пропускает HTTPRedirectHandler
, а затем вызвать метод open()
для результата, чтобы открыть ваш URL. Если вам действительно не нравятся переадресации, вы можете даже позвонить urllib2.install_opener(opener)
своему открытию без перенаправления.
Похоже, ваша настоящая проблема заключается в том, что urllib2
не делает файлы cookie так, как вам хотелось бы. См. Также Как использовать Python для входа на веб-страницу и получения файлов cookie для последующего использования?
Ответ 4
Этот вопрос задавали до here.
РЕДАКТИРОВАТЬ: Если вам приходится иметь дело с причудливыми веб-приложениями, вы должны, вероятно, попробовать mechanize. Это отличная библиотека, которая имитирует веб-браузер. Вы можете управлять перенаправлением, куки, обновлять страницы... Если веб-сайт не сильно [полагается] на JavaScript, вы отлично ладите с механизацией.