Yêu cầu - Hướng dẫn nhanh

Yêu cầu là một thư viện HTTP cung cấp chức năng dễ dàng để xử lý yêu cầu / phản hồi http trong ứng dụng web của bạn. Thư viện được phát triển bằng python.

Trang web chính thức của Yêu cầu Python có sẵn tại https://2.python-requests.org/en/master/ định nghĩa các Yêu cầu như sau:

Yêu cầu là một thư viện HTTP thanh lịch và đơn giản cho Python, được xây dựng cho con người.

Đặc điểm của Yêu cầu

Các tính năng của Yêu cầu được thảo luận bên dưới -

Yêu cầu

Thư viện yêu cầu python có sẵn các phương thức dễ sử dụng để xử lý yêu cầu Http. Chuyển các tham số và xử lý loại yêu cầu như GET, POST, PUT, DELETE, v.v. rất dễ dàng.

Phản ứng

Bạn có thể nhận được phản hồi ở định dạng bạn cần và những định dạng được hỗ trợ là định dạng văn bản, phản hồi nhị phân, phản hồi json và phản hồi thô.

Tiêu đề

Thư viện cho phép bạn đọc, cập nhật hoặc gửi các tiêu đề mới theo yêu cầu của bạn.

Hết giờ

Thời gian chờ có thể được thêm dễ dàng vào URL bạn đang yêu cầu bằng cách sử dụng thư viện yêu cầu python. Điều này xảy ra là bạn đang sử dụng URL của bên thứ ba và chờ phản hồi.

Việc đưa ra thời gian chờ trên URL luôn là một phương pháp hay vì chúng tôi có thể muốn URL phản hồi trong khoảng thời gian chờ đó kèm theo phản hồi hoặc lỗi sắp xảy ra do hết thời gian chờ. Không làm như vậy có thể khiến yêu cầu đó phải chờ vô thời hạn.

Xử lý lỗi

Mô-đun yêu cầu cung cấp hỗ trợ cho việc xử lý lỗi và một số lỗi trong số đó là Lỗi kết nối, lỗi Hết thời gian chờ, lỗi TooManyRedirects, lỗi Response.raise_for_status, v.v.

Bánh quy

Thư viện cho phép bạn đọc, viết và cập nhật cho URL được yêu cầu.

Phiên

Để duy trì dữ liệu, bạn yêu cầu giữa các yêu cầu bạn cần các phiên. Vì vậy, nếu cùng một máy chủ được gọi đi gọi lại, bạn có thể sử dụng lại kết nối TCP để cải thiện hiệu suất.

Chứng chỉ SSL

Chứng chỉ SSL là một tính năng bảo mật đi kèm với các url an toàn. Khi bạn sử dụng Yêu cầu, nó cũng xác minh chứng chỉ SSL cho URL https được cung cấp. Xác minh SSL được bật theo mặc định trong thư viện yêu cầu và sẽ xuất hiện lỗi nếu chứng chỉ không có.

Xác thực

Xác thực HTTP ở phía máy chủ yêu cầu một số thông tin xác thực như tên người dùng, mật khẩu khi máy khách yêu cầu URL. Đây là một bảo mật bổ sung cho yêu cầu và phản hồi được trao đổi giữa máy khách và máy chủ.

Ưu điểm của việc sử dụng Thư viện yêu cầu Python

Sau đây là những ưu điểm của việc sử dụng Thư viện yêu cầu Python:

  • Dễ dàng sử dụng và tìm nạp dữ liệu từ URL đã cho.

  • Thư viện yêu cầu có thể được sử dụng để thu thập dữ liệu từ trang web.

  • Sử dụng các yêu cầu, bạn có thể lấy, đăng, xóa, cập nhật dữ liệu cho URL đã cho.

  • Việc xử lý cookie và phiên rất dễ dàng.

  • Bảo mật cũng được chăm sóc với sự trợ giúp của hỗ trợ mô-đun xác thực.

Trong chương này, chúng ta sẽ làm việc về việc cài đặt các Yêu cầu. Để bắt đầu làm việc với mô-đun Yêu cầu, trước tiên chúng ta cần cài đặt Python. Vì vậy, chúng tôi sẽ làm việc sau

  • Cài đặt Python
  • Yêu cầu cài đặt

Cài đặt Python

Truy cập trang web chính thức của Python: https://www.python.org/downloads/như hình dưới đây và nhấp vào phiên bản mới nhất có sẵn cho Windows, Linux / Unix và Mac OS. Tải xuống Python theo hệ điều hành 64 hoặc 32 bit có sẵn của bạn.

Khi bạn đã tải xuống, hãy nhấp vào tệp .exe và làm theo các bước để cài đặt python trên hệ thống của bạn.

Trình quản lý gói python, tức là, pip cũng sẽ được cài đặt theo mặc định với cài đặt ở trên. Để làm cho nó hoạt động trên toàn cầu trên hệ thống của bạn, hãy thêm trực tiếp vị trí của python vào biến PATH. Điều tương tự được hiển thị khi bắt đầu cài đặt, hãy nhớ chọn hộp kiểm có nội dung ADD to PATH. Trong trường hợp bạn quên kiểm tra nó, vui lòng làm theo các bước dưới đây để thêm vào PATH.

Để thêm vào PATH, hãy làm theo các bước−

Nhấp chuột phải vào biểu tượng Máy tính của bạn và nhấp vào thuộc tính> Cài đặt Hệ thống Nâng cao.

Nó sẽ hiển thị màn hình như hình dưới đây -

Nhấp vào Biến môi trường như hình trên. Nó sẽ hiển thị màn hình như hình dưới đây -

Chọn Đường dẫn và nhấp vào nút Chỉnh sửa, thêm đường dẫn vị trí của con trăn của bạn vào cuối. Bây giờ, chúng ta hãy kiểm tra phiên bản python.

Kiểm tra phiên bản python

E:\prequests>python --version
Python 3.7.3

Yêu cầu cài đặt

Bây giờ chúng ta đã cài đặt python, chúng ta sẽ cài đặt Yêu cầu.

Sau khi python được cài đặt, trình quản lý gói python tức là pip cũng sẽ được cài đặt. Sau đây là lệnh để kiểm tra phiên bản pip.

E:\prequests>pip --version
pip 19.1.1 from c:\users\xxxxx\appdata\local\programs\python\python37\lib\site-p
ackages\pip (python 3.7)

Chúng tôi đã cài đặt pip và phiên bản là 19.1.1. Bây giờ, sẽ sử dụng pip để cài đặt mô-đun Yêu cầu.

Lệnh được đưa ra bên dưới−

pip install requests
E:\prequests>pip install requests
Requirement already satisfied: requests in c:\users\xxxx\appdata\local\programs
\python\python37\lib\site-packages (2.22.0)
Requirement already satisfied: certifi>=2017.4.17 in c:\users\kamat\appdata\loca
l\programs\python\python37\lib\site-packages (from requests) (2019.3.9)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in c:\use
rs\xxxxx\appdata\local\programs\python\python37\lib\site-packages (from requests
) (1.25.3)
Requirement already satisfied: idna<2.9,>=2.5 in c:\users\xxxxxxx\appdata\local\pr
ograms\python\python37\lib\site-packages (from requests) (2.8)
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in c:\users\xxxxx\appdata\l
ocal\programs\python\python37\lib\site-packages (from requests) (3.0.4)

Chúng tôi đã cài đặt mô-đun, vì vậy trong dấu nhắc lệnh, nó cho biết Yêu cầu đã được thỏa mãn; nếu không được cài đặt, nó sẽ tải xuống các gói cần thiết để cài đặt.

Để kiểm tra chi tiết của mô-đun yêu cầu được cài đặt, bạn có thể sử dụng lệnh sau

pip show requests
E:\prequests>pip show requests
Name: requests
Version: 2.22.0
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: [email protected]
License: Apache 2.0
Location: c:\users\xxxxx\appdata\local\programs\python\python37\lib\site-package
S
Requires: certifi, idna, urllib3, chardet
Required-by:

Phiên bản của mô-đun Yêu cầu là 2.22.0.

