Làm cách nào để gửi dữ liệu trong yêu cầu POST Python?

Trong bài viết hướng dẫn Yêu cầu này, bạn sẽ tìm hiểu tất cả những kiến ​​thức cơ bản về mô-đun yêu cầu bằng Python để giúp bạn bắt đầu sử dụng Yêu cầu. Chúng tôi sẽ đề cập đến các chủ đề sau trong blog này

  • Mô-đun Yêu cầu là gì?
  • Cài đặt mô-đun Yêu cầu
  • Thực hiện yêu cầu GET
  • Tải xuống hình ảnh có yêu cầu
  • Thực hiện yêu cầu POST
  • Gửi cookie và tiêu đề
  • Đối tượng phiên
  • Phần kết luận

Chúng ta hãy bắt đầu blog “Hướng dẫn về Yêu cầu” này bằng cách kiểm tra xem Mô-đun Yêu cầu thực sự là gì

Mô-đun yêu cầu là gì?

Yêu cầu là một mô-đun Python mà bạn có thể sử dụng để gửi tất cả các loại yêu cầu HTTP. Đây là một thư viện dễ sử dụng với nhiều tính năng khác nhau, từ truyền tham số trong URL đến gửi tiêu đề tùy chỉnh và Xác minh SSL. Trong hướng dẫn này, bạn sẽ học cách sử dụng thư viện này để gửi các yêu cầu HTTP đơn giản bằng Python

Yêu cầu cho phép bạn gửi HTTP/1. 1 yêu cầu. Bạn có thể thêm tiêu đề, dữ liệu biểu mẫu, tệp nhiều phần và tham số bằng từ điển Python đơn giản và truy cập dữ liệu phản hồi theo cách tương tự

Cài đặt mô-đun Yêu cầu

Để cài đặt yêu cầu, chỉ cần

$ pip install requests

Hoặc, nếu bạn hoàn toàn phải

$ easy_install requests
Đưa ra yêu cầu GET

Việc gửi yêu cầu HTTP bằng cách sử dụng Yêu cầu khá đơn giản. Bạn bắt đầu bằng cách nhập mô-đun và sau đó thực hiện yêu cầu. Kiểm tra ví dụ

import requests 
req = requests.get('https://www.edureka.co/')

Vì vậy, tất cả các thông tin được lưu trữ ở đâu đó, đúng không?

Có, nó được lưu trữ trong một đối tượng Phản hồi được gọi là req

Ví dụ: giả sử bạn muốn mã hóa một trang web để bạn có thể xác minh hoặc sử dụng nó ở một nơi khác. Điều này có thể được thực hiện bằng cách sử dụng req. thuộc tính mã hóa

Một điểm cộng nữa là bạn cũng có thể trích xuất nhiều tính năng như mã trạng thái chẳng hạn (của yêu cầu). Điều này có thể được thực hiện bằng cách sử dụng req. thuộc tính status_code

req.encoding # returns 'utf-8' 
req.status_code # returns 200

Chúng tôi cũng có thể truy cập các cookie mà máy chủ đã gửi lại. Điều này được thực hiện bằng cách sử dụng req. cookie, đơn giản như vậy. Tương tự, bạn cũng có thể nhận được các tiêu đề phản hồi. Điều này được thực hiện bằng cách sử dụng req. tiêu đề

Xin lưu ý rằng yêu cầu. headers sẽ trả về một từ điển phân biệt chữ hoa chữ thường của các tiêu đề phản hồi. Vì vậy, điều này có nghĩa là gì?

Điều này có nghĩa là yêu cầu. tiêu đề ['Độ dài nội dung'], yêu cầu. tiêu đề ['độ dài nội dung'] và yêu cầu. tất cả các tiêu đề [‘CONTENT-LENGTH’] sẽ trả về giá trị của tiêu đề phản hồi ‘Content-Length’

Chúng tôi cũng có thể kiểm tra xem phản hồi thu được có phải là chuyển hướng HTTP được định dạng tốt (hoặc không) có thể đã được xử lý tự động bằng cách sử dụng lệnh req. thuộc tính is_redirect. Điều này sẽ trả về Đúng hoặc Sai dựa trên phản hồi thu được

