Thực ra, có vẻ như urllib2 có thể thực hiện yêu cầu HEAD HTTP.
Số question mà @reto liên kết đến ở trên, cho biết cách nhận urllib2 thực hiện yêu cầu HEAD.
Dưới đây là quan điểm của tôi về nó:
import urllib2
# Derive from Request class and override get_method to allow a HEAD request.
class HeadRequest(urllib2.Request):
def get_method(self):
return "HEAD"
myurl = 'http://bit.ly/doFeT'
request = HeadRequest(myurl)
try:
response = urllib2.urlopen(request)
response_headers = response.info()
# This will just display all the dictionary key-value pairs. Replace this
# line with something useful.
response_headers.dict
except urllib2.HTTPError, e:
# Prints the HTTP Status code of the response but only if there was a
# problem.
print ("Error code: %s" % e.code)
Nếu bạn kiểm tra điều này với một cái gì đó giống như mạng Wireshark giao thức analazer, bạn có thể thấy rằng nó thực sự là gửi đi một yêu cầu HEAD, chứ không phải là một GET.
Đây là yêu cầu HTTP và phản hồi từ các mã trên, như bắt bởi Wireshark:
HEAD/doFeT HTTP/1.1
Accept-Encoding: sắc
Host: bit.ly
kết nối: gần
Tác nhân người dùng: Python-urllib/2.7
HTTP/1.1 301 Moved
Server: nginx
Ngày: Chủ nhật, 19 tháng 2 năm 2012 13:20:56 GMT
Content-Type: text/html; charset = utf-8
Kiểm soát bộ nhớ cache: riêng tư; max-age = 90
Location: http://www.kidsidebyside.org/?p=445
MIME-Version: 1.0
Content-Length: 127
kết nối: gần
Set-Cookie: _bit = 4f40f738-00153-02ed0-421cf10a; domain = .bit.ly; hết hạn = Thứ Sáu ngày 17 tháng 8 13:20:56 2012; đường dẫn = /; HttpOnly
Tuy nhiên, như được đề cập trong một trong các nhận xét trong câu hỏi khác, nếu URL được đề cập bao gồm chuyển hướng thì urllib2 sẽ thực hiện yêu cầu GET đến đích chứ không phải HEAD. Đây có thể là một thiếu sót lớn, nếu bạn thực sự muốn chỉ thực hiện các yêu cầu HEAD.
Yêu cầu ở trên bao gồm chuyển hướng. Đây là yêu cầu đến đích vì bị bắt bởi Wireshark:
GET/2009/05/đến-và-hòa-the-tròn-of-đoàn kết-với-us/HTTP/1.1
Accept-Encoding : bản sắc
host: www.kidsidebyside.org
kết nối: gần
User-Agent: Python-urllib/2,7
Một thay thế cho việc sử dụng urllib2 là sử dụng thư viện httplib2 Joe Gregorio:
import httplib2
url = "http://bit.ly/doFeT"
http_interface = httplib2.Http()
try:
response, content = http_interface.request(url, method="HEAD")
print ("Response status: %d - %s" % (response.status, response.reason))
# This will just display all the dictionary key-value pairs. Replace this
# line with something useful.
response.__dict__
except httplib2.ServerNotFoundError, e:
print (e.message)
Điều này có lợi thế là sử dụng các yêu cầu HEAD cho cả yêu cầu HTTP ban đầu và yêu cầu được chuyển hướng đến URL đích.
Dưới đây là yêu cầu đầu tiên:
HEAD/doFeT HTTP/1.1
Host: bit.ly
Accept-Encoding: gzip, deflate
user-agent: Python-httplib2/0.7.2 (gzip)
đây là yêu cầu thứ hai, đến đích:
HEAD/2009/05/đến-và-hòa-the -circle-of-đoàn kết-với-us/HTTP/1.1
Host: www.kidsidebyside.org
Accept-Encoding: gzip, deflate
user-agent: Python-httplib2/0.7.2 (gzip)
*** Python 3 Lưu ý *** Đầu tiên, không có gì giống như 'response.info(). Headers', làm một' dict (response.info()) '. Thứ hai, cho mã trạng thái HTTP làm 'response.status'. – treecoder
Điều này ** chỉ được ** tiêu đề hoặc ** chỉ in ** tiêu đề? –
Tài liệu 'tiêu đề' ở đâu? Cũng xem xét việc sử dụng 'response.info(). Items()' trả về giá trị khóa dict. –