Python의 urllib (2)가 리디렉션을 따르는 것을 어떻게 방지합니까?

StackOverflow https://stackoverflow.com/questions/554446

  •  23-08-2019
  •  | 
  •  

문제

현재 Python을 사용하여 사이트에 로그인하려고하지만 사이트는 같은 페이지에서 쿠키와 리디렉션 문을 보내는 것으로 보입니다. Python은 그 리디렉션을 따르고있어 로그인 페이지에서 쿠키 보내기를 읽지 못하게합니다. Python의 urllib (또는 urllib2) Urlopen이 리디렉션을 따르는 것을 어떻게 방지합니까?

도움이 되었습니까?

해결책

몇 가지 일을 할 수 있습니다.

  1. 각 리디렉션을 가로 채는 자신의 httpredirecthandler를 구축하십시오
  2. httpcookieprocessor 인스턴스를 만들고 쿠키 자르에 액세스 할 수 있도록 해당 오프너를 설치하십시오.

이것은 둘 다 보여주는 빠른 작은 것입니다

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

다른 팁

리디렉션을 중지하기 만하면 간단한 방법이 있습니다. 예를 들어 쿠키 만 받고 싶고 더 나은 성능을 위해 다른 페이지로 리디렉션되고 싶지 않습니다. 또한 코드가 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']

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 원하는 방식으로 쿠키를하지 않습니다. 또한보십시오 파이썬을 사용하여 웹 페이지에 로그인하고 나중에 사용하기 위해 쿠키를 검색하는 방법은 무엇입니까?

이 질문은 전에 묻습니다 여기.

편집하다: 기발한 웹 애플리케이션을 처리해야한다면 아마도 시험해 볼 것입니다. 기계화. 웹 브라우저를 시뮬레이션하는 훌륭한 라이브러리입니다. 리디렉션, 쿠키, 페이지 새로 고침을 제어 할 수 있습니다 ... 웹 사이트가 JavaScript에 [크게] 의존하지 않으면 기계화로 매우 잘 어울립니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top