Bạn cũng có thể lấy thời gian đã trôi qua giữa việc gửi yêu cầu và nhận lại phản hồi bằng thuộc tính khác. Hãy đoán? . tài sản đã qua

Bạn có nhớ URL mà ban đầu bạn đã chuyển đến hàm get() không?

Và để xem URL phản hồi thực tế, bạn có thể sử dụng lệnh req. thuộc tính url

import requests
req = requests.get('http://www.edureka.co/')

req.encoding # returns 'utf-8'
req.status_code # returns 200
req.elapsed # returns datetime.timedelta(0, 1, 666890)
req.url # returns 'https://edureka.co/'

req.history
# returns [<Response [301]>, <Response [301]>]

req.headers['Content-Type']
# returns 'text/html; charset=utf-8'

Bạn có nghĩ rằng nhận được tất cả thông tin này về trang web là tốt không?

Nếu nội dung bạn đang truy cập là văn bản, bạn luôn có thể sử dụng lệnh req. thuộc tính văn bản để truy cập nó. Xin lưu ý rằng nội dung sau đó chỉ được phân tích cú pháp dưới dạng Unicode. Bạn có thể chuyển mã hóa này để giải mã văn bản này bằng lệnh req. mã hóa thuộc tính như chúng ta đã thảo luận trước đó

Trong trường hợp phản hồi không phải văn bản, bạn có thể truy cập chúng rất dễ dàng. Trên thực tế, nó được thực hiện ở định dạng nhị phân khi bạn sử dụng req. nội dung. Mô-đun này sẽ tự động giải mã gzip và khử mã hóa truyền cho chúng tôi. Điều này có thể rất hữu ích khi bạn đang xử lý trực tiếp các tệp phương tiện. Ngoài ra, bạn cũng có thể truy cập nội dung được mã hóa JSON của phản hồi, đó là nếu nó tồn tại, bằng cách sử dụng lệnh req. hàm json()

Khá đơn giản và rất linh hoạt, phải không?

Ngoài ra, nếu cần, bạn cũng có thể nhận phản hồi thô từ máy chủ chỉ bằng cách sử dụng req. thô. Hãy nhớ rằng bạn sẽ phải chuyển stream=True trong yêu cầu để nhận phản hồi thô theo nhu cầu

Tuy nhiên, một số tệp bạn tải xuống từ internet bằng mô-đun Yêu cầu có thể có kích thước rất lớn, đúng không? . Tuy nhiên, bạn nên tải xuống tệp theo từng phần hoặc khối bằng cách sử dụng phương thức iter_content(chunk_size = 1, decode_unicode = False)

Vì vậy, phương thức này lặp lại dữ liệu phản hồi theo số byte chunk_size cùng một lúc. Và khi stream=True đã được đặt theo yêu cầu, phương pháp này sẽ tránh đọc toàn bộ tệp vào bộ nhớ cùng một lúc chỉ cho các phản hồi lớn

Xin lưu ý rằng tham số chunk_size có thể là số nguyên hoặc Không có. Tuy nhiên, khi được đặt thành giá trị số nguyên, chunk_size xác định số byte sẽ được đọc vào bộ nhớ cùng một lúc

Khi chunk_size được đặt thành Không và luồng được đặt thành True, dữ liệu sẽ được đọc khi nó đến ở bất kỳ kích thước nào của các khối dữ liệu được nhận và khi chúng được nhận. Tuy nhiên, khi chunk_size được đặt thành Không và luồng được đặt thành Sai, tất cả dữ liệu sẽ chỉ được trả về dưới dạng một đoạn dữ liệu duy nhất

Tải xuống hình ảnh bằng cách sử dụng mô-đun yêu cầu

Vì vậy, hãy tải xuống hình ảnh sau đây về một khu rừng trên Pixabay bằng cách sử dụng mô-đun Yêu cầu mà chúng ta đã tìm hiểu về. Đây là hình ảnh thực tế

