Toidicode.com

Toidicode.com

BASIC TO ADVANCE

Bài 10: Gửi request trong Python với Requets module

Tiếp tục với series bài này mình sẽ giới thiệu với mọi người về requests module giúp mọi người có thể gửi request một cách đơn giản nhất trong Python.

Vì module này hỗ trợ chúng ta gửi request rất đa dạng nên mình chỉ trình bày những gì hay dùng nhất thôi, còn các bạn muốn xem chi tiết thì có thể lên trang chủ của nó để xem.

1, Requests module là gì?

Requests module là một thư viện hỗ trợ chúng ta có thể gửi bất kỳ một loại request HTTP nào một cách đơn giản nhất. Và tác giả của module này chính là Kenneth Reitz tác giả của các module đơn giản mà rất thần thánh trong giới Python :D.

Module này hỗ trợ cả python 2 và 3 nhưng Python 3 thì sẽ hoàn hảo hơn.

Trong bài viết này mình sẽ demo trên Python 3.

2, Cài đặt.

Mặc định thì thư viện này không được install kèm python nên các bạn muốn dùng thì cần phải tải nó. Để install nó thì các bạn chỉ cần chạy lệnh.

pip install requests

Để kiểm tra đã thành công hay chưa thì bạn chỉ cần import module request vào và chạy, nếu không có lỗi gì thì là đã thành công.
VD:

thanhtai@thanhtai_info:~$ python3
Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> 

3, Sử dụng.

Đầu tiên để có thể sử dụng được module này thì bạn cần phải import nó vào đầu chương trình.

import requests

Tạo request.

Để tạo một request các bạn chỉ cần sử dụng theo cú pháp sau:

requests.method(url, params, data, json, headers, cookies, files, auth, timeout, allow_redirects, proxies, verify, stream, cert)
# hoặc
requests.Request(method, url, params, data, json, headers, cookies, files, auth, timeout, allow_redirects, proxies, verify, stream, cert)

Trong đó:

  • method sẽ là phương thức HTTP request mà bạn muốn tạo, các phương thức này có thể là: GET, POST,  PUT, PATCH, DELETE và OPTIONS.
  • urlString chứa URL của trang web mà bạn muốn gửi request đến.
  • data là một Dictionary hoặc list of tuples hoặc bytes và bạn muốn gửi kèm trong body của request. Tham số này có thể bỏ trống.
  • json tương tự như data, nhưng kiểu dữ liệu là JSON serializable Python object. Tham số này có thể bỏ trống.
  • headers là một Dictionary chứa các HTTP header mà bạn muốn gửi kèm request. Tham số này có thể bỏ trống.
  • cookies là một Dictionary hoặc CookieJar Object chứa các cookie mà bạn muốn gửi kèm request. Tham số này có thể bỏ trống.
  • files là một Dictionary chứa các files object (file object là result của hàm open()) mà bạn muốn gửi kèm request. Tham số này có thể bỏ trống.
  • auth là một tuple chứa username, password của trang web mà bạn muốn gửi request đến nếu như trang web đó được bảo mật bởi Basic/Digest/Custom authentic. Tham số này có thể bỏ trống.
  • timeout là một float hoặc tubple đơn vị tính bằng giây thiết lập request có thể chờ tối đa là bao nhiêu giây. Tham số này có thể bỏ trống.
  • allow_redirects là một bool thiết lập xem request này có cho phép redirect không, mặc định thì giá trị này bằng True có nghĩa là cho phép. Tham số này có thể bỏ trống.
  • proxies là một Dictionary chứa các protocol để ánh xạ đến proxy của URL. Tham số này có thể bỏ trống.
  • verify  là một bool cấu hình xem có cho phép xác thực TLS hay không, mặc định là True. Tham số này có thể bỏ trống.
  • stream là một bool cấu hình xem dữ liệu trả về có Stream hay không. Tham số này có thể bỏ trống.
  • cert là một String chứa đường dẫn đến ssl client file (.pem). Tham số này có thể bỏ trống.

 Phương thức này sẽ trả về một Response Object.

VD:

  • Gửi một get request đến Toidicode.com:
import requests

requests.get("https://toidicode.com/")

# https://toidicode.com/
  • Gửi một GET request kèm param:
import requests

requests.get("https://toidicode.com/", params= {"post_id": 135})
# hoặc
requests.get("https://toidicode.com/?post_id=135")

#request: https://toidicode.com/?post_id=135
  • Gửi một POST data request kèm se timeout là 3s:
import requests

requests.post("https://toidicode.com/", data={"post_id": 135}, timeout=3)
  • Tạo một POST request upload file lên server:
import requests

requests.post("https://toidicode.com/", files={'image': open('images/logo.png')})

Dữ liệu trả về - Response

Khi tạo request thành công thì dữ liệu trả về sẽ là một Object chứa các thuộc tính và phương thức với chức năng như sau:

