Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Tải xuống tệp từ web bằng Python


Python cung cấp nhiều module khác nhau như urllib, requests để tải xuống tệp từ web. Trong bài viết này, tôi sẽ sử dụng thư viện requests của Python để tải xuống tệp từ các URL một cách hiệu quả.

Quy trình từng bước tải xuống tệp bằng thư viện requests

1. Nhập module

import requests

2. Lấy đường link hoặc URL

url = 'https://www.facebook.com/favicon.ico'
r = requests.get(url, allow_redirects=True)

3. Lưu nội dung với tên tệp

open('facebook.ico', 'wb').write(r.content)

Tệp sẽ được lưu dưới tên facebook.ico.

Ví dụ hoàn chỉnh

import requests
url = 'https://www.facebook.com/favicon.ico'
r = requests.get(url, allow_redirects=True)
open('facebook.ico', 'wb').write(r.content)

Kết quả

Tải xuống tệp từ web bằng Python

Chúng ta có thể thấy tệp đã được tải xuống (biểu tượng) trong thư mục làm việc hiện tại.

Tuy nhiên, chúng ta có thể cần tải xuống nhiều loại tệp khác nhau như hình ảnh, văn bản, video từ web. Vì vậy, hãy trước tiên xác định loại dữ liệu mà URL trỏ đến:

>>> r = requests.get(url, allow_redirects=True)
>>> print(r.headers.get('content-type'))
image/png

Có một cách thông minh hơn, chỉ cần tải xuống header của URL trước khi thực sự tải xuống tệp. Điều này cho phép chúng ta bỏ qua việc tải xuống các tệp không dành để tải xuống.

>>> print(is_downloadable('https://www.youtube.com/watch?v=xCglV_dqFGI'))
False
>>> print(is_downloadable('https://www.facebook.com/favicon.ico'))
True

Để giới hạn tải xuống theo kích thước tệp, chúng ta có thể lấy kích thước tệp từ header content-length và xử lý theo yêu cầu:

contentLength = header.get('content-length', None)
if contentLength and contentLength > 2e8:  # 200 MB xấp xỉ
    return False

Lấy tên tệp từ URL

Để lấy tên tệp, chúng ta có thể phân tích cú pháp URL. Dưới đây là một hàm mẫu lấy chuỗi cuối cùng sau dấu gạch chéo (/):

url = "https://www.computersolution.tech/wp-content/uploads/2016/05/tutorialspoint-logo.png"
if url.find('/'):
    print(url.rsplit('/', 1)[1])

Đoạn mã trên sẽ cho ra tên tệp từ URL. Tuy nhiên, có nhiều trường hợp thông tin tên tệp không có trong URL, ví dụ: https://url.com/download. Trong trường hợp này, chúng ta cần lấy header Content-Disposition, chứa thông tin tên tệp.

import requests
import re

def getFilename_fromCd(cd):
    """Lấy tên tệp từ content-disposition"""
    if not cd:
        return None
    fname = re.findall('filename=(.+)', cd)
    if len(fname) == 0:
        return None
    return fname[0]

url = 'https://google.com/favicon.ico'
r = requests.get(url, allow_redirects=True)
filename = getFilename_fromCd(r.headers.get('content-disposition'))
open(filename, 'wb').write(r.content)

Đoạn mã phân tích URL kết hợp với chương trình trên sẽ cho bạn tên tệp từ header Content-Disposition trong hầu hết các trường hợp.