Trong hướng dẫn này, bạn sẽ học cách tải xuống các tệp từ web bằng các mô-đun Python khác nhau. Bạn sẽ tải xuống các tệp thông thường, trang web, Amazon S3 và các nguồn khác
Ngoài ra, bạn sẽ học cách vượt qua nhiều thách thức mà bạn có thể gặp phải, chẳng hạn như tải xuống các tệp chuyển hướng, tải xuống các tệp lớn, tải xuống đa luồng và các chiến thuật khác
Mục lục
- Sử dụng yêu cầu
- Sử dụng wget
- Tải xuống tệp chuyển hướng
- Tải xuống tệp lớn theo khối
- Tải xuống nhiều tệp [Tải xuống song song/hàng loạt]
- Tải xuống với một thanh tiến trình
- Tải xuống một trang web bằng urllib
- Tải xuống qua proxy
- Sử dụng urllib3
- Tải xuống tệp từ S3 bằng boto3
- Sử dụng asyncio
Sử dụng yêu cầu
Bạn có thể tải xuống các tệp từ một URL bằng mô-đun yêu cầu
Hãy xem xét mã dưới đây
import requests url = '//www.python.org/static/img/python-logo@2x.png' myfile = requests.get[url] open['c:/users/LikeGeeks/downloads/PythonImage.png', 'wb'].write[myfile.content]
Đơn giản, lấy URL bằng cách sử dụng phương thức get của mô-đun yêu cầu và lưu kết quả vào một biến “myfile” biến. Sau đó, bạn viết nội dung của biến vào một tệp
Sử dụng wget
Bạn cũng có thể tải xuống tệp từ URL bằng cách sử dụng mô-đun wget của Python. Cài đặt mô-đun wget bằng pip như sau
pip install wget
Hãy xem xét đoạn mã sau mà chúng tôi sẽ tải xuống hình ảnh logo của Python
import wget url = "//www.python.org/static/img/python-logo@2x.png" wget.download[url, 'c:/users/LikeGeeks/downloads/pythonLogo.png']
Trong mã này, chúng tôi đã chuyển URL cùng với đường dẫn [nơi chúng tôi sẽ lưu trữ hình ảnh] đến phương thức tải xuống của mô-đun wget
Tải xuống tệp chuyển hướng
Trong phần này, bạn sẽ học cách tải xuống từ một URL chuyển hướng đến một URL khác bằng một. tập tin pdf sử dụng yêu cầu. URL giống như sau
//readthedocs.org/projects/python-guide/downloads/pdf/latest/
Để tải xuống tệp pdf này, hãy sử dụng đoạn mã sau
import requests url = '//readthedocs.org/projects/python-guide/downloads/pdf/latest/' myfile = requests.get[url, allow_redirects=True] open['c:/users/LikeGeeks/documents/hello.pdf', 'wb'].write[myfile.content]
Trong mã này, bước đầu tiên chúng tôi chỉ định URL. Sau đó, chúng tôi sử dụng phương thức get của mô-đun yêu cầu để tìm nạp URL. Trong phương thức get, chúng tôi đặt allow_redirects thành True, điều này sẽ cho phép chuyển hướng trong URL. Sau khi chuyển hướng, nội dung sẽ nằm trong biến myfile
Cuối cùng, chúng tôi mở một tệp để ghi nội dung đã tìm nạp
Tải xuống tệp lớn theo khối
Xem xét mã thổi
import requests url = '//www.cs.uky.edu/~keen/115/Haltermanpythonbook.pdf' r = requests.get[url, stream = True] with open["PythonBook.pdf", "wb"] as Pypdf: for chunk in r.iter_content[chunk_size = 1024]: if chunk: Pypdf.write[chunk]
Đầu tiên, chúng tôi sử dụng phương thức get của mô-đun yêu cầu như chúng tôi đã làm trước đây, nhưng lần này chúng tôi sẽ đặt thuộc tính luồng thành True
Sau đó, chúng tôi tạo một tệp có tên PythonBook. pdf trong thư mục làm việc hiện tại và mở nó để viết
Sau đó, chúng tôi chỉ định kích thước khối mà chúng tôi muốn tải xuống tại một thời điểm. Chúng tôi đã đặt thành 1024 byte. Lặp lại từng đoạn và ghi các đoạn đó vào tệp cho đến khi hoàn thành các đoạn đó
Shell Python sẽ giống như sau khi các khối đang tải xuống
Không đẹp?
Tải xuống nhiều tệp [Tải xuống song song/hàng loạt]
Để tải xuống nhiều tệp cùng một lúc, hãy nhập các mô-đun sau
import os import requests from time import time from multiprocessing.pool import ThreadPool
Chúng tôi đã nhập các mô-đun hệ điều hành và thời gian để kiểm tra xem mất bao nhiêu thời gian để tải xuống các tệp. Mô-đun ThreadPool cho phép bạn chạy nhiều luồng hoặc quy trình bằng nhóm
Hãy tạo một hàm đơn giản để gửi phản hồi tới một tệp theo khối
def url_response[url]: path, url = url r = requests.get[url, stream = True] with open[path, 'wb'] as f: for ch in r: f.write[ch]
Biến URLs là một mảng hai chiều chỉ định đường dẫn và URL của trang bạn muốn tải xuống
________số 8Chuyển URL tới các yêu cầu. được như chúng ta đã làm trong phần trước. Cuối cùng, mở tệp [đường dẫn được chỉ định trong URL] và viết nội dung của trang
Bây giờ chúng ta có thể gọi riêng hàm này cho từng URL và chúng ta cũng có thể gọi hàm này cho tất cả các URL cùng một lúc. Hãy làm điều đó cho từng URL riêng biệt trong vòng lặp for và để ý bộ đếm thời gian
start = time[] for x in urls: url_response [x] print[f"Time to download: {time[] - start}"]
Kết quả sẽ như thế này
Bây giờ thay thế vòng lặp for bằng dòng mã sau
pip install wget0
Chạy tập lệnh
Tải xuống với một thanh tiến trình
Thanh tiến trình là một tiện ích giao diện người dùng của mô-đun clint. Để cài đặt mô-đun clint, gõ lệnh sau
pip install wget1
Hãy xem xét đoạn mã sau
pip install wget2
Trong mã này, chúng tôi đã nhập mô-đun yêu cầu và sau đó từ clint. textui, chúng tôi đã nhập tiện ích tiến trình. Sự khác biệt duy nhất là trong vòng lặp for. Chúng tôi đã sử dụng phương thức thanh của mô-đun tiến trình trong khi ghi nội dung vào tệp. Đầu ra sẽ giống như sau
Tải xuống một trang web bằng urllib
Trong phần này, chúng tôi sẽ tải xuống một trang web bằng urllib
Thư viện urllib là thư viện chuẩn của Python nên bạn không cần cài đặt
Dòng mã sau đây có thể dễ dàng tải xuống một trang web
pip install wget3
Chỉ định URL ở đây mà bạn muốn lưu dưới dạng và nơi bạn muốn lưu trữ nó
pip install wget4
Trong mã này, chúng tôi đã sử dụng phương thức urlretrieve và chuyển URL của tệp cùng với đường dẫn nơi chúng tôi sẽ lưu tệp. Phần mở rộng tập tin sẽ là. html
Tải xuống qua proxy
Nếu bạn cần sử dụng proxy để tải xuống các tệp của mình, bạn có thể sử dụng ProxyHandler của mô-đun urllib. Kiểm tra đoạn mã sau
pip install wget5
Trong mã này, chúng tôi đã tạo đối tượng proxy và mở proxy bằng cách gọi phương thức build_opener của urllib và chuyển đối tượng proxy. Sau đó, chúng tôi đã thực hiện yêu cầu truy xuất trang
Ngoài ra, bạn có thể sử dụng mô-đun yêu cầu như được ghi trong tài liệu chính thức
pip install wget6
Chỉ cần nhập mô-đun yêu cầu và tạo đối tượng proxy của bạn. Sau đó, bạn có thể truy xuất tệp
Sử dụng urllib3
urllib3 là phiên bản cải tiến của mô-đun urllib. Bạn có thể tải xuống và cài đặt nó bằng pip
pip install wget7
Chúng tôi sẽ tìm nạp một trang web và lưu trữ nó trong một tệp văn bản bằng cách sử dụng urllib3
Nhập các mô-đun sau
pip install wget8
Bạn có thể sử dụng mô-đun Shutil khi làm việc với tệp. Bây giờ hãy khởi tạo biến chuỗi URL như thế này
pip install wget9
Sau đó, chúng tôi sử dụng PoolManager của urllib3 để theo dõi các nhóm kết nối cần thiết
import wget url = "//www.python.org/static/img/python-logo@2x.png" wget.download[url, 'c:/users/LikeGeeks/downloads/pythonLogo.png']0
Tạo một tập tin
import wget url = "//www.python.org/static/img/python-logo@2x.png" wget.download[url, 'c:/users/LikeGeeks/downloads/pythonLogo.png']1
Cuối cùng, chúng tôi gửi yêu cầu GET để tìm nạp URL và mở tệp và viết phản hồi vào tệp đó
import wget url = "//www.python.org/static/img/python-logo@2x.png" wget.download[url, 'c:/users/LikeGeeks/downloads/pythonLogo.png']2
Tải xuống tệp từ S3 bằng boto3
Để tải xuống tệp từ Amazon S3, bạn có thể sử dụng mô-đun boto3 của Python
Trước tiên, bạn cần cài đặt mô-đun awscli bằng pip
import wget url = "//www.python.org/static/img/python-logo@2x.png" wget.download[url, 'c:/users/LikeGeeks/downloads/pythonLogo.png']3
Đối với cấu hình AWS, hãy chạy lệnh sau
import wget url = "//www.python.org/static/img/python-logo@2x.png" wget.download[url, 'c:/users/LikeGeeks/downloads/pythonLogo.png']4
Bây giờ hãy nhập thông tin chi tiết của bạn dưới dạng
import wget url = "//www.python.org/static/img/python-logo@2x.png" wget.download[url, 'c:/users/LikeGeeks/downloads/pythonLogo.png']5
Để tải xuống một tệp từ Amazon S3, hãy nhập boto3 và botocore. Boto3 là SDK Amazon dành cho Python để truy cập các dịch vụ web của Amazon như S3. Botocore cung cấp các dịch vụ dòng lệnh để tương tác với các dịch vụ web của Amazon
Botocore đi kèm với awscli. Để cài đặt boto3, hãy chạy như sau
import wget url = "//www.python.org/static/img/python-logo@2x.png" wget.download[url, 'c:/users/LikeGeeks/downloads/pythonLogo.png']6
Bây giờ nhập hai mô-đun này
import wget url = "//www.python.org/static/img/python-logo@2x.png" wget.download[url, 'c:/users/LikeGeeks/downloads/pythonLogo.png']7
Khi tải xuống tệp từ Amazon, chúng tôi cần ba tham số
- Tên Xô
- Tên của tệp bạn cần tải xuống
- Tên của tệp sau khi đã tải xuống
Khởi tạo các biến
import wget url = "//www.python.org/static/img/python-logo@2x.png" wget.download[url, 'c:/users/LikeGeeks/downloads/pythonLogo.png']8
Bây giờ hãy khởi tạo một biến để sử dụng tài nguyên của phiên. Đối với điều này, chúng tôi sẽ gọi phương thức resource[] của boto3 và chuyển dịch vụ là s3
import wget url = "//www.python.org/static/img/python-logo@2x.png" wget.download[url, 'c:/users/LikeGeeks/downloads/pythonLogo.png']9
Cuối cùng, tải xuống tệp bằng cách sử dụng phương thức download_file và chuyển các biến
//readthedocs.org/projects/python-guide/downloads/pdf/latest/0
Sử dụng asyncio
Bạn có thể sử dụng mô-đun asyncio để xử lý các sự kiện hệ thống. Nó hoạt động xung quanh một vòng lặp sự kiện chờ đợi một sự kiện xảy ra và sau đó phản ứng với sự kiện đó. Phản ứng có thể gọi một chức năng khác. Quá trình này được gọi là xử lý sự kiện. Mô-đun asyncio sử dụng coroutines để xử lý sự kiện
Để sử dụng chức năng coroutine và xử lý sự kiện asyncio, chúng tôi sẽ nhập mô-đun asyncio
//readthedocs.org/projects/python-guide/downloads/pdf/latest/1
Ngoài ra, chúng ta cần cài đặt mô-đun aiohttp
//readthedocs.org/projects/python-guide/downloads/pdf/latest/2
Chúng tôi sẽ nhập mô-đun async_timeout để xử lý thời gian chờ
//readthedocs.org/projects/python-guide/downloads/pdf/latest/3
Từ khóa async cho biết đây là asyncio coroutine gốc. Bên trong phần thân của coroutine, chúng ta có từ khóa đang chờ, trả về một giá trị nhất định. Chúng tôi cũng đã sử dụng từ khóa trả về
Bây giờ, hãy tạo mã bằng coroutine để tải xuống các tệp từ web
//readthedocs.org/projects/python-guide/downloads/pdf/latest/4
Trong mã này, chúng tôi đã tạo một chức năng quy trình đăng ký không đồng bộ để tải xuống các tệp của chúng tôi theo khối và lưu chúng với một tên tệp ngẫu nhiên và trả về một thông báo
Sau đó, chúng tôi có một quy trình không đồng bộ khác gọi get_url và đợi các URL và tạo một hàng đợi của tất cả các URL
Bây giờ để khởi động coroutine, chúng ta phải đặt coroutine bên trong vòng lặp sự kiện bằng cách sử dụng phương thức get_event_loop[] của asyncio và cuối cùng, vòng lặp sự kiện được thực thi bằng phương thức run_until_complete[] của asyncio
Tải xuống tệp bằng Python rất thú vị. Tôi hy vọng bạn tìm thấy hướng dẫn hữu ích
Cảm ơn bạn
- Chia sẻ trên facebook
- Tweet trên Twitter
Mokhtar Ebrahim
Mokhtar là người sáng lập LikeGeek. com. Anh ấy làm quản trị viên hệ thống Linux từ năm 2010. Ông chịu trách nhiệm duy trì, bảo mật và khắc phục sự cố máy chủ Linux cho nhiều khách hàng trên khắp thế giới. Anh ấy thích viết các tập lệnh shell và Python để tự động hóa công việc của mình