Hướng dẫn python requests cli - python yêu cầu cli

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à https://api.github.com/events

Code ví dụ như sau

>> import requests

>> link = 'https://api.github.com/events'

>> response = requests.get(link)

>> response.status_code

200

>> response.json()[0]['actor']

{'avatar_url': 'https://avatars.githubusercontent.com/u/45685134?',

 'display_login': 'trinhdinhnam',

 'gravatar_id': '',

 'id': 45685134,

 'login': 'trinhdinhnam',

 'url': 'https://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 = "https://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 = "https://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 = "https://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("https://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 https://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 = 'https://api.github.com/events'

>> response = requests.get(link)

>> response.status_code

200

>> response.json()[0]['actor']

{'avatar_url': 'https://avatars.githubusercontent.com/u/45685134?',

 'display_login': 'trinhdinhnam',

 'gravatar_id': '',

 'id': 45685134,

 'login': 'trinhdinhnam',

 'url': 'https://api.github.com/users/trinhdinhnam'}
6 như Perl. Viết Python 1 dòng dùng option 
>> import requests

>> link = 'https://api.github.com/events'

>> response = requests.get(link)

>> response.status_code

200

>> response.json()[0]['actor']

{'avatar_url': 'https://avatars.githubusercontent.com/u/45685134?',

 'display_login': 'trinhdinhnam',

 'gravatar_id': '',

 'id': 45685134,

 'login': 'trinhdinhnam',

 'url': 'https://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 = 'https://api.github.com/events'

>> response = requests.get(link)

>> response.status_code

200

>> response.json()[0]['actor']

{'avatar_url': 'https://avatars.githubusercontent.com/u/45685134?',

 'display_login': 'trinhdinhnam',

 'gravatar_id': '',

 'id': 45685134,

 'login': 'trinhdinhnam',

 'url': 'https://api.github.com/users/trinhdinhnam'}
8 để ngăn cách. Nhưng viết 
>> import requests

>> link = 'https://api.github.com/events'

>> response = requests.get(link)

>> response.status_code

200

>> response.json()[0]['actor']

{'avatar_url': 'https://avatars.githubusercontent.com/u/45685134?',

 'display_login': 'trinhdinhnam',

 'gravatar_id': '',

 'id': 45685134,

 'login': 'trinhdinhnam',

 'url': 'https://api.github.com/users/trinhdinhnam'}
9 hay 
scraping_url = "https://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 = "https://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 = "https://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 = "https://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 = "https://covidapi.info/api/v1/country/VNM"
4:

>> import requests

>> link = 'https://api.github.com/events'

>> response = requests.get(link)

>> response.status_code

200

>> response.json()[0]['actor']

{'avatar_url': 'https://avatars.githubusercontent.com/u/45685134?',

 'display_login': 'trinhdinhnam',

 'gravatar_id': '',

 'id': 45685134,

 'login': 'trinhdinhnam',

 'url': 'https://api.github.com/users/trinhdinhnam'}
0

Khô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 = 'https://api.github.com/events'

>> response = requests.get(link)

>> response.status_code

200

>> response.json()[0]['actor']

{'avatar_url': 'https://avatars.githubusercontent.com/u/45685134?',

 'display_login': 'trinhdinhnam',

 'gravatar_id': '',

 'id': 45685134,

 'login': 'trinhdinhnam',

 'url': 'https://api.github.com/users/trinhdinhnam'}
1

Hay dùng module có sẵn:

>> import requests

>> link = 'https://api.github.com/events'

>> response = requests.get(link)

>> response.status_code

200

>> response.json()[0]['actor']

{'avatar_url': 'https://avatars.githubusercontent.com/u/45685134?',

 'display_login': 'trinhdinhnam',

 'gravatar_id': '',

 'id': 45685134,

 'login': 'trinhdinhnam',

 'url': 'https://api.github.com/users/trinhdinhnam'}
2

Hoặc tìm các Palindromes trong file:

>> import requests

>> link = 'https://api.github.com/events'

>> response = requests.get(link)

>> response.status_code

200

>> response.json()[0]['actor']

{'avatar_url': 'https://avatars.githubusercontent.com/u/45685134?',

 'display_login': 'trinhdinhnam',

 'gravatar_id': '',

 'id': 45685134,

 'login': 'trinhdinhnam',

 'url': 'https://api.github.com/users/trinhdinhnam'}
3

Cách khác:

>> import requests

>> link = 'https://api.github.com/events'

>> response = requests.get(link)

>> response.status_code

200

>> response.json()[0]['actor']

{'avatar_url': 'https://avatars.githubusercontent.com/u/45685134?',

 'display_login': 'trinhdinhnam',

 'gravatar_id': '',

 'id': 45685134,

 'login': 'trinhdinhnam',

 'url': 'https://api.github.com/users/trinhdinhnam'}
4

Thử 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 
    scraping_url = "https://covidapi.info/api/v1/country/VNM"
    1
  • 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