Key Type Return Description
apparent_encoding Thuộc tính String  Trả về kiểu mã hóa của dữ liệu trả về
close() Phương thức None Đóng connection
content Thuộc tính String Dữ liệu server trả về
cookies Thuộc tính CookieJar hoặc None Cookies của request server trả về
elapsed Thuộc tính None hoặc timedelta Thời gian thực thi request
encoding Thuộc tính None hoặc String Kiểu mã hóa dữ liệu khi truy cập thuộc tính text
headers Thuộc tính None hoặc Dictionary Header server trả về
history Thuộc tính None hoặc list Các request đã thực thi khi thực thi request.
is_permanent_redirect Thuộc tính bool Trả về True nếu request có redirect
is_redirect Thuộc tính bool Trả về True nếu request có redirect bằng HTTP code
iter_content(chunk_size=1, decode_unicode=False) Phương thức Object Lặp lại dữ liệu trả về khi Request set strame=True
iter_lines(chunk_size=512, decode_unicode=None, delimiter=None) Phương thức Object Tương tự phương thức iter_content() nhưng sẽ lặp lại theo dòng
json(**kwargs) Phương thức Json Chuyển đổi dữ liệu trả về thành Json, nếu có
links Phương thức Dictionary Trả về list Header links của response đã được xử lý
next Thuộc tính PreparedRequest Trả về PreparedRequest cho request tiếp theo
ok Thuộc tính bool Trả về True nếu HTTP STATUS trả về là nhỏ hơn 400 ngược lại là False
raise_for_status() Phương thức None hoặc HTTPError Raises HTTPError nếu có 1 điều đó xảy ra
reason Thuộc tính None hoặc String Trả về lí do HTTP trạng thái được trả về.
request Thuộc tính None hoặc PreparedRequest Xem chi tiết tại đây
status_code Thuộc tính None hoặc String HTTP Status mà server trả về
text Thuộc tính String Nội dung của request trả về.
url Thuộc tính None hoặc String URL cuối cùng sau khi thực thi request.

VD:

import requests

r = requests.get("http://ip-api.com/json")

#request: https://toidicode.com/?post_id=135

print(r.apparent_encoding)
# print(r.content)
print(r.encoding)
print(r.cookies)
print(r.elapsed)
print(r.encoding)
print(r.headers)
print(r.history)
print(r.is_permanent_redirect)
print(r.iter_content())
print(r.links)
print(r.raise_for_status())
print(r.json())

Kết quả trả về

ascii
utf-8

0:00:00.165961
utf-8
{'Content-Length': '271', 'Date': 'Mon, 17 Sep 2018 01:33:24 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Access-Control-Allow-Origin': '*'}
[]
False

{}
None
{'as': 'AS7552 Viettel Group', 'zip': '', 'regionName': 'Hanoi', 'lat': 21.0333, 'country': 'Vietnam', 'status': 'success', 'timezone': 'Asia/Ho_Chi_Minh', 'lon': 105.85, 'countryCode': 'VN', 'org': 'Viettel Group', 'city': 'Hanoi', 'isp': 'Viettel Group', 'region': 'HN', 'query': '117.4.242.101'}

Các excetion có thể xảy ra.

RequestException - Có một lỗi gì đó xảy ra trong quá  trình thực thi request của bạn.

ConnectionError - Kết nối xảy ra lỗi.

HTTPError - Có lỗi HTTP xảy ra.

URLRequired -  URL của bạn không chính xác

TooManyRedirects - Request redirect quá nhiều lần.

ConnectTimeout - Kết nỗi bị timeout.

ReadTimeout - Server không trả về dữ liệu trì trong khoảng thời gian được phân bổ.

Timeout - Request bị timeout (Nên dùng exception này để bắt cả ConectionTimeout và ReadTimeout nếu bạn muốn code ngắn gọn).

4, Kết.

Phần trên mới chỉ là một phần giới thiệu nhanh gọn về module requests thôi, nếu như bạn cần tìm hiểu sâu hơn về module này thì hãy lên trang chủ của nó. Thanks,  good lucks!

Đăng ký nhận tin.

Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!

Vũ Thanh Tài

About author
The best way to learn is to share
Xem tất cả bài đăng

8 Comments

bạn ơi cho mình hỏi khi chạy nó báo lỗi "AttributeError: module 'requests' has no attribute 'get' ", mình đã install và import thư viện requests vào rồi mà vẫn bị, ko biết ntn nữa

Nhờ bạn giúp mình với!

Minh Jordan

6 năm trước

Bạn copy đoạn code gửi cho mình xem qua với

Vũ Thanh Tài

6 năm trước

bạn ơi học python cơ bản ,và python na6nbg cao cộng mysql thì làm web được không

jonh777

5 năm trước

Cho em hỏi là thư viện request này có thể sử dụng để gửi OTP về điện thoại được ko ạ.

Võ Thuận

4 năm trước

Chào Võ Thuận,
Bạn có thể dùng requests module để gửi request đến một API OTP nhé bạn

Vũ Thanh Tài

4 năm trước

Bạn gửi thông tin của bạn vào email của mình, [email protected], mình đang cần bạn giúp sửa lỗi bộ code chương trình của cá nhân mình, khi chạy luôn báo lỗi thiếu thư viện sever, mình không biết phải bổ sung thế nào, mình cài python trên ubuntu16.0.8, bạn giúp mình nhé, cảm ơn bạn

Nguyen Van Dung

4 năm trước

Anh ơi

Long

3 năm trước

sao bx nay tải thư viện không được nx ạ

Bình luận

Captcha