Hướng dẫn python requests wait for download - Yêu cầu python chờ tải xuống

Nếu bạn sử dụng tùy chọn urllib.request.urlretrieve reporthook, bạn có thể theo dõi tiến trình tải xuống, đặc biệt hữu ích với các tệp lớn, như vậy:

import urllib.request

def Download_Progress(block_num, block_size, total_size):
    downloaded = block_num * block_size
    progress = int((downloaded/total_size)*100)
    print ("Download Progress",str(progress),"%")

url = "https://somesite/some.pdf"
urllib.request.urlretrieve(url, 'mycopy.pdf', reporthook=Download_Progress)
print ("Finished")

Bạn cũng có thể đạt được một cái gì đó tương tự với gói

import requests
url = "https://somesite/some.pdf"

#Get the headers of the remote file
h = requests.head(url, allow_redirects=True)

#Get the size of the file
total_size = int(h.headers.get('content-length'))

#Request the file download with stream set to True
r = requests.get(url, stream=True)

#Open a local file for writing
localfile = open("mycopy.pdf", "wb")
chunks = 0

#Process the file as it arrives
for chunk in r.iter_content(chunk_size=512):
    if chunk:
        chunks += 1
        downloaded = chunks * 512
        # An approximation as the chunks don't have to be 512 bytes
        progress = int((downloaded/total_size)*100)
        print ("Download Progress",str(progress),"%")
        localfile.write(chunk)
print("Finished")
0.

import requests
url = "https://somesite/some.pdf"

#Get the headers of the remote file
h = requests.head(url, allow_redirects=True)

#Get the size of the file
total_size = int(h.headers.get('content-length'))

#Request the file download with stream set to True
r = requests.get(url, stream=True)

#Open a local file for writing
localfile = open("mycopy.pdf", "wb")
chunks = 0

#Process the file as it arrives
for chunk in r.iter_content(chunk_size=512):
    if chunk:
        chunks += 1
        downloaded = chunks * 512
        # An approximation as the chunks don't have to be 512 bytes
        progress = int((downloaded/total_size)*100)
        print ("Download Progress",str(progress),"%")
        localfile.write(chunk)
print("Finished")

Hình ảnh Émile perron bị hỏng

Hướng dẫn dứt khoát

Hiểu cách sử dụng Python để tải xuống các tệp trong các dự án cào web của bạn

Python rất phù hợp để thực hiện việc quét Internet với nhưng một trong những tác vụ đầu tiên sau khi lấy một số tiêu đề hoặc liên kết từ một trang web tôi muốn làm là tải xuống các tệp. Tôi cần phải có một cách để tự động hóa quá trình này!ython is a good fit to do web scraping the internet with but one of the first tasks after grabbing some titles or links from a website I wanted to do was to download files. I needed to have a way to automate this process!

Ở đây chúng tôi sẽ phác thảo làm thế nào để làm điều này.

Đến cuối bài viết, bạn sẽ

  1. Hãy nhận biết sự lựa chọn của các gói xử lý HTTP trong Python

2. Hiểu chi tiết gói yêu cầu

2. Biết cách tải xuống các tệp bằng gói yêu cầu

3. Cách xử lý các tệp lớn với gói yêu cầu.

4. Cách tải xuống các tệp chuyển hướng bằng gói yêu cầu.

Có rất nhiều gói để đối phó với Internet trong Python. Không cần thiết cho bạn biết tất cả, nhưng để cung cấp cho bạn một hương vị tại sao người ta có thể chọn cái này hơn cái kia.

Dưới đây là các gói khác nhau xử lý các yêu cầu HTTP.

  • Gói tích hợp: Urllib và Urllib2, Urllib3
  • Yêu cầu (dựa trên gói Urllib3)
  • Grequests (mở rộng các yêu cầu để đối phó với các yêu cầu HTTP không đồng bộ)
  • Aiohttp (một gói khác liên quan đến HTTP không đồng bộ)

Bạn có thể hỏi sự khác biệt giữa các yêu cầu đồng bộ và không đồng bộ là gì? Tại sao nó quan trọng?