Đây là mã mà bạn sẽ cần để tải xuống hình ảnh

import requests
req = requests.get('path/to/forest.jpg', stream=True)
req.raise_for_status()
with open('Forest.jpg', 'wb') as fd:
for chunk in req.iter_content(chunk_size=50000):
print('Received a Chunk')
fd.write(chunk)

Lưu ý rằng 'đường dẫn/đến/khu rừng. jpg’ là URL hình ảnh thực tế. Bạn có thể đặt URL của bất kỳ hình ảnh nào khác ở đây để tải xuống một cái gì đó khác. Đây chỉ là một ví dụ được hiển thị ở đây và tệp hình ảnh đã cho có kích thước khoảng 185kb và bạn đã đặt chunk_size thành 50.000 byte

Điều này có nghĩa là thông báo “Received a Chunk” sẽ được in bốn lần trong thiết bị đầu cuối. Kích thước của đoạn cuối cùng sẽ chỉ là 39350 byte vì phần của tệp vẫn được nhận sau ba lần lặp đầu tiên là 39350 byte

Yêu cầu cũng cho phép bạn chuyển tham số trong URL. Điều này đặc biệt hữu ích khi bạn đang tìm kiếm một trang web cho một số kết quả như hướng dẫn hoặc hình ảnh cụ thể. Bạn có thể cung cấp các chuỗi truy vấn này dưới dạng từ điển các chuỗi bằng cách sử dụng từ khóa params trong yêu cầu GET. Kiểm tra ví dụ dễ dàng này

import requests

query = {'q': 'Forest', 'order': 'popular', 'min_width': '800', 'min_height': '600'}
req = requests.get('https://pixabay.com/en/photos/', params=query)

req.url
# returns 'https://pixabay.com/en/photos/?order=popular&min_height=600&q=Forest&min_width=800'

Tiếp theo trong blog “Hướng dẫn về yêu cầu” này, chúng ta hãy xem cách chúng ta có thể thực hiện một yêu cầu POST

Thực hiện yêu cầu POST

Thực hiện một yêu cầu POST cũng dễ dàng như thực hiện các yêu cầu GET. Bạn chỉ cần sử dụng chức năng post() thay vì get()

Điều này có thể hữu ích khi bạn tự động gửi biểu mẫu. Ví dụ: đoạn mã sau sẽ tải xuống toàn bộ trang Wikipedia về Công nghệ nano và lưu nó trên PC của bạn

import requests
req = requests.post('https://en.wikipedia.org/w/index.php', data = {'search':'Nanotechnology'})
req.raise_for_status()
with open('Nanotechnology.html', 'wb') as fd:
for chunk in req.iter_content(chunk_size=50000):
fd.write(chunk)
Gửi cookie và tiêu đề

Như đã đề cập trước đây, bạn có thể truy cập cookie và tiêu đề mà máy chủ gửi lại cho bạn bằng cách sử dụng req. cookie và yêu cầu. tiêu đề. Yêu cầu cũng cho phép bạn gửi cookie và tiêu đề tùy chỉnh của riêng mình kèm theo yêu cầu. Điều này có thể hữu ích khi bạn muốn, giả sử, đặt tác nhân người dùng tùy chỉnh cho yêu cầu của bạn

Để thêm các tiêu đề HTTP vào một yêu cầu, bạn chỉ cần chuyển chúng trong một lệnh tới tham số tiêu đề. Tương tự, bạn cũng có thể gửi cookie của riêng mình đến máy chủ bằng lệnh được chuyển đến tham số cookie

________số 8

Cookies cũng có thể được chuyển trong Cookie Jar. Chúng cung cấp một giao diện hoàn chỉnh hơn để cho phép bạn sử dụng các cookie đó trên nhiều đường dẫn

Kiểm tra ví dụ này dưới đây

import requests

jar = requests.cookies.RequestsCookieJar()
jar.set('first_cookie', 'first', domain='httpbin.org', path='/cookies')
jar.set('second_cookie', 'second', domain='httpbin.org', path='/extra')
jar.set('third_cookie', 'third', domain='httpbin.org', path='/cookies')

