Python HTTP HEAD - правильно работать с перенаправлениями? - PullRequest
8 голосов
/ 01 апреля 2012

Я могу использовать urllib2 для выполнения запросов HEAD следующим образом:

import urllib2
request = urllib2.Request('http://example.com')
request.get_method = lambda: 'HEAD'
urllib2.urlopen(request)

Проблема заключается в том, что, когда это следует за перенаправлениями, он использует GET вместо HEAD.

Цельэтого запроса HEAD - проверить размер и тип содержимого URL-адреса, который я собираюсь загрузить, чтобы убедиться, что я не загружаю какой-то огромный документ.(URL предоставляется случайным пользователем Интернета через IRC).

Как я могу заставить его использовать запросы HEAD при следующих перенаправлениях?

Ответы [ 2 ]

13 голосов
/ 01 апреля 2012

Вы можете сделать это с помощью запросов библиотеки:

>>> import requests
>>> r = requests.head('http://github.com', allow_redirects=True)
>>> r
<Response [200]>
>>> r.history
[<Response [301]>]
>>> r.url
u'https://github.com/'
3 голосов
/ 01 апреля 2012

Хороший вопрос! Если вы используете urllib2, вам нужно посмотреть этот ответ о создании собственного обработчика перенаправления.

Короче (читай: явно украдено из предыдущего ответа):

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

Также, как указано в сообщении, вы можете использовать Python Requests .

...