Есть ли простой способ запросить URL-адрес в python и не следовать перенаправлениям?
глядя на источник urllib2, кажется, что самый простой способ сделать это-подкласс HTTPRedirectHandler, а затем использовать build_opener для переопределения HTTPRedirectHandler по умолчанию, но это похоже на большую (относительно сложную) работу, чтобы сделать то, что кажется довольно простым.
7 ответов:
здесь запросы путь:
import requests r = requests.get('http://github.com', allow_redirects=False) print(r.status_code, r.headers['Location'])
Погружение В 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)
Я полагаю, это поможет
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)
The
redirections
сайта вhttplib2
метод запроса-это отвлекающий маневр. Вместо того, чтобы вернуть первый запрос, он подниметRedirectLimit
исключение, если он получает код статуса переадресации. Чтобы вернуть начальный ответ, вам нужно установитьfollow_redirects
доFalse
на
Я второй указатель Олта на погружение в 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)