2012-04-01 24 views
7

tôi có thể sử dụng urllib2 để đưa ra yêu cầu TRỤ như vậy: HEAD HTTP Python - xử lý các chuyển hướng đúng cách?

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

Vấn đề là dường như khi điều này sau chuyển hướng, nó sử dụng GET thay vì HEAD.

Mục đích của yêu cầu HEAD này là kiểm tra kích thước và loại nội dung của URL mà tôi sắp tải xuống để tôi có thể đảm bảo rằng tôi không tải xuống một số tài liệu lớn. (URL được cung cấp bởi một người dùng internet ngẫu nhiên thông qua IRC).

Tôi làm cách nào để sử dụng yêu cầu HEAD khi chuyển hướng sau?

+3

[Yêu cầu] (http://docs.python-requests.org/en/latest/index.html) ít nhất tuyên bố làm điều này đúng cách (ít nhất, nó ghi lại hành vi chuyển hướng của nó như làm việc cho các phương thức idempotent, và gọi HEAD đặc biệt trong các tài liệu). –

+0

một giải pháp tương tự: http://stackoverflow.com/questions/9890815/python-get-headers-only-using-urllib2/9892207#9892207 – newtover

Trả lời

3

Câu hỏi hay! Nếu bạn được đặt sử dụng urllib2, bạn sẽ muốn xem this answer về việc xây dựng trình xử lý chuyển hướng của riêng bạn.

Trong ngắn (đọc: ngang nhiên bị đánh cắp từ các câu trả lời trước):

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 

Ngoài ra, như đã đề cập trong errata, bạn có thể sử dụng Python Requests.

+1

Tôi đã sử dụng trình xử lý chuyển hướng này, dựa trên những gì bạn đã tìm thấy: http://pastebin.com/m7aN21A7 Cảm ơn! – Krenair

+0

@Krenair Rất vui được trợ giúp! – MrGomez

9

Bạn có thể làm điều này với các thư viện requests:

>>> import requests 
>>> r = requests.head('http://github.com', allow_redirects=True) 
>>> r 
<Response [200]> 
>>> r.history 
[<Response [301]>] 
>>> r.url 
u'https://github.com/'