Tôi đã xem tài liệu yêu cầu, nhưng dường như tôi không thể tìm thấy bất kỳ thứ gì. Làm thế nào để tôi chỉ yêu cầu tiêu đề, vì vậy tôi có thể đánh giá các tập tin?Nhận kích thước tệp bằng cách sử dụng yêu cầu python, trong khi chỉ nhận được tiêu đề
29
A
Trả lời
54
Gửi một HEAD request:
>>> import requests
>>> response = requests.head('http://example.com')
>>> response.headers
{'connection': 'close',
'content-encoding': 'gzip',
'content-length': '606',
'content-type': 'text/html; charset=UTF-8',
'date': 'Fri, 11 Jan 2013 02:32:34 GMT',
'last-modified': 'Fri, 04 Jan 2013 01:17:22 GMT',
'server': 'Apache/2.2.3 (CentOS)',
'vary': 'Accept-Encoding'}
Một Yêu cầu HEAD
giống như một yêu cầu GET mà chỉ tải các tiêu đề. Lưu ý rằng nó tùy thuộc vào máy chủ để thực sự tôn trọng yêu cầu HEAD của bạn. Một số máy chủ sẽ chỉ phản hồi các yêu cầu GET, vì vậy bạn sẽ phải gửi yêu cầu GET và chỉ đóng kết nối thay vì tải xuống phần thân. Lần khác, máy chủ không bao giờ chỉ định tổng kích thước của tệp.
11
sử dụng requests.get(url, stream=True).headers['Content-length']
stream=True
có nghĩa là khi trở về chức năng, chỉ tiêu đề phản ứng sẽ được tải về, cơ thể phản ứng không phải là.
Cả requests.get
và request.head
có thể giúp bạn tiêu đề nhưng có một lợi thế của việc sử dụng get
get
là linh hoạt hơn, nếu bạn muốn tải về cơ thể phản ứng sau khi kiểm tra độ dài, bạn có thể bắt đầu bằng cách đơn giản là truy cậpcontent
thuộc tính hoặc sử dụng sốiterator
sẽ tải xuống nội dung theo các khối- "yêu cầu HEAD NÊN trùng với thông tin được gửi để phản hồi yêu cầu GET". nhưng không phải lúc nào cũng vậy.
đây là một ví dụ về việc chiều dài của một MIT open course video
MitOpenCourseUrl = "http://www.archive.org/download/MIT6.006F11/MIT6_006F11_lec01_300k.mp4"
resHead = requests.head(MitOpenCourseUrl)
resGet = requests.get(MitOpenCourseUrl,stream=True)
resHead.headers['Content-length'] # output 169
resGet.headers['Content-length'] # output 121291539
Lưu ý rằng không phải mọi phản ứng nhất thiết sẽ bao gồm một 'nội dung length' - đôi khi phản ứng được tạo ra sử dụng 'Transfer-Encoding: chunked', trong trường hợp đó không có cách nào để biết phản ứng sẽ kéo dài bao lâu, trừ khi bạn thực sự nhận được toàn bộ phản hồi. –
điều này là khác nhau sau đó kích thước lấy bằng cách sử dụng 'urllib.urlopen (url) .info() ['content-length']', vì vậy không chính xác những gì tôi muốn. –