Yêu cầu đồng bộ chặn máy khách (trình duyệt) cho đến khi hoạt động hoàn tất. Điều này có nghĩa là có những lúc CPU không làm gì và có thể lãng phí thời gian tính toán. Có vẻ hiệu quả với tôi!

Các yêu cầu không đồng bộ don don chặn trình duyệt, điều này cho phép khách hàng thực hiện các tác vụ khác cùng một lúc. Điều này cho phép mở rộng 1000 yêu cầu một cách dễ dàng.

Các gói URL-LIB và URL-LIB2 có rất nhiều nồi hơi và đôi khi có thể hơi không thể đọc được. Tôi sử dụng gói yêu cầu vì nó có thể đọc được và sẽ có thể quản lý hầu hết các yêu cầu HTTP mà bạn cần phải thực hiện.

Các gói không đồng bộ rất hữu ích khi bạn có một số lượng lớn các yêu cầu HTTP để thực hiện. Đây là một chủ đề phức tạp nhưng có thể tạo ra sự khác biệt về hiệu quả của các tập lệnh Python của bạn. Tôi sẽ trở lại điểm này trong các bài viết sau!

Giới thiệu về gói yêu cầu

Để sử dụng gói yêu cầu, chúng tôi phải nhập mô -đun yêu cầu. Sau đó, chúng tôi có thể sử dụng mảng các phương thức để tương tác với Internet. Cách phổ biến nhất để sử dụng gói yêu cầu là sử dụng là phương thức yêu cầu. Dưới mui xe, điều này thực hiện HTTP nhận được yêu cầu đến URL được lựa chọn.

Đầu tiên, chúng tôi tạo một đối tượng yêu cầu được gửi đến máy chủ và sau đó máy chủ gửi lại phản hồi. Đối tượng này mang tất cả dữ liệu về yêu cầu.

import requestsurl = 'PLEASE INSERT URL LINK'
html = requests.get(url)

Để truy cập đối tượng, chúng ta có thể gọi phương thức văn bản. Điều này sẽ cho phép chúng tôi thấy phản hồi dưới dạng một chuỗi. Yêu cầu giả định mã hóa tùy thuộc vào dữ liệu quay trở lại từ máy chủ.

Có hai phần cho thông tin này chúng tôi nhận được trở lại, một tiêu đề và một cơ thể. Tiêu đề cho chúng tôi thông tin về phản hồi. Hãy nghĩ về tiêu đề như tất cả các thông tin bạn cần để gửi tin nhắn đến máy tính của bạn.

Xem bên dưới một ví dụ từ các tiêu đề trung bình! Có rất nhiều thông tin cho chúng tôi biết về phản hồi.

{'Date': 'Thu, 30 Jan 2020 17:06:12 GMT', 
'Content-Type': 'text/html; charset=utf-8',
'Transfer-Encoding': 'chunked',
'Connection': 'keep-alive',
'Set-Cookie': 'uid=lo_NHI3i4bLD514; Expires=Fri, 29-Jan-21 17:06:12 GMT; Domain=.medium.com; Path=/; Secure; HttpOnly,
optimizelyEndUserId=lo_NHI3i4bLD514; path=/; expires=Fri, 29 Jan 2021 17:06:12 GMT; domain=.medium.com; samesite=none; secure,
sid=1:Hu5pQRgkgEyZr7Iq5hNn6Sns/FKPUZaBJBtDCMI+nmsU48zG2lXM+dtrtlefPkfv; path=/; expires=Fri, 29 Jan 2021 17:06:12 GMT; domain=.medium.com; samesite=none; secure; httponly',
'Sepia-Upstream': 'production',
'x-frame-options': 'allow-from medium.com',
'cache-control': 'no-cache,
no-store, max-age=0, must-revalidate',
'medium-fulfilled-by': 'lite/master-20200129-184608-2156addefa, rito/master-20200129-204844-eee64d76ba, tutu/medium-39848', 'etag': 'W/"179e9-KtF+IBtxWFdtJWnZeOZBkcF8rX8"',
'vary': 'Accept-Encoding',
'content-encoding': 'gzip',
'x-envoy-upstream-service-time': '162',
'Strict-Transport-Security': 'max-age=15552000; includeSubDomains; preload',
'CF-Cache-Status': 'DYNAMIC',
'Expect-CT': 'max-age=604800,
report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', 'Alt-Svc': 'h3-24=":443"; ma=86400, h3-23=":443"; ma=86400', 'X-Content-Type-Options': 'nosniff',
'Server': 'cloudflare',
'CF-RAY': '55d508f64e9234c2-LHR'}

