Глядя на источник urllib2, кажется, что самый простой способ сделать это - создать подкласс HTTPRedirectHandler, а затем использовать build_opener для переопределения HTTPRedirectHandler по умолчанию, но это похоже на много (относительно сложную) работу, чтобы сделать то, что кажется, должно быть довольно просто.
101
Ответы:
Вот способ запросов :
import requests r = requests.get('http://github.com', allow_redirects=False) print(r.status_code, r.headers['Location'])
источник
r.headers['Location']
чтобы увидеть , где он послал бы вамLocation
доlocation
.requests
позволяет получить доступ к заголовкам как в канонической форме, так и в нижнем регистре. См. Docs.python-requests.org/en/master/user/quickstart/…В 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
исключение, если получит код состояния перенаправления. Чтобы вернуть щёток ответ вам нужно установить ,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)
источник
Я второй указатель olt на Dive into Python . Вот реализация с использованием обработчиков перенаправления 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())
источник
opener = urllib.request.build_opener(debugHandler, NoRedirect())
wheredebugHandler=urllib.request.HTTPHandler()
иdebugHandler.set_http_debuglevel (1)
. В итоге:urllib.request.install_opener(opener)