Yêu cầu của Python là một thư viện HTTP sẽ giúp chúng ta trao đổi dữ liệu giữa máy khách và máy chủ. Hãy xem xét bạn có một giao diện người dùng với một biểu mẫu, trong đó bạn cần nhập chi tiết người dùng, vì vậy khi bạn nhập nó, bạn phải gửi dữ liệu không có gì khác ngoài yêu cầu Http POST hoặc PUT từ máy khách đến máy chủ để lưu dữ liệu.

Khi bạn muốn dữ liệu, bạn cần tìm nạp nó từ máy chủ, đây lại là một yêu cầu Http GET. Việc trao đổi dữ liệu giữa máy khách khi nó yêu cầu dữ liệu và máy chủ phản hồi với dữ liệu yêu cầu, mối quan hệ này giữa máy khách và máy chủ là rất quan trọng.

Yêu cầu được thực hiện đối với URL đã cho và nó có thể là URL an toàn hoặc không an toàn.

Yêu cầu đối với URL có thể được thực hiện bằng cách sử dụng GET, POST, PUT, DELETE. Phương thức được sử dụng phổ biến nhất là GET, chủ yếu được sử dụng khi bạn muốn tìm nạp dữ liệu từ máy chủ.

Bạn cũng có thể gửi dữ liệu đến URL dưới dạng một chuỗi truy vấn, chẳng hạn như

https://jsonplaceholder.typicode.com/users?id=9&username=Delphine

Vì vậy, ở đây, chúng tôi đang chuyển id = 9 và username = Delphine vào URL. Tất cả các giá trị được gửi trong cặp khóa / giá trị sau dấu chấm hỏi (?) Và nhiều tham số được chuyển đến URL được phân tách bằng &.

Sử dụng thư viện yêu cầu, URL được gọi như sau bằng cách sử dụng từ điển chuỗi.

Trong đó dữ liệu đến URL được gửi dưới dạng một chuỗi từ điển. Nếu bạn muốn chuyển id = 9 và username = Delphine, bạn có thể làm như sau:

payload = {'id': '9', 'username': 'Delphine'}

Thư viện yêu cầu được gọi như sau:

