Есть ли простой способ запросить URL в Python и НЕ следовать перенаправлениям? - PullRequest
72 голосов
/ 21 сентября 2008

Глядя на источник urllib2, кажется, что самый простой способ сделать это - создать подкласс HTTPRedirectHandler, а затем использовать build_opener, чтобы переопределить HTTPRedirectHandler по умолчанию, но это выглядит как большая (относительно сложная) работа, выполняющая то, что выглядит как это должно быть довольно просто.

Ответы [ 7 ]

133 голосов
/ 04 февраля 2013

Вот способ Запросы :

import requests
r = requests.get('http://github.com', allow_redirects=False)
print(r.status_code, r.headers['Location'])
34 голосов
/ 21 сентября 2008

Dive Into Python * В 1002 * есть хорошая глава по обработке перенаправлений с помощью 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
11 голосов
/ 18 марта 2011

Это обработчик 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)
8 голосов
/ 21 сентября 2008

Полагаю, это поможет

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)
7 голосов
/ 14 мая 2012

Ключевое слово redirections в методе запроса httplib2 представляет собой красную сельдь. Вместо того чтобы возвращать первый запрос, он вызовет исключение RedirectLimit, если получит код состояния перенаправления. Чтобы вернуть исходный ответ, необходимо установить follow_redirects в False для объекта Http:

import httplib2
h = httplib2.Http()
h.follow_redirects = False
(response, body) = h.request("http://example.com")
5 голосов
/ 29 февраля 2012

Самый короткий путь, однако,

class NoRedirect(urllib2.HTTPRedirectHandler):
    def redirect_request(self, req, fp, code, msg, hdrs, newurl):
        pass

noredir_opener = urllib2.build_opener(NoRedirect())
5 голосов
/ 21 сентября 2008

Я второй указатель Олта на Погружение в 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) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...