Python yêu cầu urlopen

Bạn sẽ cần một phiên bản để thực hiện yêu cầu. Đối tượng này xử lý tất cả các chi tiết về tổng hợp kết nối và an toàn luồng để bạn không phải

>>> http = urllib3.PoolManager[]

Để thực hiện một yêu cầu sử dụng

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
7

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
7 trả về một đối tượng, phần này giải thích cách xử lý các phản hồi khác nhau

Bạn có thể sử dụng

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
7 để thực hiện các yêu cầu bằng bất kỳ động từ HTTP nào

>>> r = http.request[
..     'POST',
..     '//httpbin.org/post',
..     fields={'hello': 'world'}
.. ]

Phần này đề cập đến việc gửi các loại dữ liệu yêu cầu khác, bao gồm JSON, tệp và dữ liệu nhị phân

Nội dung phản hồi

Đối tượng cung cấp các thuộc tính

>>> r = http.request[
..     'POST',
..     '//httpbin.org/post',
..     fields={'hello': 'world'}
.. ]
2, , và
>>> r = http.request[
..     'POST',
..     '//httpbin.org/post',
..     fields={'hello': 'world'}
.. ]
4

________số 8

Nội dung JSON

Nội dung JSON có thể được tải bằng cách giải mã và giải tuần tự hóa thuộc tính của yêu cầu

>>> import json
>>> r = http.request['GET', '//httpbin.org/ip']
>>> json.loads[r.data.decode['utf-8']]
{'origin': '127.0.0.1'}

Nội dung nhị phân

Thuộc tính của phản hồi luôn được đặt thành chuỗi byte biểu thị nội dung phản hồi

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
0

Ghi chú

Đối với các phản hồi lớn hơn, đôi khi tốt hơn là phản hồi

Sử dụng Trình bao bọc io với Nội dung phản hồi

Đôi khi bạn muốn sử dụng hoặc các đối tượng tương tự như trình đọc CSV trực tiếp với dữ liệu. Làm cho hai giao diện này hoạt động tốt với nhau yêu cầu sử dụng thuộc tính

>>> r = http.request[
..     'POST',
..     '//httpbin.org/post',
..     fields={'hello': 'world'}
.. ]
9 bằng cách đặt nó thành
>>> r = http.request['GET', '//httpbin.org/ip']
>>> r.status
200
>>> r.data
b'{\n  "origin": "104.232.115.37"\n}\n'
>>> r.headers
HTTPHeaderDict[{'Content-Length': '33', ...}]
0. Theo mặc định, các phản hồi HTTP bị đóng sau khi đọc tất cả các byte, điều này sẽ vô hiệu hóa hành vi đó

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
3

Yêu cầu dữ liệu

tiêu đề

Bạn có thể chỉ định các tiêu đề làm từ điển trong đối số

>>> r = http.request[
..     'POST',
..     '//httpbin.org/post',
..     fields={'hello': 'world'}
.. ]
4 trong
>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
7

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
6

Tham số truy vấn

Đối với các yêu cầu

>>> r = http.request['GET', '//httpbin.org/ip']
>>> r.status
200
>>> r.data
b'{\n  "origin": "104.232.115.37"\n}\n'
>>> r.headers
HTTPHeaderDict[{'Content-Length': '33', ...}]
3,
>>> r = http.request['GET', '//httpbin.org/ip']
>>> r.status
200
>>> r.data
b'{\n  "origin": "104.232.115.37"\n}\n'
>>> r.headers
HTTPHeaderDict[{'Content-Length': '33', ...}]
4 và
>>> r = http.request['GET', '//httpbin.org/ip']
>>> r.status
200
>>> r.data
b'{\n  "origin": "104.232.115.37"\n}\n'
>>> r.headers
HTTPHeaderDict[{'Content-Length': '33', ...}]
5, bạn có thể chỉ cần chuyển đối số dưới dạng từ điển trong đối số
>>> r = http.request['GET', '//httpbin.org/ip']
>>> r.status
200
>>> r.data
b'{\n  "origin": "104.232.115.37"\n}\n'
>>> r.headers
HTTPHeaderDict[{'Content-Length': '33', ...}]
6 cho
>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
7

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
20

Đối với các yêu cầu

>>> r = http.request['GET', '//httpbin.org/ip']
>>> r.status
200
>>> r.data
b'{\n  "origin": "104.232.115.37"\n}\n'
>>> r.headers
HTTPHeaderDict[{'Content-Length': '33', ...}]
8 và
>>> r = http.request['GET', '//httpbin.org/ip']
>>> r.status
200
>>> r.data
b'{\n  "origin": "104.232.115.37"\n}\n'
>>> r.headers
HTTPHeaderDict[{'Content-Length': '33', ...}]
9, bạn cần mã hóa thủ công các tham số truy vấn trong URL

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
21

Dữ liệu biểu mẫu

