Khoá học: Thiết lập dự án Wordpress

Nếu bạn đang tìm kiếm một cách nhanh chóng và hiệu quả để thiết lập một trang web cá nhân hoặc doanh nghiệp của mình, hãy bắt đầu với WordPress. Được coi là nền tảng quản lý nội dung (CMS) phổ biến nhất trên thế giới, WordPress cho phép bạn dễ dàng tạo ra một [...]

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:

KeyTypeReturnDescription
apparent_encodingThuộc tínhString Trả về kiểu mã hóa của dữ liệu trả về
close()Phương thứcNoneĐóng connection
contentThuộc tínhStringDữ liệu server trả về
cookiesThuộc tínhCookieJar hoặc NoneCookies của request server trả về
elapsedThuộc tínhNone hoặc timedeltaThời gian thực thi request
encodingThuộc tínhNone hoặc StringKiểu mã hóa dữ liệu khi truy cập thuộc tính text
headersThuộc tínhNone hoặc DictionaryHeader server trả về
historyThuộc tínhNone hoặc listCác request đã thực thi khi thực thi request.
is_permanent_redirectThuộc tínhboolTrả về True nếu request có redirect
is_redirectThuộc tínhboolTrả về True nếu request có redirect bằng HTTP code
iter_content(chunk_size=1, decode_unicode=False)Phương thứcObjectLặ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ứcObjectTương tự phương thức iter_content() nhưng sẽ lặp lại theo dòng
json(**kwargs)Phương thứcJsonChuyển đổi dữ liệu trả về thành Json, nếu có
linksPhương thứcDictionary Trả về list Header links của response đã được xử lý
nextThuộc tínhPreparedRequestTrả về PreparedRequest cho request tiếp theo
okThuộc tínhboolTrả 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ứcNone hoặc HTTPErrorRaises HTTPError nếu có 1 điều đó xảy ra
reasonThuộc tínhNone hoặc StringTrả về lí do HTTP trạng thái được trả về.
requestThuộc tínhNone hoặc PreparedRequestXem chi tiết tại đây
status_codeThuộc tínhNone hoặc StringHTTP Status mà server trả về
textThuộc tínhStringNội dung của request trả về.
urlThuộc tínhNone hoặc StringURL 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!

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *