Mục lục
Dưới đây là đoạn đơn giản để tải logo của Google trong trang tìm kiếm Google qua đường dẫn https. //www. Google. đồng. Anh/hình ảnh/xây dựng thương hiệu/googlelogo/1x/googlelogo_color_272x92dp. png
import requests url = "//www.google.co.uk/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png" r = requests.get[url, allow_redirects=True] open["google.ico", "wb"].write[r.content]
Tệp có tên google.ico
được lưu vào thư mục làm việc hiện tại. Thật dễ dàng như một miếng bánh, phải không?
Thế giới thực là bạn gần như chắc chắn xử lý các trường hợp tài nguyên tải xuống được bảo vệ không cho phép người dùng tải xuống. Ví dụ: các video Youtube đã được bảo mật để ngăn người dùng tham lam tải xuống. Mọi người phát triển tiện ích mở rộng trình duyệt hoặc ứng dụng độc lập để tải xuống video Youtube, tuy nhiên, Google đã phát hiện ra các hoạt động bạo lực đó và ngày càng bảo vệ dữ liệu của họ. Do đó, điều quan trọng là phải kiểm tra xem tài nguyên quan tâm có được phép tải xuống hay không trước khi gửi yêu cầu. Đoạn mã bên dưới mô phỏng cách kiểm tra dựa trên tham số Content-Type
của tiêu đề của URL yêu cầu
import requests def extract_content_type[_url]: r = requests.get[_url, allow_redirects=True] return r.headers.get["Content-Type"] url = "//www.google.co.uk/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png" # open["google.ico", "wb"].write[r.content] print[extract_content_type[url]] url = "//www.youtube.com/watch?v=ylk5AYyOcGI" print[extract_content_type[url]]
Đầu ra của đoạn script trên trông giống như
image/png text/html; charset=utf-8
Hàm extract_content_type
trả về một chuỗi dưới dạng loại mime của tệp từ xa. Trong ví dụ trên, những gì chúng tôi đang mong đợi từ URL Youtube là một loại video chứ không phải là text/html
trong khi URL đầu tiên trả về một giá trị mong đợi. Nói cách khác, loại nội dung của yêu cầu là văn bản/html mà chúng tôi chỉ tải xuống văn bản thuần túy hoặc tài liệu HTML thay vì các loại mime nổi tiếng như hình ảnh/png, video/mp4, v.v.
Như đã giải thích trong phần trước, việc kiểm tra tài nguyên được phép tải xuống là cần thiết trước khi gửi yêu cầu
Kiểm tra Content-Type của tiêu đề yêu cầu
Hàm bên dưới có thể làm những gì chúng ta cần bằng cách kiểm tra loại nội dung từ tiêu đề
def is_downloadable[_url]: """ Does the url contain a downloadable resource """ h = requests.head[_url, allow_redirects=True] header = h.headers content_type = header.get['content-type'] if 'text' in content_type.lower[]: return False if 'html' in content_type.lower[]: return False return True
Áp dụng chức năng này cho hai URL trong các ví dụ trước, nó trả về Sai cho URL Youtube trong khi True được trả về với liên kết biểu tượng của Google
Hạn chế kích thước tệp của tài nguyên tải xuống
Chúng tôi có thể có một hạn chế khác đối với tài nguyên tải xuống, chẳng hạn như chỉ tải xuống tệp có kích thước không lớn hơn 100 MB. Bằng cách kiểm tra tiêu đề của URL yêu cầu trên thuộc tính
import requests def extract_content_type[_url]: r = requests.get[_url, allow_redirects=True] return r.headers.get["Content-Type"] url = "//www.google.co.uk/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png" # open["google.ico", "wb"].write[r.content] print[extract_content_type[url]] url = "//www.youtube.com/watch?v=ylk5AYyOcGI" print[extract_content_type[url]]0, mã bên dưới có thể hoạt động như mong đợi
content_length = header.get['content-length', None] if content_length and content_length > 1e8: # 100 MB approx return False
Lấy tên tệp từ URL
Một lần nữa, để lấy tên tệp của tài nguyên tải xuống, chúng ta có thể sử dụng thuộc tính Bố trí nội dung của tiêu đề yêu cầu
def get_filename_from_url[_url]: """ Get filename from content-disposition """ r = requests.get[_url, allow_redirects=True] cd = r.headers.get['content-disposition'] if not cd: return None filename = re.findall['filename=[.+]', cd] if len[filename] == 0: return None return filename[0]
Mã phân tích cú pháp URL kết hợp với phương pháp trên để lấy tên tệp từ tiêu đề
import requests def extract_content_type[_url]: r = requests.get[_url, allow_redirects=True] return r.headers.get["Content-Type"] url = "//www.google.co.uk/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png" # open["google.ico", "wb"].write[r.content] print[extract_content_type[url]] url = "//www.youtube.com/watch?v=ylk5AYyOcGI" print[extract_content_type[url]]1 sẽ hoạt động trong hầu hết các trường hợp
thì đấy. Nếu bạn có bất kỳ đánh giá nào, xin vui lòng để lại ý kiến của bạn trong hộp bình luận bên dưới