res = requests.get('https://jsonplaceholder.typicode.com/users', params=payload')

Sử dụng POST, chúng ta có thể làm như sau:

res = requests.post('https://jsonplaceholder.typicode.com/users', data = {'id':'9', 'username':'Delphine'})

Sử dụng PUT

res = requests.put('https://jsonplaceholder.typicode.com/users', data = {'id':'9', 'username':'Delphine'})

Sử dụng DELETE

res = requests.delete('https://jsonplaceholder.typicode.com/users')

Phản hồi từ yêu cầu Http có thể ở dạng mã hóa văn bản, mã hóa nhị phân, định dạng json hoặc phản hồi thô. Các chi tiết của yêu cầu và phản hồi được giải thích chi tiết trong các chương tiếp theo.

Trong chương này, chúng ta sẽ hiểu cách làm việc với mô-đun yêu cầu. Chúng tôi sẽ xem xét những điều sau

  • Thực hiện các yêu cầu HTTP.
  • Chuyển các tham số cho các yêu cầu HTTP.

Thực hiện các yêu cầu HTTP

Để thực hiện một yêu cầu Http, trước tiên chúng ta cần nhập mô-đun yêu cầu như hình bên dưới−

import requests

Bây giờ chúng ta hãy xem, cách gọi URL bằng mô-đun yêu cầu.

Hãy để chúng tôi sử dụng URL− https://jsonplaceholder.typicode.com/users trong mã, để kiểm tra Mô-đun yêu cầu.

Thí dụ

import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users')
print(getdata.status_code)

Url− https://jsonplaceholder.typicode.com/usersđược gọi bằng cách sử dụng phương thức request.get (). Đối tượng phản hồi của URL được lưu trữ trong biến getdata. Khi chúng tôi in biến, nó sẽ đưa ra mã phản hồi 200, có nghĩa là chúng tôi đã nhận được phản hồi thành công.

Đầu ra

E:\prequests>python makeRequest.py
<Response [200]>

Để lấy nội dung từ phản hồi, chúng tôi có thể làm như vậy bằng cách sử dụng getdata.content như hình dưới đây−

Thí dụ

import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users')
print(getdata.content)

getdata.content, sẽ in tất cả dữ liệu có sẵn trong phản hồi.

Đầu ra

E:\prequests>python makeRequest.py
b'[\n {\n  "id": 1,\n  "name": "Leanne Graham",\n  "username": "Bret",\n
"email": "[email protected]",\n  "address": {\n  "street": "Kulas Light
",\n  "suite": "Apt. 556",\n  "city": "Gwenborough",\n  "zipcode": "
92998-3874",\n  "geo": {\n "lat": "-37.3159",\n  "lng": "81.149
6"\n }\n },\n  "phone": "1-770-736-8031 x56442",\n  "website": "hild
egard.org",\n  "company": {\n "name": "Romaguera-Crona",\n  "catchPhr
ase": "Multi-layered client-server neural-net",\n  "bs": "harness real-time
e-markets"\n }\n }

Chuyển các tham số cho các yêu cầu HTTP

Chỉ yêu cầu URL là không đủ, chúng tôi cũng cần phải chuyển các tham số cho URL.

Các tham số chủ yếu được chuyển dưới dạng cặp khóa / giá trị, chẳng hạn như

 https://jsonplaceholder.typicode.com/users?id=9&username=Delphine

Vì vậy, chúng tôi có id = 9 và tên người dùng = Delphine. Bây giờ, sẽ xem làm thế nào để chuyển dữ liệu đó đến các yêu cầu mô-đun Http.

Thí dụ

import requests
payload = {'id': 9, 'username': 'Delphine'}
getdata = requests.get('https://jsonplaceholder.typicode.com/users', params=payload)
print(getdata.content)

Các chi tiết được lưu trữ trong trọng tải đối tượng trong cặp khóa / giá trị và được chuyển đến tham số, bên trong phương thức get ().

Đầu ra

E:\prequests>python makeRequest.py
b'[\n {\n "id": 9,\n "name": "Glenna Reichert",\n "username": "Delphin
e",\n "email": "[email protected]",\n "address": {\n "street":
"Dayna Park",\n "suite": "Suite 449",\n "city": "Bartholomebury",\n
"zipcode": "76495-3109",\n "geo": {\n "lat": "24.6463",\n
"lng": "-168.8889"\n }\n },\n "phone": "(775)976-6794 x41206",\n "
website": "conrad.com",\n "company": {\n "name": "Yost and Sons",\n
"catchPhrase": "Switchable contextually-based project",\n "bs": "aggregate
real-time technologies"\n }\n }\n]'

Bây giờ chúng tôi đang nhận được thông tin chi tiết về id = 9 và username = Delphine trong phản hồi.

Nếu bạn muốn xem, URL trông như thế nào sau khi truyền các tham số, sử dụng đối tượng phản hồi cho URL.

Thí dụ

import requests
payload = {'id': 9, 'username': 'Delphine'}
getdata = requests.get('https://jsonplaceholder.typicode.com/users', params=payload)
print(getdata.url)

Đầu ra

E:\prequests>python makeRequest.py
https://jsonplaceholder.typicode.com/users?id=9&username=Delphine

Trong chương này, chúng ta sẽ đi sâu vào chi tiết hơn về phản hồi nhận được từ mô-đun yêu cầu. Chúng ta sẽ thảo luận các chi tiết sau

  • Nhận phản hồi
  • Phản hồi JSON
  • Phản hồi RAW
  • Phản hồi nhị phân

Nhận phản hồi

Chúng tôi sẽ yêu cầu URL bằng phương thức request.get ().

import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users');

Getdata có đối tượng phản hồi. Nó có tất cả các chi tiết của phản ứng. Chúng tôi có thể nhận được phản hồi theo 2 cách sử dụng (. Text ) và (. Content ). Sử dụng response.text sẽ cung cấp cho bạn dữ liệu trở lại ở định dạng văn bản như hình dưới đây−

Thí dụ

E:\prequests>python makeRequest.py
[
 {
   "id": 1,
   "name": "Leanne Graham",
   "username": "Bret",
   "email": "[email protected]",
   "address": {
   "street": "Kulas Light",
   "suite": "Apt. 556",
   "city": "Gwenborough",
   "zipcode": "92998-3874",
   "geo": {
   "lat": "-37.3159",
   "lng": "81.1496"
   }
  },
   "phone": "1-770-736-8031 x56442",
   "website": "hildegard.org",
   "company": {
   "name": "Romaguera-Crona",
   "catchPhrase": "Multi-layered client-server neural-net",
   "bs": "harness real-time e-markets"
  }
},

Bạn sẽ thấy phản hồi giống như cách nó sẽ xuất hiện trong trình duyệt khi bạn xem nguồn cho URL như được hiển thị bên dưới−

Bạn cũng có thể thử URL .html và xem nội dung bằng cách sử dụng response.text, nó sẽ giống với nội dung nguồn xem cho URL .html trong trình duyệt.

Bây giờ, chúng ta hãy thử response.content cho cùng một URL và xem kết quả.

Thí dụ

import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users')
print(getdata.content)

Đầu ra

E:\prequests>python makeRequest.py
b'[\n {\n "id": 1,\n "name": "Leanne Graham",\n "username": "Bret",\n
"email": "[email protected]",\n "address": {\n "street": "Kulas Light
",\n "suite": "Apt. 556",\n "city": "Gwenborough",\n "zipcode": "
92998-3874",\n "geo": {\n "lat": "-37.3159",\n "lng": "81.149
6"\n }\n },\n "phone": "1-770-736-8031 x56442",\n "website": "hild
egard.org",\n "company": {\n "name": "Romaguera-Crona",\n "catchPhr
ase": "Multi-layered client-server neural-net",\n "bs": "harness real-time
e-markets"\n }\n },\n {\n "id": 2,\n "name": "Ervin Howell",\n "us
ername": "Antonette",\n "email": "[email protected]",\n "address": {\n
"street": "Victor Plains",\n "suite": "Suite 879",\n "city": "Wisoky
burgh",\n "zipcode": "90566-7771",\n "geo": {\n "lat": "-43.950
9",\n "lng": "-34.4618"\n }\n },\n "phone": "010-692-6593 x091
25",\n "website": "anastasia.net",\n "company": {\n "name": "Deckow-C
rist",\n "catchPhrase": "Proactive didactic contingency",\n "bs": "syn
ergize scalable supply-chains"\n }\n },\n {\n "id": 3,\n "name": "Cle
mentine Bauch",\n "username": "Samantha",\n "email":
"[email protected]",
\n "address": {\n "street": "Douglas Extension",\n "suite": "Suite
847",\n "city": "McKenziehaven",\n "zipcode": "59590-4157",\n "ge
o": {\n "lat": "-68.6102",\n "lng": "-47.0653"\n }\n },\n

Phản hồi được tính bằng byte. Bạn sẽ nhận được một lá thưbkhi bắt đầu phản hồi. Với mô-đun yêu cầu, bạn có thể sử dụng mã hóa và cũng có thể thay đổi mã hóa nếu cần. Ví dụ: để nhận mã hóa, bạn có thể sử dụng response.encoding.

print(getdata.encoding)

Đầu ra

utf-8

Bạn có thể thay đổi kiểu mã hóa như sau - Bạn có thể sử dụng kiểu mã hóa mà bạn chọn.

getdata.encoding = 'ISO-8859-1'

Phản hồi JSON

Bạn cũng có thể nhận được phản hồi cho yêu cầu Http ở định dạng json bằng cách sử dụng phương thức response.json () như sau−

Thí dụ

import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users')
print(getdata.json())

Đầu ra

E:\prequests>python makeRequest.py
[{'id': 1, 'name': 'Leanne Graham', 'username': 'Bret', 'email': 'Sincere@april.
biz', 'address': {'street': 'Kulas Light', 'suite': 'Apt. 556', 'city': 'Gwenbor
ough', 'zipcode': '92998-3874', 'geo': {'lat': '-37.3159', 'lng': '81.1496'}},
'
phone': '1-770-736-8031 x56442', 'website': 'hildegard.org', 'company': {'name':
'Romaguera-Crona', 'catchPhrase': 'Multi-layered client-server neural-net', 'bs
': 'harness real-time e-markets'}}]

Phản hồi RAW

Trong trường hợp bạn cần phản hồi thô cho URL Http, bạn có thể sử dụng response.raw, đồng thời thêm stream=True bên trong phương thức get như được hiển thị bên dưới−

Thí dụ

import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users', stream=True)
print(getdata.raw)

Đầu ra

E:\prequests>python makeRequest.py
<urllib3.response.HTTPResponse object at 0x000000A8833D7B70>

Để đọc thêm nội dung từ dữ liệu thô, bạn có thể làm như sau:

print(getdata.raw.read(50))

Đầu ra

E:\prequests>python makeRequest.py
b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\x95\x98[o\xe38\x12\x85\xdf\xe7W\x10y\
xda\x01F\x82.\xd4m\x9f\xdc\x9dd\xba\xb7\x93\xf4\x06q\xef4\x06\x83A@K\x15\x89m'

Phản hồi nhị phân

Để nhận được phản hồi nhị phân, chúng ta có thể sử dụng response.content.

Thí dụ

import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users')
print(getdata.content)

Đầu ra

E:\prequests>python makeRequest.py
b'[\n {\n "id": 1,\n "name": "Leanne Graham",\n "username": "Bret",\n
"email": "[email protected]",\n "address": {\n "street": "Kulas Light
",\n "suite": "Apt. 556",\n "city": "Gwenborough",\n "zipcode": "
92998-3874",\n "geo": {\n "lat": "-37.3159",\n "lng": "81.149
6"\n }\n },\n "phone": "1-770-736-8031 x56442",\n "website": "hild
egard.org",\n "company": {\n "name": "Romaguera-Crona",\n "catchPhr
ase": "Multi-layered client-server neural-net",\n "bs": "harness real-time
e-markets"\n }\n },\n {\n "id": 2,\n "name": "Ervin Howell",\n "us
ername": "Antonette",\n "email": "[email protected]",\n "address": {\n
"street": "Victor Plains",\n "suite": "Suite 879",\n "city": "Wisoky
burgh",\n "zipcode": "90566-7771",\n "geo": {\n "lat": "-43.950
9",\n "lng": "-34.4618"\n }\n },\n "phone": "010-692-6593 x091
25",\n "website": "anastasia.net",\n "company": {\n "name": "Deckow-C
rist",\n "catchPhrase": "Proactive didactic contingency",\n "bs": "syn
ergize scalable supply-chains"\n }\n },\n {\n "id": 3,\n "name": "Cle
mentine Bauch",\n "username": "Samantha",\n "email": "[email protected]",
\n "address": {\n "street": "Douglas Extension",\n "suite": "Suite
847",\n "city": "McKenziehaven",\n "zipcode": "59590-4157",\n "ge
o": {\n "lat": "-68.6102",\n "lng": "-47.0653"\n }\n },\n

Phản hồi được tính bằng byte. Bạn sẽ nhận được một lá thưbkhi bắt đầu phản hồi. Phản hồi nhị phân chủ yếu được sử dụng cho các yêu cầu không phải văn bản.

Yêu cầu - Tiêu đề yêu cầu HTTP

Trong chương trước, chúng ta đã biết cách thực hiện yêu cầu và nhận phản hồi. Chương này sẽ khám phá thêm một chút về phần tiêu đề của URL. Vì vậy, chúng ta sẽ xem xét những điều sau

  • Hiểu tiêu đề yêu cầu
  • Tiêu đề tùy chỉnh
  • Tiêu đề phản hồi

Hiểu tiêu đề yêu cầu

Nhấn vào bất kỳ URL nào trong trình duyệt, kiểm tra nó và kiểm tra tab mạng công cụ dành cho nhà phát triển.

Bạn sẽ nhận được tiêu đề phản hồi, tiêu đề yêu cầu, tải trọng, v.v.

Ví dụ: hãy xem xét URL sau

https://jsonplaceholder.typicode.com/users

Bạn có thể lấy chi tiết tiêu đề như sau

Thí dụ

import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users', stream=True)
print(getdata.headers)

Đầu ra

E:\prequests>python makeRequest.py
{'Date': 'Sat, 30 Nov 2019 05:15:00 GMT', 'Content-Type': 'application/json; cha
rset=utf-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Set-Co
okie': '__cfduid=d2b84ccf43c40e18b95122b0b49f5cf091575090900; expires=Mon, 30-De
c-19 05:15:00 GMT; path=/; domain=.typicode.com; HttpOnly', 'X-Powered-By': 'Exp
ress', 'Vary': 'Origin, Accept-Encoding', 'Access-Control-Allow-Credentials': 't
rue', 'Cache-Control': 'max-age=14400', 'Pragma': 'no-cache', 'Expires': '-1', '
X-Content-Type-Options': 'nosniff', 'Etag': 'W/"160d-1eMSsxeJRfnVLRBmYJSbCiJZ1qQ
"', 'Content-Encoding': 'gzip', 'Via': '1.1 vegur', 'CF-Cache-Status': 'HIT', 'A
ge': '2271', 'Expect-CT': 'max-age=604800, report-uri="https://report-uri.cloudf
lare.com/cdn-cgi/beacon/expect-ct"', 'Server': 'cloudflare', 'CF-RAY': '53da574f
f99fc331-SIN'}

Để đọc bất kỳ tiêu đề http nào, bạn có thể làm như sau:

getdata.headers["Content-Encoding"] // gzip

Tiêu đề tùy chỉnh

Bạn cũng có thể gửi tiêu đề đến URL được gọi như hình dưới đây.

Thí dụ

import requests
headers = {'x-user': 'test123'}
getdata = requests.get('https://jsonplaceholder.typicode.com/users', headers=headers)

Các tiêu đề được truyền phải là định dạng chuỗi, bytestring hoặc Unicode. Hành vi của yêu cầu sẽ không thay đổi theo các tiêu đề tùy chỉnh được chuyển.

Tiêu đề phản hồi

Tiêu đề phản hồi trông giống như bên dưới khi bạn kiểm tra URL trong công cụ dành cho nhà phát triển trình duyệt, tab mạng−

Để lấy chi tiết của tiêu đề từ việc sử dụng mô-đun yêu cầu. Response.headers như được hiển thị bên dưới−

Thí dụ

import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users')
print(getdata.headers)

Đầu ra

E:\prequests>python makeRequest.py
{'Date': 'Sat, 30 Nov 2019 06:08:10 GMT', 'Content-Type': 'application/json; cha
rset=utf-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Set-Co
okie': '__cfduid=de1158f1a5116f3754c2c353055694e0d1575094090; expires=Mon, 30-De
c-19 06:08:10 GMT; path=/; domain=.typicode.com; HttpOnly', 'X-Powered-By': 'Exp
ress', 'Vary': 'Origin, Accept-Encoding', 'Access-Control-Allow-Credentials': 't
rue', 'Cache-Control': 'max-age=14400', 'Pragma': 'no-cache', 'Expires': '-1', '
X-Content-Type-Options': 'nosniff', 'Etag': 'W/"160d-1eMSsxeJRfnVLRBmYJSbCiJZ1qQ
"', 'Content-Encoding': 'gzip', 'Via': '1.1 vegur', 'CF-Cache-Status': 'HIT', 'A
ge': '5461', 'Expect-CT': 'max-age=604800, report-uri="https://report-uri.cloudf
lare.com/cdn-cgi/beacon/expect-ct"', 'Server': 'cloudflare', 'CF-RAY': '53daa52f
3b7ec395-SIN'}

Bạn có thể lấy bất kỳ tiêu đề cụ thể nào bạn muốn như sau:

print(getdata.headers["Expect-CT"])

Đầu ra

max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/exp
ect-ct

You can also get the header details by using the get() method.

print(getdata.headers.get("Expect-CT"))

Đầu ra

max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/exp
ect-ct

Yêu cầu - Xử lý yêu cầu GET

Chương này sẽ tập trung nhiều hơn vào các yêu cầu GET, là yêu cầu phổ biến nhất và được sử dụng rất thường xuyên. Hoạt động của GET trong mô-đun yêu cầu rất dễ dàng. Dưới đây là một ví dụ đơn giản về cách làm việc với URL bằng phương thức GET.

Thí dụ

import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users')
print(getdata.content)
getdata.content, will print all the data available in the response.

Đầu ra

E:\prequests>python makeRequest.py
b'[\n {\n "id": 1,\n "name": "Leanne Graham",\n "username": "Bret",\n
"email": "[email protected]",\n "address": {\n "street": "Kulas Light
",\n "suite": "Apt. 556",\n "city": "Gwenborough",\n "zipcode": "
92998-3874",\n "geo": {\n "lat": "-37.3159",\n "lng": "81.149
6"\n }\n },\n "phone": "1-770-736-8031 x56442",\n "website": "hild
egard.org",\n "company": {\n "name": "Romaguera-Crona",\n "catchPhr
ase": "Multi-layered client-server neural-net",\n "bs": "harness real-time
e-markets"\n }\n }

Bạn cũng có thể chuyển các tham số cho phương thức get bằng cách sử dụng thuộc tính param như hình dưới đây−

import requests
payload = {'id': 9, 'username': 'Delphine'}
getdata = requests.get('https://jsonplaceholder.typicode.com/users',
params=payload)
print(getdata.content)

Các chi tiết được lưu trữ trong trọng tải đối tượng trong cặp khóa / giá trị và được chuyển đến tham số, bên trong phương thức get ().

Đầu ra

E:\prequests>python makeRequest.py
b'[\n {\n "id": 9,\n "name": "Glenna Reichert",\n "username": "Delphin
e",\n "email": "[email protected]",\n "address": {\n "street":
"Dayna Park",\n "suite": "Suite 449",\n "city": "Bartholomebury",\n
"zipcode": "76495-3109",\n "geo": {\n "lat": "24.6463",\n
"lng": "-168.8889"\n }\n },\n "phone": "(775)976-6794 x41206",\n "
website": "conrad.com",\n "company": {\n "name": "Yost and Sons",\n
"catchPhrase": "Switchable contextually-based project",\n "bs": "aggregate
real-time technologies"\n }\n }\n]'

Xử lý các yêu cầu POST, PUT, PATCH và DELETE

Trong chương này, chúng ta sẽ hiểu cách sử dụng phương thức POST bằng cách sử dụng thư viện yêu cầu và cũng truyền các tham số cho URL.

Sử dụng POST

Đối với yêu cầu PUT, thư viện Yêu cầu có phương thức request.post (), ví dụ về nó được hiển thị bên dưới:

yêu cầu nhập khẩu

myurl = 'https://postman-echo.com/post'
myparams = {'name': 'ABC', 'email':'[email protected]'}
res = requests.post(myurl, data=myparams)
print(res.text)

Đầu ra

E:\prequests>python makeRequest.py
{"args":{},"data":"","files":{},"form":{"name":"ABC","email":"[email protected]"},"headers":{"x-forwarded-proto":"https","host":"postman-echo.com","content-length":"30","accept":"*/*","accept-encoding":"gzip,deflate","content-type":"application/x-www-form-urlencoded","user-agent":"python-requests/2.22.0","x-forwarded-port":"443"},"json":{"name":"ABC","email":"[email protected]"},"url":"https://postman-echo.com/post"}

Trong ví dụ được hiển thị ở trên, bạn có thể chuyển dữ liệu biểu mẫu dưới dạng cặp khóa-giá trị đến tham số dữ liệu bên trong request.post (). Chúng ta cũng sẽ xem cách làm việc với PUT, PATCH và DELETE trong mô-đun yêu cầu.

Sử dụng PUT

Đối với yêu cầu PUT, thư viện Yêu cầu có phương thức request.put (), ví dụ về nó được hiển thị bên dưới.

import requests
myurl = 'https://postman-echo.com/put'
myparams = {'name': 'ABC', 'email':'[email protected]'}
res = requests.put(myurl, data=myparams)
print(res.text)

Đầu ra

E:\prequests>python makeRequest.py
{"args":{},"data":"","files":{},"form":{"name":"ABC","email":"[email protected]"},"h
eaders":{"x-forwarded-proto":"https","host":"postman-echo.com","content-length":
"30","accept":"*/*","accept-encoding":"gzip, deflate","content-type":"applicatio
n/x-www-form-urlencoded","user-agent":"python-requests/2.22.0","x-forwarded-port
":"443"},"json":{"name":"ABC","email":"[email protected]"},"url":"https://postman-ec ho.com/put"}

Sử dụng PATCH

Đối với yêu cầu PATCH, thư viện Yêu cầu có phương thức request.patch (), ví dụ về nó được hiển thị bên dưới.

import requests
myurl = https://postman-echo.com/patch'
res = requests.patch(myurl, data="testing patch")
print(res.text)

Đầu ra

E:\prequests>python makeRequest.py
{"args":{},"data":{},"files":{},"form":{},"headers":{"x-forwarded-proto":"https"
,"host":"postman-echo.com","content-length":"13","accept":"*/*","accept-encoding
":"gzip, deflate","user-agent":"python-requests/2.22.0","x-forwarded-port":"443"
},"json":null,"url":"https://postman-echo.com/patch"}

Sử dụng DELETE

Đối với yêu cầu DELETE, thư viện Yêu cầu có phương thức request.delete (), ví dụ về nó được hiển thị bên dưới.

import requests
myurl = 'https://postman-echo.com/delete'
res = requests.delete(myurl, data="testing delete")
print(res.text)

Đầu ra

E:\prequests>python makeRequest.py
{"args":{},"data":{},"files":{},"form":{},"headers":{"x-forwarded-proto":"https"
,"host":"postman-echo.com","content-length":"14","accept":"*/*","accept-encoding
":"gzip, deflate","user-agent":"python-requests/2.22.0","x-forwarded-port":"443"
},"json":null,"url":"https://postman-echo.com/delete"}

Yêu cầu - Tải lên tệp

Trong chương này, chúng tôi sẽ tải lên một tệp bằng yêu cầu và đọc nội dung của tệp đã tải lên. Chúng tôi có thể làm điều đó bằng cách sử dụngfiles param như thể hiện trong ví dụ bên dưới.

Chúng tôi sẽ sử dụng http://httpbin.org/đăng để tải tệp lên.

Thí dụ

import requests
myurl = 'https://httpbin.org/post'
files = {'file': open('test.txt', 'rb')}
getdata = requests.post(myurl, files=files)
print(getdata.text)

Test.txt

File upload test using Requests

Thí dụ

var total = [0, 1, 2, 3].reduceRight(function(a, b){ return a + b; }); 
console.log("total is : " + total );

Đầu ra

E:\prequests>python makeRequest.py
{
  "args": {},
  "data": "",
  "files": {
   "file": "File upload test using Requests"
  },
  "form": {},
  "headers": {
   "Accept": "*/*",
   "Accept-Encoding": "gzip, deflate",
   "Content-Length": "175",
   "Content-Type": "multipart/form-data; 
boundary=28aee3a9d15a3571fb80d4d2a94bf
d33",
   "Host": "httpbin.org",
   "User-Agent": "python-requests/2.22.0"
  },
  "json": null,
  "origin": "117.223.63.135, 117.223.63.135",
  "url": "https://httpbin.org/post"
}

Cũng có thể gửi nội dung của tệp như hình dưới đây−

Thí dụ

import requests
myurl = 'https://httpbin.org/post'
files = {'file': ('test1.txt', 'Welcome to TutorialsPoint')}
getdata = requests.post(myurl, files=files)
print(getdata.text)

Đầu ra

E:\prequests>python makeRequest.py
{
  "args": {},
  "data": "",
  "files": {
   "file": "Welcome to TutorialsPoint"
},
"form": {},
"headers": {
   "Accept": "*/*",
   "Accept-Encoding": "gzip, deflate",
   "Content-Length": "170",
   "Content-Type": "multipart/form-data; boundary=f2837238286fe40e32080aa7e172b
e4f",
  "Host": "httpbin.org",
  "User-Agent": "python-requests/2.22.0"
},
  "json": null,
  "origin": "117.223.63.135, 117.223.63.135",
  "url": "https://httpbin.org/post"
}

Yêu cầu - Làm việc với Cookie

Chương này sẽ thảo luận về cách xử lý cookie. Bạn có thể lấy cookie cũng như gửi cookie của mình trong khi gọi URL bằng thư viện yêu cầu.

Url, https://jsonplaceholder.typicode.com/users khi truy cập trong trình duyệt, chúng tôi có thể nhận được thông tin chi tiết về cookie như được hiển thị bên dưới−

Bạn có thể đọc các cookie như hình dưới đây−

Thí dụ

import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users')
print(getdata.cookies["__cfduid"])

Đầu ra

E:\prequests>python makeRequest.py
d1733467caa1e3431fb7f768fa79ed3741575094848

Bạn cũng có thể gửi cookie khi chúng tôi đưa ra yêu cầu.

Thí dụ

import requests
cookies = dict(test='test123')
getdata = requests.get('https://httpbin.org/cookies',cookies=cookies)
print(getdata.text)

Đầu ra

E:\prequests>python makeRequest.py
{
   "cookies": {
   "test": "test123"
}
}

Yêu cầu - Xử lý lỗi

Chương này sẽ thảo luận về cách xử lý các lỗi sắp xảy ra khi làm việc với thư viện yêu cầu Http. Luôn luôn là một thực tiễn tốt để quản lý lỗi cho tất cả các trường hợp có thể xảy ra.

Lỗi ngoại lệ

Mô-đun yêu cầu đưa ra các loại ngoại lệ lỗi sau

ConnectionError- Điều này sẽ được nâng lên, nếu có bất kỳ lỗi kết nối nào. Ví dụ, mạng bị lỗi, lỗi DNS nên thư viện Yêu cầu sẽ nâng cao ngoại lệ ConnectionError.

Response.raise_for_status()- Dựa trên mã trạng thái tức là 401, 404 nó sẽ tăng HTTPError cho url được yêu cầu.

HTTPError- Lỗi này sẽ xuất hiện khi có phản hồi không hợp lệ cho yêu cầu được thực hiện.

Timeout- Lỗi xảy ra do thời gian chờ cho URL được yêu cầu.

TooManyRedirects- Nếu vượt quá giới hạn cho các chuyển hướng tối đa hơn nó sẽ làm tăng lỗi TooManyRedirects.

Thí dụ

Đây là một ví dụ về lỗi được hiển thị cho thời gian chờ−

import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users',timeout=0.001)
print(getdata.text)

Đầu ra

raise ConnectTimeout(e, request=request)
requests.exceptions.ConnectTimeout: HTTPSConnectionPool(host='jsonplaceholder.ty
picode.com', port=443): Max retries exceeded with url: /users (Caused by Connect
TimeoutError(<urllib3.connection.VerifiedHTTPSConnection object at
0x000000B02AD
E76A0>, 'Connection to jsonplaceholder.typicode.com timed out. (connect timeout= 0.001)'))

Yêu cầu - Xử lý hết thời gian chờ

Thời gian chờ có thể được thêm dễ dàng vào URL bạn đang yêu cầu. Điều đó xảy ra là bạn đang sử dụng URL của bên thứ ba và chờ phản hồi. Luôn luôn là một phương pháp hay để đưa ra thời gian chờ trên URL, vì chúng tôi có thể muốn URL phản hồi trong khoảng thời gian nếu có phản hồi hoặc lỗi. Không làm như vậy, có thể khiến yêu cầu đó phải chờ vô thời hạn.

Chúng tôi có thể cung cấp thời gian chờ cho URL bằng cách sử dụng tham số thời gian chờ và giá trị được chuyển bằng giây như được hiển thị trong ví dụ bên dưới−

Thí dụ

import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users',timeout=0.001)
print(getdata.text)

Đầu ra

raise ConnectTimeout(e, request=request)
requests.exceptions.ConnectTimeout: HTTPSConnectionPool(host='jsonplaceholder.ty
picode.com', port=443): Max retries exceeded with url: /users (Caused by Connect
TimeoutError(<urllib3.connection.VerifiedHTTPSConnection object at 0x000000B02AD
E76A0>, 'Connection to jsonplaceholder.typicode.com timed out. (connect timeout=
0.001)'))

Thời gian chờ được đưa ra như sau:

getdata = requests.get('https://jsonplaceholder.typicode.com/users',timeout=0.001)

Việc thực thi ném ra lỗi thời gian chờ kết nối như được hiển thị trong đầu ra. Thời gian chờ được đưa ra là 0,001, không thể yêu cầu lấy lại phản hồi và tạo ra lỗi. Bây giờ, chúng tôi sẽ tăng thời gian chờ và kiểm tra.

Thí dụ

import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users',timeout=1.000)
print(getdata.text)

Đầu ra

E:\prequests>python makeRequest.py
[
 {
   "id": 1,
   "name": "Leanne Graham",
   "username": "Bret",
   "email": "[email protected]",
   "address": {
   "street": "Kulas Light",
   "suite": "Apt. 556",
   "city": "Gwenborough",
   "zipcode": "92998-3874",
   "geo": {
   "lat": "-37.3159",
   "lng": "81.1496"
   }
  },
   "phone": "1-770-736-8031 x56442",
   "website": "hildegard.org",
   "company": {
   "name": "Romaguera-Crona",
   "catchPhrase": "Multi-layered client-server neural-net",
   "bs": "harness real-time e-markets"
 }

Với thời gian chờ 1 giây, chúng tôi có thể nhận được phản hồi cho URL được yêu cầu.

Yêu cầu - Xử lý chuyển hướng

Chương này sẽ xem xét cách thư viện Yêu cầu xử lý trường hợp chuyển hướng url.

Thí dụ

import requests
getdata = requests.get('http://google.com/')
print(getdata.status_code)
print(getdata.history)

Url− http://google.com sẽ được chuyển hướng bằng mã trạng thái 301 (Đã chuyển vĩnh viễn) đến https://www.google.com/. Việc chuyển hướng sẽ được lưu trong lịch sử.

Đầu ra

Khi đoạn mã trên được thực thi, chúng ta nhận được kết quả sau:

E:\prequests>python makeRequest.py
200
[<Response [301]>]

Bạn có thể ngừng chuyển hướng URL bằng cách sử dụng allow_redirects=False. Nó có thể được thực hiện trên các phương thức GET, POST, OPTIONS, PUT, DELETE, PATCH được sử dụng.

Thí dụ

Đây là một ví dụ tương tự.

import requests
getdata = requests.get('http://google.com/', allow_redirects=False)
print(getdata.status_code)
print(getdata.history)
print(getdata.text)

Bây giờ nếu bạn kiểm tra đầu ra, chuyển hướng sẽ không được phép và sẽ nhận được mã trạng thái là 301.

Đầu ra

E:\prequests>python makeRequest.py
301
[]
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>

Yêu cầu - Lịch sử xử lý

Bạn có thể lấy lịch sử của một URL nhất định bằng cách sử dụng response.history. Nếu URL đã cho có bất kỳ chuyển hướng nào, chuyển hướng đó sẽ được lưu trữ trong lịch sử.

Đối với lịch sử

import requests
getdata = requests.get('http://google.com/')
print(getdata.status_code)
print(getdata.history)

Đầu ra

E:\prequests>python makeRequest.py
200
[<Response [301]>]

Các response.historythuộc tính sẽ có thông tin chi tiết về các đối tượng phản hồi đã được thực hiện dựa trên yêu cầu. Các giá trị hiện tại sẽ được sắp xếp từ giá trị cũ nhất đến mới nhất. Cácresponse.history thuộc tính theo dõi tất cả chuyển hướng được thực hiện trên URL được yêu cầu.

Yêu cầu - Xử lý phiên

Để duy trì dữ liệu giữa các yêu cầu, bạn cần các phiên. Vì vậy, nếu cùng một máy chủ được gọi đi gọi lại, bạn có thể sử dụng lại kết nối TCP để cải thiện hiệu suất. Bây giờ chúng ta hãy xem, cách duy trì cookie trên các yêu cầu được thực hiện bằng các phiên.

Thêm cookie bằng phiên

import requests
req = requests.Session()
cookies = dict(test='test123')
getdata = req.get('https://httpbin.org/cookies',cookies=cookies)
print(getdata.text)

Đầu ra

E:\prequests>python makeRequest.py
{
   "cookies": {
   "test": "test123"
}
}

Sử dụng phiên, bạn có thể bảo vệ dữ liệu cookie theo các yêu cầu. Cũng có thể chuyển dữ liệu tiêu đề bằng cách sử dụng phiên như hình dưới đây−

Thí dụ

import requests
req = requests.Session()
req.headers.update({'x-user1': 'ABC'})
headers = {'x-user2': 'XYZ'}
getdata = req.get('https://httpbin.org/headers', headers=headers)    
print(getdata.headers)

Yêu cầu - Chứng nhận SSL

Chứng chỉ SSL là một tính năng bảo mật đi kèm với các url an toàn. Khi bạn sử dụng thư viện Yêu cầu, nó cũng xác minh chứng chỉ SSL cho URL https được cung cấp. Xác minh SSL được bật theo mặc định trong mô-đun yêu cầu và sẽ gây ra lỗi nếu chứng chỉ không có.

Làm việc với URL an toàn

Sau đây là ví dụ về cách làm việc với URL an toàn−

import requests
getdata = requests.get(https://jsonplaceholder.typicode.com/users)
print(getdata.text)

Đầu ra

E:\prequests>python makeRequest.py
[
   {
   "id": 1,
   "name": "Leanne Graham",
   "username": "Bret",
   "email": "[email protected]",
   "address": {
   "street": "Kulas Light",
   "suite": "Apt. 556",
   "city": "Gwenborough",
   "zipcode": "92998-3874",
   "geo": {
   "lat": "-37.3159",
   "lng": "81.1496"
   }
  },
   "phone": "1-770-736-8031 x56442",
   "website": "hildegard.org",
   "company": {
   "name": "Romaguera-Crona",
   "catchPhrase": "Multi-layered client-server neural-net",
   "bs": "harness real-time e-markets"
   }
  }
]

Chúng tôi dễ dàng nhận được phản hồi từ URL https ở trên và đó là do mô-đun yêu cầu có thể xác minh chứng chỉ SSL.

Bạn có thể tắt xác minh SSL bằng cách chỉ cần thêm verify = False như được hiển thị trong ví dụ bên dưới.

Thí dụ

import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users', verify=False)
print(getdata.text)

Bạn sẽ nhận được kết quả đầu ra, nhưng nó cũng sẽ đưa ra một thông báo cảnh báo rằng, chứng chỉ SSL chưa được xác minh và bạn nên thêm xác minh chứng chỉ.

Đầu ra

E:\prequests>python makeRequest.py
connectionpool.py:851: InsecureRequestWarning: Unverified HTTPS request is being
made. Adding certificate verification is strongly advised. See: https://urllib3
   .readthedocs.io/en/latest/advanced-usage.htm  l#ssl-warnings
 InsecureRequestWarning)
[
 {
  "id": 1,
   "name": "Leanne Graham",
   "username": "Bret", 
   "email": "[email protected]",
   "address": {
   "street": "Kulas Light",
   "suite": "Apt. 556",
   "city": "Gwenborough",
   "zipcode": "92998-3874",
   "geo": {
   "lat": "-37.3159",
   "lng": "81.1496"
   }
  },
   "phone": "1-770-736-8031 x56442",
   "website": "hildegard.org",
   "company": {
   "name": "Romaguera-Crona",
   "catchPhrase": "Multi-layered   client-server neural-net",
   "bs": "harness real-time e-markets"
  }
 }
]

Bạn cũng có thể xác minh chứng chỉ SSL bằng cách lưu trữ nó ở cuối và cung cấp đường dẫn bằng verify param như hình dưới đây.

Thí dụ

import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users', verify='C:\Users\AppData\Local\certificate.txt')
print(getdata.text)

Đầu ra

E:\prequests>python makeRequest.py
[
  {
   "id": 1,
   "name": "Leanne Graham",
   "username": "Bret",
   "email": "[email protected]",
   "address": {
   "street": "Kulas Light",
   "suite": "Apt. 556",
   "city": "Gwenborough",
   "zipcode": "92998-3874",
   "geo": {
   "lat": "-37.3159",
   "lng": "81.1496"
   }
  },
   "phone": "1-770-736-8031 x56442",
   "website": "hildegard.org",
   "company": {
   "name": "Romaguera-Crona",
   "catchPhrase": "Multi-layered   client-server neural-net",
   "bs": "harness real-time e-markets"
   }
  }
]

Yêu cầu - Xác thực

Chương này sẽ thảo luận về các loại xác thực có sẵn trong mô-đun Yêu cầu.

Chúng ta sẽ thảo luận về những điều sau

  • Làm việc xác thực trong các yêu cầu HTTP

  • Xác thực cơ bản

  • Xác thực thông báo

  • Xác thực OAuth2

Làm việc xác thực trong các yêu cầu HTTP

Xác thực HTTP ở phía máy chủ yêu cầu một số thông tin xác thực như tên người dùng, mật khẩu khi máy khách yêu cầu URL. Đây là bảo mật bổ sung cho yêu cầu và phản hồi được trao đổi giữa máy khách và máy chủ.

Từ phía máy khách, các thông tin xác thực bổ sung này tức là tên người dùng và mật khẩu có thể được gửi trong tiêu đề, sau này ở phía máy chủ sẽ được xác thực. Phản hồi sẽ chỉ được gửi từ phía máy chủ khi xác thực hợp lệ.

Thư viện yêu cầu có xác thực được sử dụng phổ biến nhất trong request.auth , đó là Xác thực cơ bản ( HTTPBasicAuth ) và Xác thực thông báo ( HTTPDigestAuth ).

Xác thực cơ bản

Đây là hình thức cung cấp xác thực đơn giản nhất cho máy chủ. Để làm việc với xác thực cơ bản, chúng tôi sẽ sử dụng lớp HTTPBasicAuth có sẵn với thư viện yêu cầu.

Thí dụ

Đây là một ví dụ làm việc về cách sử dụng nó.

import requests
from requests.auth import HTTPBasicAuth
response_data = requests.get('httpbin.org/basic-auth/admin/admin123', auth=HTTPDigestAuth('admin', 'admin123'))
print(response_data.text)

Chúng tôi đang gọi url, https://httpbin.org/basic-auth/admin/admin123với người dùng là quản trị viên và mật khẩu là admin123 .

Vì vậy, URL này sẽ không hoạt động nếu không có xác thực, tức là người dùng và mật khẩu. Khi bạn cung cấp xác thực bằng cách sử dụng thông số xác thực, thì chỉ máy chủ mới đưa ra phản hồi.

Đầu ra

E:\prequests>python makeRequest.py
{
   "authenticated": true,
   "user": "admin"
}

Xác thực thông báo

Đây là một hình thức xác thực khác có sẵn với các yêu cầu. Chúng tôi sẽ sử dụng lớp HTTPDigestAuth từ các yêu cầu.

Thí dụ

import requests
from requests.auth import HTTPDigestAuth
response_data = requests.get('https://httpbin.org/digest-auth/auth/admin/admin123>, auth=HTTPDigestAuth('admin', 'admin123'))
print(response_data.text)

Đầu ra

E:\prequests>python makeRequest.py
{
   "authenticated": true,
   "user": "admin"
}

Xác thực OAuth2

Để sử dụng Xác thực OAuth2, chúng tôi cần thư viện “request_oauth2”. Để cài đặt “request_oauth2”, hãy làm như sau−

pip install requests_oauth2

Màn hình hiển thị trong thiết bị đầu cuối của bạn trong khi cài đặt sẽ như hình dưới đây−

E:\prequests>pip install requests_oauth2
Collecting requests_oauth2
Downloading https://files.pythonhosted.org/packages/52/dc/01c3c75e6e7341a2c7a9
71d111d7105df230ddb74b5d4e10a3dabb61750c/requests-oauth2-0.3.0.tar.gz
Requirement already satisfied: requests in c:\users\xyz\appdata\local\programs
\python\python37\lib\site-packages (from requests_oauth2) (2.22.0)
Requirement already satisfied: six in c:\users\xyz\appdata\local\programs\pyth
on\python37\lib\site-packages (from requests_oauth2) (1.12.0)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in c:\use
rs\xyz\appdata\local\programs\python\python37\lib\site-packages (from requests
->requests_oauth2) (1.25.3)
Requirement already satisfied: certifi>=2017.4.17 in c:\users\xyz\appdata\loca
l\programs\python\python37\lib\site-packages (from requests->requests_oauth2) (2
019.3.9)
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in c:\users\xyz\appdata\l
ocal\programs\python\python37\lib\site-packages (from requests->requests_oauth2)
(3.0.4)
Requirement already satisfied: idna<2.9,>=2.5 in c:\users\xyz\appdata\local\pr
ograms\python\python37\lib\site-packages (from requests->requests_oauth2) (2.8)
Building wheels for collected packages: requests-oauth2
Building wheel for requests-oauth2 (setup.py) ... done
Stored in directory: C:\Users\xyz\AppData\Local\pip\Cache\wheels\90\ef\b4\43
3743cbbc488463491da7df510d41c4e5aa28213caeedd586
Successfully built requests-oauth2

Chúng tôi đã cài đặt xong “request-oauth2”. Để sử dụng API của Google, Twitter, chúng tôi cần có sự đồng ý của nó và điều này cũng được thực hiện bằng xác thực OAuth2.

Để xác thực OAuth2, chúng tôi sẽ cần ID ứng dụng khách và Khóa bí mật. Chi tiết về cách lấy nó, được đề cập trênhttps://developers.google.com/identity/protocols/OAuth2.

Sau đó, đăng nhập vào Bảng điều khiển API của Google có sẵn tại https://console.developers.google.com/và lấy id khách hàng và khóa bí mật.

Thí dụ

Đây là một ví dụ về cách sử dụng "request-oauth2".

import requests
from requests_oauth2.services import GoogleClient
google_auth = GoogleClient(
   client_id="xxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
redirect_uri="http://localhost/auth/success.html",
)
a = google_auth.authorize_url(
   scope=["profile", "email"],
   response_type="code",
)
res = requests.get(a)
print(res.url)

Chúng tôi sẽ không thể chuyển hướng đến URL đã cho, vì nó cần đăng nhập vào tài khoản Gmail, nhưng ở đây, bạn sẽ thấy từ ví dụ, rằng google_auth hoạt động và URL được ủy quyền được cung cấp.

Đầu ra

E:\prequests>python oauthRequest.py
https://accounts.google.com/o/oauth2/auth?redirect_uri=
http%3A%2F%2Flocalhost%2Fauth%2Fsuccess.html&
client_id=xxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com&
scope=profile+email&response_type=code

Yêu cầu - Móc sự kiện

Chúng tôi có thể thêm sự kiện vào URL được yêu cầu bằng cách sử dụng móc sự kiện. Trong ví dụ dưới đây, chúng ta sẽ thêm một hàm gọi lại sẽ được gọi khi có phản hồi.

Thí dụ

Để thêm callback, chúng ta cần sử dụng hooks param như thể hiện trong ví dụ bên dưới−

mport requests
def printData(r, *args, **kwargs):
   print(r.url)
   print(r.text)
getdata = requests.get('https://jsonplaceholder.typicode.com/users', 
hooks={'response': printData})

Đầu ra

E:\prequests>python makeRequest.py
https://jsonplaceholder.typicode.com/users
[
{
   "id": 1,
   "name": "Leanne Graham",
   "username": "Bret",
   "email": "[email protected]",
   "address": {
   "street": "Kulas Light",
   "suite": "Apt. 556",
   "city": "Gwenborough",
   "zipcode": "92998-3874",
   "geo": {
    "lat": "-37.3159",
    "lng": "81.1496"
   }
  }, 
   "phone": "1-770-736-8031 x56442",
   "website": "hildegard.org",
   "company": {
   "name": "Romaguera-Crona",
   "catchPhrase": "Multi-layered client-server neural-net",
   "bs": "harness real-time e-markets"
   }
  }
]

Bạn cũng có thể gọi nhiều hàm gọi lại như hình dưới đây−

Thí dụ

import requests
def printRequestedUrl(r, *args, **kwargs):
   print(r.url)
def printData(r, *args, **kwargs):
   print(r.text)
getdata = requests.get('https://jsonplaceholder.typicode.com/users', hooks={'response': [printRequestedUrl, printData]})

Đầu ra

E:\prequests>python makeRequest.py
https://jsonplaceholder.typicode.com/users
[
  {
   "id": 1,
   "name": "Leanne Graham",
   "username": "Bret",
   "email": "[email protected]",
   "address": {
   "street": "Kulas Light",
   "suite": "Apt. 556",
   "city": "Gwenborough",
   "zipcode": "92998-3874",
   "geo": {
   "lat": "-37.3159",
   "lng": "81.1496"
 }
  },
   "phone": "1-770-736-8031 x56442",
   "website": "hildegard.org",
   "company": {
   "name": "Romaguera-Crona",
   "catchPhrase": "Multi-layered client-server neural-net",
    "bs": "harness real-time e-markets"
   }
  }
]

Bạn cũng có thể thêm hook vào Session được tạo như hình bên dưới−

Thí dụ

import requests
def printData(r, *args, **kwargs):
print(r.text)
s = requests.Session()
s.hooks['response'].append(printData)
s.get('https://jsonplaceholder.typicode.com/users')

Đầu ra

E:\prequests>python makeRequest.py
[
 {
   "id": 1,
   "name": "Leanne Graham",
   "username": "Bret",
   "email": "[email protected]",
   "address": {
   "street": "Kulas Light",
   "suite": "Apt. 556",
   "city": "Gwenborough",
   "zipcode": "92998-3874",
   "geo": {
   "lat": "-37.3159",
   "lng": "81.1496"
   }
  },
   "phone": "1-770-736-8031 x56442",
   "website": "hildegard.org",
   "company": {
   "name": "Romaguera-Crona",
   "catchPhrase": "Multi-layered client-server neural-net",
   "bs": "harness real-time e-markets"
   }
  }
]

Yêu cầu - Proxy

Cho đến nay, chúng tôi đã thấy các máy khách trực tiếp kết nối và nói chuyện với máy chủ. Sử dụng proxy, tương tác xảy ra như sau

  • Máy khách gửi yêu cầu tới proxy.

  • Proxy gửi yêu cầu đến máy chủ.

  • Máy chủ sẽ gửi lại phản hồi tới proxy.

  • Proxy sẽ gửi phản hồi lại cho máy khách.

Sử dụng Http-proxy là bảo mật bổ sung được chỉ định để quản lý việc trao đổi dữ liệu giữa máy khách và máy chủ. Các thư viện yêu cầu cũng có cung cấp để xử lý proxy, bằng cách sử dụng param proxy như được hiển thị bên dưới−

Thí dụ

import requests
proxies = {
'http': 'http://localhost:8080'
}
res = requests.get('http://httpbin.org/', proxies=proxies)
print(res.status_code)

Yêu cầu sẽ chuyển đến ('http://localhost:8080 URL.

Đầu ra

200

Yêu cầu - Web Scraping sử dụng Yêu cầu

Chúng tôi đã thấy cách chúng tôi có thể lấy dữ liệu từ một URL nhất định bằng cách sử dụng thư viện yêu cầu python. Chúng tôi sẽ cố gắng loại bỏ dữ liệu từ trang web củaTutorialspoint có sẵn tại https://www.tutorialspoint.com/tutorialslibrary.htm sử dụng như sau

  • Thư viện yêu cầu

  • Thư viện súp tuyệt đẹp từ trăn

Chúng tôi đã cài đặt thư viện Yêu cầu, bây giờ chúng ta hãy cài đặt gói súp Beautiful. Đây là trang web chính thức củabeautiful soup có sẵn tại https://www.crummy.com/software/BeautifulSoup/bs4/doc/ trong trường hợp bạn muốn khám phá thêm một số chức năng của súp đẹp.

Cài đặt Beautifulsoup

Chúng ta sẽ xem cách cài đặt Beautiful Soup bên dưới−

E:\prequests>pip install beautifulsoup4
Collecting beautifulsoup4
Downloading https://files.pythonhosted.org/packages/3b/c8/a55eb6ea11cd7e5ac4ba
cdf92bac4693b90d3ba79268be16527555e186f0/beautifulsoup4-4.8.1-py3-none-any.whl (
101kB)
|████████████████████████████████| 102kB 22kB/s
Collecting soupsieve>=1.2 (from beautifulsoup4)
Downloading https://files.pythonhosted.org/packages/81/94/03c0f04471fc245d08d0
a99f7946ac228ca98da4fa75796c507f61e688c2/soupsieve-1.9.5-py2.py3-none-any.whl
Installing collected packages: soupsieve, beautifulsoup4
Successfully installed beautifulsoup4-4.8.1 soupsieve-1.9.5

Bây giờ chúng tôi đã cài đặt thư viện yêu cầu python và súp đẹp.

Bây giờ chúng ta hãy viết mã, mã này sẽ loại bỏ dữ liệu từ URL đã cho.

rút trích nội dung trang web

import requests
from bs4 import BeautifulSoup
res = requests.get('https://www.tutorialspoint.com/tutorialslibrary.htm')
print("The status code is ", res.status_code)
print("\n")
soup_data = BeautifulSoup(res.text, 'html.parser')
print(soup_data.title)
print("\n")
print(soup_data.find_all('h4'))

Sử dụng thư viện yêu cầu, chúng tôi có thể tìm nạp nội dung từ URL được cung cấp và thư viện súp đẹp giúp phân tích cú pháp nó và tìm nạp chi tiết theo cách chúng tôi muốn.

Bạn có thể sử dụng thư viện súp tuyệt đẹp để tìm nạp dữ liệu bằng thẻ Html, lớp, id, bộ chọn css và nhiều cách khác. Sau đây là kết quả mà chúng tôi nhận được trong đó chúng tôi đã in tiêu đề của trang và tất cả các thẻ h4 trên trang.

Đầu ra

E:\prequests>python makeRequest.py
The status code is 200
<title>Free Online Tutorials and Courses</title>
[<h4>Academic</h4>, <h4>Computer Science</h4>, <h4>Digital Marketing</h4>, <h4>M
onuments</h4>,<h4>Machine Learning</h4>, <h4>Mathematics</h4>, <h4>Mobile Devel
opment</h4>,<h4>SAP</h4>, <h4>Software Quality</h4>, <h4>Big Data & Analyti
cs</h4>, <h4>Databases</h4>, <h4>Engineering Tutorials</h4>, <h4>Mainframe Devel
opment</h4>, <h4>Microsoft Technologies</h4>, <h4>Java Technologies</h4>,<h4>XM
L Technologies</h4>, <h4>Python Technologies</h4>, <h4>Sports</h4>, <h4>Computer
Programming</h4>,<h4>DevOps</h4>, <h4>Latest Technologies</h4>, <h4>Telecom</h4>, <h4>Exams Syllabus</h4>, <h4>UPSC IAS Exams</h4>, <h4>Web Development</h4>,
<h4>Scripts</h4>, <h4>Management</h4>,<h4>Soft Skills</h4>, <h4>Selected Readin
g</h4>, <h4>Misc</h4>]