Thư viện requests là một thư viện HTTP đơn giản dành cho python. Về cơ bản nó sử dụng để gửi yêu cầu HTTP qua các dịch vụ web API. Thư viện requests không đi kèm với thư viện tiêu chuẩn của python, để cài đặt nó bằng lệnh pip.
Trong bài viết này, bạn sẽ tìm hiểu những kiến thức cơ bản về thư viện requests bằng cách áp dụng nó để lấy số liệu thời gian thực tình hình virus corona. Bắt đầu nào.
Trong Windows, gõ lệnh pip sau ở Command Promt
pip install requests
Căn bản về thư viện request
Thực hiện một yêu cầu trong requests rất đơn giản, thực hiện như sau
Trước tiên, hãy chỉ định loại yêu cầu bạn đang thực hiện [POST, GET, PUT, DELETE] và URL mà bạn đang gửi yêu cầu kèm với các thông số bổ sung tùy thuộc vào loại yêu cầu.
Bây giờ chúng ta hãy đưa ra yêu cầu đầu tiên bằng cách lấy các sự kiện trên github. Ta sẽ đưa ra yêu cầu GET [Yêu cầu GET hoạt động giống như cách trình duyệt của yêu cầu một trang]. URL của sự kiện github là //api.github.com/events
Code ví dụ như sau
>> import requests
>> link = '//api.github.com/events'
>> response = requests.get[link]
>> response.status_code
200
>> response.json[][0]['actor']
{'avatar_url': '//avatars.githubusercontent.com/u/45685134?',
'display_login': 'trinhdinhnam',
'gravatar_id': '',
'id': 45685134,
'login': 'trinhdinhnam',
'url': '//api.github.com/users/trinhdinhnam'}
Xây dựng một project minh họa
Ví dụ mẫu này chúng ta sẽ xây dựng một project thực hiện GET từ URL cụ thể để có thể lấy được thông tin về virus corora trong thời gian thực.
Ta sử dụng đường link dưới đây để lấy thông tin về virus corona ở Việt Nam
scraping_url = "//covidapi.info/api/v1/country/VNM"
Nếu bạn muốn lấy cho quốc gia khác, hãy thay mã isocode của Việt Nam “VNM” thành mã khác tương ứng.
Ta thử thực hiện gửi yêu cầu GET đến URL này
>> scraping_url = "//covidapi.info/api/v1/country/VNM"
>> response = requests.get[scraping_url]
>> print[response.json[]]
{'count': 323, 'result': {'2020-01-22': {'confirmed': 0, 'deaths': 0, 'recovered': 0}, '2020-01-23': {'confirmed': 2, 'deaths': 0, 'recovered': 0}, …
API trả về json phản hồi của số liệu thống kê virus corona của Việt Nam mỗi ngày kể từ trường hợp corona đầu tiên đến ngày thông tin cập nhật mới nhất.
Thông thường khi chúng ta lấy thong tin, ta muốn lấy số liệu thống kê mới nhất. Để làm điều này, ta phải sắp xếp json phản hồi và chọn thống kê ngày mới nhất, điều này có thể được thực hiện bằng cách sử dụng OrderedDict và Sorted.
Xây dựng một hàm để tự động thống kê các trường hợp
Ta thực hiện điều này như sau
def scrap_number[]:
scraping_url = "//covidapi.info/api/v1/country/VNM"
payload = {};headers= {}
response = requests.request["GET", scraping_url, headers=headers, data = payload]
info = response.json[]['result']
date = list[OrderedDict[sorted[info.items[]]]][-1]
data = info[date]
message = "Theo John Hopkins {} thông số ngày {} \n Các trường hợp như sau: \nNhiễm {}\nTử vong {} \nHồi phục {}".format["//coronavirus.jhu.edu/", date, data['confirmed'], data['deaths'], data['recovered']]
return message
Gọi hàm và thu được kết quả
>> print[scrap_number[]]
Theo John Hopkins //coronavirus.jhu.edu/ thông số ngày 2020-12-09
Các trường hợp như sau:
Nhiễm 1381
Tử vong 35
Hồi phục 1225
Nếu có bất kỳ câu hỏi nào, hãy comment bên dưới. Tôi sẽ trả lời bạn nhanh nhất có thể
Bài viết được sự cho phép của tác giả Nguyễn Việt Hưng
Những “hacker” trên dòng lệnh luôn gõ nhoay nhoáy các “command line” để xử lý text: grep, cut, uniq, sort,… hay đôi khi chơi hẳn sed hoặc AWK, thậm chí Perl5.
Thời xưa, Perl5 vốn là công cụ số một của các SysAdmin, khi mà Python vẫn chưa phổ biến do quá sạch đẹp nhưng cũng hơi “dài dòng” [so với Perl]. Muốn làm gì với Python cũng phải viết ra 1 file, rồi chmod a+x rồi mới chạy được. Perl thì có cả ngàn phép biến hóa chỉ bằng 1 dòng, gọi là one-liner hay trên Wikipedia:
perl -lne 'print if $_ eq reverse' /usr/share/dict/american-english
1 dòng trên để tìm ra các từ “palindrome’ [ngược xuôi như nhau].
Python 1-liner
Python 1-liner vốn không ngắn như mong đợi, do code Python nhấn mạnh vào sự rõ ràng dễ đọc, nên không có các ký tự bí hiểm
>> import requests
>> link = '//api.github.com/events'
>> response = requests.get[link]
>> response.status_code
200
>> response.json[][0]['actor']
{'avatar_url': '//avatars.githubusercontent.com/u/45685134?',
'display_login': 'trinhdinhnam',
'gravatar_id': '',
'id': 45685134,
'login': 'trinhdinhnam',
'url': '//api.github.com/users/trinhdinhnam'}
6 như Perl. Viết Python 1 dòng dùng option >> import requests
>> link = '//api.github.com/events'
>> response = requests.get[link]
>> response.status_code
200
>> response.json[][0]['actor']
{'avatar_url': '//avatars.githubusercontent.com/u/45685134?',
'display_login': 'trinhdinhnam',
'gravatar_id': '',
'id': 45685134,
'login': 'trinhdinhnam',
'url': '//api.github.com/users/trinhdinhnam'}
7 như sau:$ python3 -c 'import math; print[math.sqrt[2**1000]]' 3.273390607896142e+150
Các dòng không cần phải xuống dòng mà dùng dấu
>> import requests
>> link = '//api.github.com/events'
>> response = requests.get[link]
>> response.status_code
200
>> response.json[][0]['actor']
{'avatar_url': '//avatars.githubusercontent.com/u/45685134?',
'display_login': 'trinhdinhnam',
'gravatar_id': '',
'id': 45685134,
'login': 'trinhdinhnam',
'url': '//api.github.com/users/trinhdinhnam'}
8 để ngăn cách. Nhưng viết >> import requests
>> link = '//api.github.com/events'
>> response = requests.get[link]
>> response.status_code
200
>> response.json[][0]['actor']
{'avatar_url': '//avatars.githubusercontent.com/u/45685134?',
'display_login': 'trinhdinhnam',
'gravatar_id': '',
'id': 45685134,
'login': 'trinhdinhnam',
'url': '//api.github.com/users/trinhdinhnam'}
9 hay scraping_url = "//covidapi.info/api/v1/country/VNM"
0 thì … hơi khó.Python nhiều dòng
Cách này đơn giản hơn, viêt code thành nhiều dòng, ý hệt như code trong file. Dùng dấu single quote
scraping_url = "//covidapi.info/api/v1/country/VNM"
1 rồi enter để gõ code, sau đó kết thúc bằng dầu single quote scraping_url = "//covidapi.info/api/v1/country/VNM"
1.$ python3 -c ' > sum = 0 > for i in range[10]: > sum += i > print[sum] > ' 45
Ví dụ sau lấy ra Shell của user
scraping_url = "//covidapi.info/api/v1/country/VNM"
3 ghi trong file /etc/passwd, viết HOA:$ cat /etc/passwd | python -c ' > import sys > print[sys.stdin.readline[].split[":"][-1].upper[]] > ' /BIN/BASH
hay đếm số ký tự kết quả trên bằng lệnh
scraping_url = "//covidapi.info/api/v1/country/VNM"
4:>> import requests
>> link = '//api.github.com/events'
>> response = requests.get[link]
>> response.status_code
200
>> response.json[][0]['actor']
{'avatar_url': '//avatars.githubusercontent.com/u/45685134?',
'display_login': 'trinhdinhnam',
'gravatar_id': '',
'id': 45685134,
'login': 'trinhdinhnam',
'url': '//api.github.com/users/trinhdinhnam'}
0Không phải 1 dòng, nhưng đẹp hơn 1 dòng, và hoàn toàn hợp lý.
Ví dụ khác để in JSON đẹp:
>> import requests
>> link = '//api.github.com/events'
>> response = requests.get[link]
>> response.status_code
200
>> response.json[][0]['actor']
{'avatar_url': '//avatars.githubusercontent.com/u/45685134?',
'display_login': 'trinhdinhnam',
'gravatar_id': '',
'id': 45685134,
'login': 'trinhdinhnam',
'url': '//api.github.com/users/trinhdinhnam'}
1Hay dùng module có sẵn:
>> import requests
>> link = '//api.github.com/events'
>> response = requests.get[link]
>> response.status_code
200
>> response.json[][0]['actor']
{'avatar_url': '//avatars.githubusercontent.com/u/45685134?',
'display_login': 'trinhdinhnam',
'gravatar_id': '',
'id': 45685134,
'login': 'trinhdinhnam',
'url': '//api.github.com/users/trinhdinhnam'}
2Hoặc tìm các Palindromes trong file:
>> import requests
>> link = '//api.github.com/events'
>> response = requests.get[link]
>> response.status_code
200
>> response.json[][0]['actor']
{'avatar_url': '//avatars.githubusercontent.com/u/45685134?',
'display_login': 'trinhdinhnam',
'gravatar_id': '',
'id': 45685134,
'login': 'trinhdinhnam',
'url': '//api.github.com/users/trinhdinhnam'}
3Cách khác:
>> import requests
>> link = '//api.github.com/events'
>> response = requests.get[link]
>> response.status_code
200
>> response.json[][0]['actor']
{'avatar_url': '//avatars.githubusercontent.com/u/45685134?',
'display_login': 'trinhdinhnam',
'gravatar_id': '',
'id': 45685134,
'login': 'trinhdinhnam',
'url': '//api.github.com/users/trinhdinhnam'}
4Thử thách
Viết lại ví dụ sau chỉ dùng các command line, không dùng Python:
$ cat /etc/passwd | python -c ' > import sys > print[sys.stdin.readline[].split[":"][-1].upper[]] > ' /BIN/BASH
Pro tips
- trong code không dùng dấu
1scraping_url = "//covidapi.info/api/v1/country/VNM"
- không được gõ sai vì sửa lại hơi mệt, nếu không có khả năng này, hãy viết code vào file. vì sửa lại hơi mệt, nếu không có khả năng này, hãy viết code vào file.
Kết luận
Python dài và chất, đừng ngại dùng khi gõ CLI.
Bài viết gốc được đăng tải tại pp.pymi.vn
Có thể bạn quan tâm:
- 12 Packages và Libraries của Go cực kì mạnh mẽ mà bạn cần phải biết
- Những project cá nhân giúp mình lên trình senior Javascript
- Anh Em Nhà .NET – phần 1
Xem thêm Việc làm cntt ngành python hấp dẫn trên TopDev