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

Có rất nhiều gói để xử lý internet trong python. Bạn không cần phải biết tất cả, nhưng để cho bạn biết lý do tại sao một người 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 để xử lý các yêu cầu HTTP không đồng bộ]
  • aiohttp [gói khác xử lý 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ì?

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à đôi khi CPU không làm gì cả 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ộ không chặn trình duyệt, điều này cho phép máy khách thực hiện các tác vụ khác cùng một lúc. Điều này cho phép nhân 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 bản soạn sẵn và đôi khi có thể hơi khó đọ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 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 ta có thể sử dụng mảng 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 gói yêu cầu. lấy phương thức. Về cơ bản, điều này thực hiện một yêu cầu HTTP GET tới URL được 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ủ sẽ 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 xem phản hồi ở dạng chuỗi. Yêu cầu giả định mã hóa tùy thuộc vào dữ liệu trở lại từ máy chủ

Có hai phần đối với thông tin này mà chúng tôi nhận lại, phần đầu và phần thân. Tiêu đề cung cấp cho chúng tôi thông tin về phản hồi. Hãy coi tiêu đề là tất cả thông tin bạn cần để gửi thư đến máy tính của mình

Xem bên dưới một ví dụ từ tiêu đề của phương tiện. 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="//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'}

Phương thức nhận gói yêu cầu tải xuống nội dung của phản hồi mà không cần xin phép. Điều này sẽ trở nên có liên quan đến phần tiếp theo

Với mục đích tải xuống tệp, chúng tôi sẽ muốn nhận đối tượng yêu cầu ở dạng byte chứ không phải chuỗi. Để làm điều này, chúng tôi kêu gọi phản ứng. thay vào đó là phương thức nội dung, đ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 soạn sẵn từ các chức năng tích hợp sẵn của python. Chúng tôi chỉ định tên tệp và 'wb' đề cập đến việc ghi byte. Python 3 cần phải rõ ràng để 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 nhận

with open['filename.txt', 'wb'] as r: 
r.write[html.content]

Câu lệnh with mở ra cái được gọi là trình quản lý ngữ cảnh. Điều này rất hữu ích vì nó sẽ đóng chức năng đang 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 đang mở nếu không. Chúng ta không cần phải làm với câu lệnh with

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

Vì vậy, chúng tôi đã nói về cách cơ bản để tải xuống bằ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ừ máy chủ. Chúng ta 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 tệp nhị phân trừ khi có thông báo 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 xuất hiện dưới tiêu đề 'Quy trình làm việc nội dung' trong tài liệu yêu cầu. Xem ở đây cho điều đó. Đó là một cách kiểm soát khi phần thân của tệp 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 đang đượ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 được gọi là yêu cầu. iter_content. Phương pháp này dừng toàn bộ tệp trong bộ nhớ [bộ đệm]

Phía sau, phương thức iter_content lặp lại trên đối tượng phản hồi. Sau đó, bạn có thể chỉ định chunk_size, đó là số lượng 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ả quá trình truyền dữ liệu hoàn tất

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 câu lệnh with làm trình quản lý ngữ cảnh và gọi r. iter_content. Chúng tôi sử dụng vòng lặp for và xác định biến chunk, biến chunk này sẽ chứa mỗi 1024 byte như được xác định bởi chunk_size

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

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

Đang 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 lại chuyển hướng để lấy 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 câu lệnh with như trước để ghi 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 xác thực tải xuống, tiếp tục tải xuống và mã hóa thanh tiến trình

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

Giới thiệu về tác giả

Tôi là một bác sĩ y khoa rất quan tâm đến giảng dạy, trăn, công nghệ và chăm sóc sức khỏe. Tôi làm việc 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 trang web www. mã hóa-medics. com

Bạn có thể liên hệ với tôi trên asmith53@ed. AC. uk hoặc trên twitter tại đây, tất cả các nhận xét và đề xuất đều được chào đón. Nếu bạn muốn trò chuyện về bất kỳ dự án nào hoặc cộng tác thì điều đó thật tuyệt

Chủ Đề