Gói yêu cầu Nhận phương thức Tải xuống phần thân của phản hồi mà không cần sự cho phép. Điều này sẽ trở nên liên quan đến phần tiếp theo!

Đối với mục đích tải xuống một tệp, chúng tôi sẽ muốn lấy đối tượng yêu cầu dưới dạng byte và không phải chuỗi. Để thực hiện điều này, chúng tôi gọi phương thức phản hồi. Thay vào đó, điều này đảm bảo dữ liệu chúng tôi nhận được ở định dạng byte.

Bây giờ để viết một tệp, chúng ta có thể sử dụng một chức năng mở được đặt trực tiếp ra khỏi các chức năng tích hợp của Python. Chúng tôi chỉ định tên tệp và ‘WB, đề cập đến việc viết byte. Python 3 cần phải rõ ràng khi biết liệu dữ liệu có phải là nhị phân hay không, đây là lý do tại sao chúng tôi xác định nó!

Sau đó, chúng tôi sử dụng phương thức ghi để viết nội dung nhị phân đã xác định của yêu cầu GET.

with open('filename.txt', 'wb') as r: 
r.write(html.content)

Tuyên bố mở ra cái gọi là người quản lý ngữ cảnh. Điều này rất hữu ích vì nó sẽ đóng chức năng mở mà không cần thêm mã. Chúng tôi sẽ phải yêu cầu đóng chức năng mở khác. Chúng tôi không phải với tuyên bố với tuyên bố.

Tải xuống các tệp lớn với yêu cầu

Vì vậy, chúng tôi đã nói về cách tải xuống cơ bản để sử dụng gói yêu cầu. Các đối số phương thức GET giúp xác định cách chúng tôi yêu cầu thông tin từ các máy chủ. Chúng tôi có thể thay đổi yêu cầu theo nhiều cách. Vui lòng xem tài liệu cho các yêu cầu để biết thêm chi tiết.

Chúng tôi đã nói rằng yêu cầu tải xuống phần thân của các tệp nhị phân trừ khi được nói khác. Điều này có thể được ghi đè bằng cách xác định tham số luồng. Điều này nằm dưới tiêu đề ‘Quy trình làm việc nội dung cơ thể trong các tài liệu yêu cầu. Xem ở đây cho điều đó. Đó là một cách kiểm soát khi cơ thể của nhị phân đang được tải xuống.

request.get(url, stream=True)

Tại thời điểm này trong tập lệnh, chỉ các tiêu đề của tệp nhị phân mới được tải xuống. Bây giờ, chúng ta có thể kiểm soát cách chúng ta tải xuống tệp bằng phương thức gọi là request.iter_content. Phương thức này dừng toàn bộ tệp trong bộ nhớ (bộ nhớ cache).

Đằng sau cảnh, phương thức ITER_Content lặp lại đối tượng Phản hồi. Sau đó, bạn có thể chỉ định một chunk_size, đó là bao nhiêu chúng tôi xác định để đưa vào bộ nhớ. Điều này có nghĩa là kết nối sẽ không đóng cho đến khi tất cả việc truyền dữ liệu hoàn thành.

Xem ở đây để biết thêm chi tiết.

r = requests.get(url, Stream=True)
with open("filename.pdf",'wb') as Pypdf:
for chunk in r.iter_content(chunk_size=1024)
if chunk:
pypdf.write(ch)

Vì vậy, ở đây chúng tôi nhận được nội dung bằng cách sử dụng phương thức nhận yêu cầu. Chúng tôi sử dụng một câu lệnh như một người quản lý ngữ cảnh và gọi R.ITER_Content. Chúng tôi sử dụng một vòng lặp và xác định khối biến, biến khối này sẽ chứa mỗi 1024 byte được định nghĩa bởi chunk_size.

