urllib2의 소스를 살펴보면 가장 쉬운 방법은 HTTPRedirectHandler를 하위 클래스로 분류 한 다음 build_opener를 사용하여 기본 HTTPRedirectHandler를 재정의하는 것입니다. 그러나 이것은해야 할 것처럼 보이는 작업을 수행하기 위해 많은 (상대적으로 복잡한) 작업처럼 보입니다. 아주 간단합니다.
답변
요청 방법 은 다음과 같습니다 .
import requests
r = requests.get('http://github.com', allow_redirects=False)
print(r.status_code, r.headers['Location'])
답변
Dive Into Python 에는 urllib2를 사용한 리디렉션 처리에 대한 좋은 장이 있습니다. 또 다른 해결책은 httplib 입니다.
>>> import httplib
>>> conn = httplib.HTTPConnection("www.bogosoft.com")
>>> conn.request("GET", "")
>>> r1 = conn.getresponse()
>>> print r1.status, r1.reason
301 Moved Permanently
>>> print r1.getheader('Location')
http://www.bogosoft.com/new/location
답변
리디렉션을 따르지 않는 urllib2 핸들러입니다.
class NoRedirectHandler(urllib2.HTTPRedirectHandler):
def http_error_302(self, req, fp, code, msg, headers):
infourl = urllib.addinfourl(fp, headers, req.get_full_url())
infourl.status = code
infourl.code = code
return infourl
http_error_300 = http_error_302
http_error_301 = http_error_302
http_error_303 = http_error_302
http_error_307 = http_error_302
opener = urllib2.build_opener(NoRedirectHandler())
urllib2.install_opener(opener)
답변
요청 방법 의 redirections
키워드 httplib2
는 붉은 청어입니다. 첫 번째 요청을 반환하는 대신 RedirectLimit
리디렉션 상태 코드를 수신하면 예외 가 발생합니다. 당신이 설정해야 inital 응답 돌아가려면 follow_redirects
에 False
온 Http
객체를 :
import httplib2
h = httplib2.Http()
h.follow_redirects = False
(response, body) = h.request("http://example.com")
답변
나는 이것이 도움이 될 것이라고 생각한다
from httplib2 import Http
def get_html(uri,num_redirections=0): # put it as 0 for not to follow redirects
conn = Http()
return conn.request(uri,redirections=num_redirections)
답변
두 번째로 Dive into Python에 대한 olt의 포인터 입니다. 다음은 urllib2 리디렉션 처리기를 사용하는 구현입니다. 더 많은 작업이 필요합니까? 아마도 어깨를 으쓱해라.
import sys
import urllib2
class RedirectHandler(urllib2.HTTPRedirectHandler):
def http_error_301(self, req, fp, code, msg, headers):
result = urllib2.HTTPRedirectHandler.http_error_301(
self, req, fp, code, msg, headers)
result.status = code
raise Exception("Permanent Redirect: %s" % 301)
def http_error_302(self, req, fp, code, msg, headers):
result = urllib2.HTTPRedirectHandler.http_error_302(
self, req, fp, code, msg, headers)
result.status = code
raise Exception("Temporary Redirect: %s" % 302)
def main(script_name, url):
opener = urllib2.build_opener(RedirectHandler)
urllib2.install_opener(opener)
print urllib2.urlopen(url).read()
if __name__ == "__main__":
main(*sys.argv)
답변
그러나 가장 짧은 방법은
class NoRedirect(urllib2.HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, hdrs, newurl):
pass
noredir_opener = urllib2.build_opener(NoRedirect())