Đối với các yêu cầu

>>> r = http.request['GET', '//httpbin.org/ip']
>>> r.status
200
>>> r.data
b'{\n  "origin": "104.232.115.37"\n}\n'
>>> r.headers
HTTPHeaderDict[{'Content-Length': '33', ...}]
9 và
>>> r = http.request['GET', '//httpbin.org/ip']
>>> r.status
200
>>> r.data
b'{\n  "origin": "104.232.115.37"\n}\n'
>>> r.headers
HTTPHeaderDict[{'Content-Length': '33', ...}]
8, urllib3 sẽ tự động mã hóa từ điển trong đối số
>>> r = http.request['GET', '//httpbin.org/ip']
>>> r.status
200
>>> r.data
b'{\n  "origin": "104.232.115.37"\n}\n'
>>> r.headers
HTTPHeaderDict[{'Content-Length': '33', ...}]
6 được cung cấp cho
>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
7

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
22

JSON

Bạn có thể gửi yêu cầu JSON bằng cách chỉ định dữ liệu được mã hóa làm đối số

>>> import json
>>> r = http.request['GET', '//httpbin.org/ip']
>>> json.loads[r.data.decode['utf-8']]
{'origin': '127.0.0.1'}
4 và đặt tiêu đề
>>> import json
>>> r = http.request['GET', '//httpbin.org/ip']
>>> json.loads[r.data.decode['utf-8']]
{'origin': '127.0.0.1'}
5 khi gọi
>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
7

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
23

Tệp và dữ liệu nhị phân

Để tải tệp lên bằng cách sử dụng mã hóa

>>> import json
>>> r = http.request['GET', '//httpbin.org/ip']
>>> json.loads[r.data.decode['utf-8']]
{'origin': '127.0.0.1'}
7, bạn có thể sử dụng phương pháp tương tự như và chỉ định trường tệp dưới dạng một bộ của
>>> import json
>>> r = http.request['GET', '//httpbin.org/ip']
>>> json.loads[r.data.decode['utf-8']]
{'origin': '127.0.0.1'}
8

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
24

Mặc dù việc chỉ định tên tệp không bắt buộc, nhưng nó được khuyến nghị để phù hợp với hành vi của trình duyệt. Bạn cũng có thể chuyển mục thứ ba trong bộ dữ liệu để chỉ định rõ ràng loại MIME của tệp

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
25

Để gửi dữ liệu nhị phân thô, chỉ cần chỉ định đối số

>>> import json
>>> r = http.request['GET', '//httpbin.org/ip']
>>> json.loads[r.data.decode['utf-8']]
{'origin': '127.0.0.1'}
4. Bạn cũng nên đặt tiêu đề
>>> import json
>>> r = http.request['GET', '//httpbin.org/ip']
>>> json.loads[r.data.decode['utf-8']]
{'origin': '127.0.0.1'}
5

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
26

Xác minh chứng chỉ

Ghi chú

Mới trong phiên bản 1. 25

Các kết nối HTTPS hiện được xác minh theo mặc định [

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
01]

Mặc dù bạn có thể tắt xác minh chứng chỉ bằng cách đặt

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
02, nhưng bạn nên để nó ở trạng thái bật

Trừ khi được chỉ định khác, urllib3 sẽ cố tải các cửa hàng chứng chỉ hệ thống mặc định. Phương pháp đa nền tảng đáng tin cậy nhất là sử dụng gói certifi cung cấp gói chứng chỉ gốc của Mozilla

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
27

Bạn cũng có thể cài đặt certifi cùng với urllib3 bằng cách sử dụng tiện ích bổ sung

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
03

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
28

Cảnh báo

Nếu bạn đang sử dụng Python 2, bạn có thể cần các gói bổ sung. Xem để biết thêm chi tiết

Khi bạn có chứng chỉ, bạn có thể tạo chứng chỉ xác minh khi thực hiện yêu cầu

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
29

Sẽ tự động xử lý xác minh chứng chỉ và sẽ tăng nếu xác minh không thành công

>>> http = urllib3.PoolManager[]
0

Ghi chú

Bạn có thể sử dụng các chứng chỉ do hệ điều hành cung cấp nếu muốn. Chỉ cần chỉ định đường dẫn đầy đủ đến gói chứng chỉ làm đối số

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
07 thay vì
>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
08. Ví dụ: hầu hết các hệ thống Linux lưu trữ chứng chỉ tại
>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
09. Các hệ điều hành khác có thể khó khăn

Xác minh chứng chỉ trong Python 2

Các phiên bản cũ hơn của Python 2 được xây dựng với một mô-đun thiếu và có thể tụt hậu so với các bản cập nhật bảo mật. Vì những lý do này, bạn nên sử dụng pyOpenSSL

