Python의 urllib (2)가 리디렉션을 따르는 것을 어떻게 방지합니까?
문제
현재 Python을 사용하여 사이트에 로그인하려고하지만 사이트는 같은 페이지에서 쿠키와 리디렉션 문을 보내는 것으로 보입니다. Python은 그 리디렉션을 따르고있어 로그인 페이지에서 쿠키 보내기를 읽지 못하게합니다. Python의 urllib (또는 urllib2) Urlopen이 리디렉션을 따르는 것을 어떻게 방지합니까?
해결책
몇 가지 일을 할 수 있습니다.
- 각 리디렉션을 가로 채는 자신의 httpredirecthandler를 구축하십시오
- 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
원하는 방식으로 쿠키를하지 않습니다. 또한보십시오 파이썬을 사용하여 웹 페이지에 로그인하고 나중에 사용하기 위해 쿠키를 검색하는 방법은 무엇입니까?