url = 'http://httpbin.org/cookies'
req = requests.get(url, cookies=jar)

req.text

# returns '{ "cookies": { "first_cookie": "first", "third_cookie": "third" }}'

Tiếp theo trên blog "Hướng dẫn yêu cầu" này, chúng ta hãy xem các đối tượng phiên

Đối tượng phiên

Đôi khi, việc bảo toàn các tham số nhất định trên nhiều yêu cầu sẽ rất hữu ích. Đối tượng Session thực hiện chính xác điều đó. Ví dụ: nó sẽ duy trì dữ liệu cookie trên tất cả các yêu cầu được thực hiện bằng cùng một phiên

Đối tượng Phiên sử dụng tổng hợp kết nối của urllib3. Điều này có nghĩa là kết nối TCP cơ bản sẽ được sử dụng lại cho tất cả các yêu cầu được thực hiện cho cùng một máy chủ

Điều này có thể tăng đáng kể hiệu suất. Bạn cũng có thể sử dụng các phương thức của đối tượng Yêu cầu với đối tượng Phiên

Phiên cũng hữu ích khi bạn muốn gửi cùng một dữ liệu trên tất cả các yêu cầu. Ví dụ: nếu bạn quyết định gửi cookie hoặc tiêu đề tác nhân người dùng với tất cả các yêu cầu tới một miền nhất định, bạn có thể sử dụng các đối tượng Phiên

Đây là một ví dụ

$ easy_install requests
0

Như bạn có thể thấy, cookie phiên “lần truy cập tháng” được gửi cùng với cả ba yêu cầu. Tuy nhiên, cookie "lần truy cập năm" chỉ được gửi trong yêu cầu thứ hai. Cũng không có đề cập đến cookie “năm truy cập” trong yêu cầu thứ ba. Điều này xác nhận thực tế rằng cookie hoặc dữ liệu khác được đặt trên các yêu cầu riêng lẻ sẽ không được gửi cùng với các yêu cầu phiên khác

Phần kết luận

Các khái niệm được thảo luận trong hướng dẫn này sẽ giúp bạn thực hiện các yêu cầu cơ bản tới máy chủ bằng cách chuyển các tiêu đề, cookie hoặc chuỗi truy vấn cụ thể

Điều này sẽ rất hữu ích khi bạn đang cố gắng tìm kiếm thông tin trên một số trang web. Giờ đây, bạn cũng có thể tự động tải xuống các tệp nhạc và hình nền từ các trang web khác nhau khi bạn đã tìm ra mẫu trong URL

Tôi hy vọng bạn thích bài đăng này trên Hướng dẫn yêu cầu. Nếu bạn muốn xem thêm các bài viết về các công nghệ đang thịnh hành nhất trên thị trường như Trí tuệ nhân tạo, DevOps, Ethical Hacking, thì bạn có thể tham khảo trang web chính thức của Edureka

Hãy tìm các bài viết khác trong loạt bài này sẽ giải thích nhiều khía cạnh khác của Python và Khoa học dữ liệu

Làm cách nào để gửi dữ liệu biểu mẫu trong yêu cầu POST Python?

Để đăng dữ liệu biểu mẫu HTML lên máy chủ ở định dạng được mã hóa URL bằng Python, bạn cần phải thực hiện yêu cầu HTTP POST tới máy chủ và cung cấp dữ liệu biểu mẫu HTML trong phần thân . Bạn cũng cần chỉ định loại dữ liệu bằng cách sử dụng Content-Type. tiêu đề yêu cầu ứng dụng/x-www-form-urlencoded. . You also need to specify the data type using the Content-Type: application/x-www-form-urlencoded request header.

Chúng tôi có thể gửi dữ liệu bằng yêu cầu POST không?

Dữ liệu bạn gửi trong yêu cầu POST phải tuân thủ các yêu cầu định dạng cụ thể . Bạn chỉ có thể gửi các loại nội dung sau trong yêu cầu POST tới Máy chủ phương tiện. ứng dụng/x-www-form-urlencoded. nhiều phần/biểu mẫu dữ liệu.