Điện thoại/ Zalo
0389934723
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.url
làString
chứa URL của trang web mà bạn muốn gửi request đến.data
là mộtDictionary
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ộtDictionary
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ộtDictionary
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ộtDictionary
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ộttuple
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ộtfloat
hoặctubple
đơ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ộtbool
thiết lập xem request này có cho phép redirect không, mặc định thì giá trị này bằngTrue
có nghĩa là cho phép. Tham số này có thể bỏ trống.proxies
là mộtDictionary
chứa các protocol để ánh xạ đến proxy của URL. Tham số này có thể bỏ trống.verify
là mộtbool
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ộtbool
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!