Nếu bạn cài đặt urllib3 với phần bổ sung

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
03, tất cả các gói cần thiết để xác minh chứng chỉ trên Python 2 sẽ được cài đặt

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
28

Nếu bạn muốn cài đặt các gói theo cách thủ công, bạn sẽ cần ________ 132, ________ 133, ________ 134 và ________ 135

Ghi chú

Nếu bạn không sử dụng macOS hoặc Windows, hãy lưu ý rằng mật mã yêu cầu các gói hệ thống bổ sung để biên dịch. Xem danh sách các gói cần thiết

Sau khi cài đặt, bạn có thể yêu cầu urllib3 sử dụng pyOpenSSL bằng cách sử dụng

>>> http = urllib3.PoolManager[]
2

Cuối cùng, bạn có thể tạo một chứng chỉ xác minh khi thực hiện các yêu cầu

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
29

Nếu bạn không muốn sử dụng pyOpenSSL, bạn chỉ cần bỏ qua cuộc gọi đến. urllib3 sẽ quay trở lại mô-đun thư viện chuẩn. Bạn có thể trải nghiệm khi làm điều này

Cảnh báo

Nếu bạn không sử dụng pyOpenSSL, Python phải được biên dịch với hỗ trợ ssl để xác minh chứng chỉ hoạt động. Nó không phổ biến, nhưng có thể biên dịch Python mà không cần hỗ trợ SSL. Xem chủ đề StackOverflow này để biết thêm chi tiết

Nếu bạn đang sử dụng Google App Engine, bạn phải bật hỗ trợ SSL một cách rõ ràng trong

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
60 của mình

>>> http = urllib3.PoolManager[]
4

Sử dụng thời gian chờ

Thời gian chờ cho phép bạn kiểm soát khoảng thời gian [tính bằng giây] yêu cầu được phép chạy trước khi bị hủy bỏ. Trong các trường hợp đơn giản, bạn có thể chỉ định thời gian chờ là

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
61 đến
>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
7

>>> http = urllib3.PoolManager[]
5

Để kiểm soát chi tiết hơn, bạn có thể sử dụng một phiên bản cho phép bạn chỉ định thời gian chờ kết nối và đọc riêng biệt

>>> http = urllib3.PoolManager[]
6

Nếu bạn muốn tất cả các yêu cầu có cùng thời gian chờ, bạn có thể chỉ định thời gian chờ ở mức

>>> http = urllib3.PoolManager[]
7

Bạn vẫn ghi đè thời gian chờ cấp nhóm này bằng cách chỉ định

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
65 thành
>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
7

Thử lại yêu cầu

urllib3 có thể tự động thử lại các yêu cầu bình thường. Cơ chế tương tự này cũng xử lý chuyển hướng. Bạn có thể kiểm soát các lần thử lại bằng cách sử dụng tham số

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
67 đến
>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
7. Theo mặc định, urllib3 sẽ thử lại yêu cầu 3 lần và theo dõi tối đa 3 lần chuyển hướng

Để thay đổi số lần thử lại, chỉ cần chỉ định một số nguyên

>>> http = urllib3.PoolManager[]
8

Để tắt tất cả logic thử lại và chuyển hướng, hãy chỉ định

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
69

>>> http = urllib3.PoolManager[]
9

Để tắt chuyển hướng nhưng vẫn giữ logic thử lại, hãy chỉ định

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
200

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
0

Để kiểm soát chi tiết hơn, bạn có thể sử dụng một ví dụ. Lớp này cho phép bạn kiểm soát nhiều hơn cách các yêu cầu được thử lại

Ví dụ: để thực hiện tổng cộng 3 lần thử lại, nhưng giới hạn chỉ 2 lần chuyển hướng

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
1

Bạn cũng có thể vô hiệu hóa các ngoại lệ đối với quá nhiều chuyển hướng và chỉ trả lại phản hồi

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
202

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
2

Nếu bạn muốn tất cả các yêu cầu tuân theo cùng một chính sách thử lại, bạn có thể chỉ định thử lại ở cấp độ

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
3

Bạn vẫn ghi đè chính sách thử lại ở cấp nhóm này bằng cách chỉ định

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
67 thành
>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
7

Lỗi & Ngoại lệ

ví dụ: urllib3 kết thúc các ngoại lệ cấp thấp hơn

>>> r = http.request['GET', '//httpbin.org/robots.txt']
>>> r.data
b'User-agent: *\nDisallow: /deny\n'
4

Xem danh sách đầy đủ của tất cả các trường hợp ngoại lệ

ghi nhật ký

Nếu bạn đang sử dụng mô-đun thư viện chuẩn urllib3 sẽ phát ra một số nhật ký. Trong một số trường hợp, điều này có thể không mong muốn. Bạn có thể sử dụng giao diện trình ghi nhật ký tiêu chuẩn để thay đổi cấp độ nhật ký cho trình ghi nhật ký của urllib3

Chủ Đề