Tiêu đề kiểu nội dung python

Bài đăng này nhằm mục đích trình bày cho bạn cách tải xuống tài nguyên từ URL đã cho bằng cách sử dụng mô-đun yêu cầu. Tất nhiên, có những mô-đun khác cho phép bạn thực hiện mục đích này nhưng tôi chỉ tập trung giải thích cách thực hiện với mô-đun yêu cầu và để bạn khám phá các phương pháp khác. Hãy bắt đầu ngay bây giờ

Mục lục

Giới thiệu

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 = "https://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?

Không phải tất cả các URL trỏ đến tài nguyên có thể tải xuố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 = "https://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 = "https://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.

Xác định chức năng để xác minh tài nguyên có thể tải xuống

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 = "https://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 = "https://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 = "https://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 = "https://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