Chunk_size chúng tôi đặt thành 1024 byte Đây có thể là bất cứ điều gì nếu cần thiết.

Chúng tôi viết từng đoạn trong khi nó đưa vào bộ nhớ. Chúng tôi sử dụng một câu lệnh IF tìm ra liệu có một đoạn để viết hay không và nếu vậy, chúng tôi sử dụng phương thức ghi để làm như vậy. Điều này cho phép chúng tôi không sử dụng hết tất cả các bộ đệm và tải xuống các tệp lớn hơn theo cách từng phần.

Tải xuống các tệp chuyển hướng

Có những lúc bạn muốn tải xuống một tệp nhưng trang web chuyển hướng để truy xuất tệp đó. Gói yêu cầu có thể xử lý việc này một cách dễ dàng.

import requests
url = 'insert url'
response = requests.get(url, allow_redirects=True)
with open('filename.pdf') as Pypdf:
pypdf.write(response.content)

Ở đây chúng tôi sử dụng đối số allow_redirects = true trong phương thức GET. Chúng tôi sử dụng một câu lệnh như trước đây để viết tệp.

Đó là nó cho bài viết này! Hãy theo dõi phần tiếp theo. Chúng tôi sẽ xem xét các bản tải xuống xác thực, tiếp tục tải xuống và các thanh tiến trình mã hóa!

Trong các bài viết sau, chúng ta sẽ nói về các kỹ thuật không đồng bộ. Chúng có thể mở rộng quy mô tải xuống các bộ tệp lớn hơn!

Thông tin về các Tác giả

Tôi là một bác sĩ y khoa có hứng thú với việc giảng dạy, trăn, công nghệ và chăm sóc sức khỏe. Tôi có trụ sở tại Vương quốc Anh, tôi dạy giáo dục lâm sàng trực tuyến cũng như điều hành các trang web www.coding-medics.com.

Bạn có thể liên hệ với tôi trên hoặc trên Twitter tại đây, tất cả các ý kiến ​​và đề xuất chào mừng! Nếu bạn muốn trò chuyện về bất kỳ dự án nào hoặc hợp tác sẽ rất tuyệt.

Để biết thêm nội dung liên quan đến công nghệ/mã hóa, vui lòng đăng ký nhận bản tin của tôi ở đây.

Yêu cầu có nhận được tệp tải xuống không?

Yêu cầu là một thư viện HTTP đa năng trong Python với các ứng dụng khác nhau. Một trong những ứng dụng của nó là tải xuống một tệp từ web bằng URL tệp.download a file from web using the file URL.

Làm cách nào để tải xuống các yêu cầu Python?

Để tải xuống một tệp từ URL bằng Python, hãy làm theo ba bước sau:..
Cài đặt mô -đun yêu cầu và nhập nó vào dự án của bạn ..
Sử dụng yêu cầu.Nhận () để tải xuống dữ liệu đằng sau url đó ..
Viết tệp vào tệp trong hệ thống của bạn bằng cách gọi Open () ..

Làm cách nào để tự động tải xuống một tệp từ một trang web bằng Python?

Nhập mô -đun.Nhập yêu cầu ..
Nhận liên kết hoặc URL.url = 'https://www.facebook.com/favicon.ico' r = requests.get (url, allow_redirects = true).
Lưu nội dung với tên.Mở ('Facebook.ICO', 'WB'). Viết (R.Content) lưu tệp dưới dạng Facebook.....
Nhận tên tệp từ một url.Để có được tên tệp, chúng ta có thể phân tích URL ..

Làm cách nào để tải xuống một tệp lớn bằng Python?

Sử dụng yêu cầu ...
url="https://raw.githubusercontent.com/selva86/datasets/master/BostonHousing.csv".
Trả lời = Yêu cầu.Nhận (url, stream = true).
text_file = open ("data.txt", "wb").
cho chunk để đáp ứng.iter_content (chunk_size = 1024):.
Text_File.Viết (Chunk) ....
Text_File.gần().