跳转至

Python 第三方库

Python 所有的第三方库都可以在 PYPI / Python Package Index 找到,并使用 PIP 进行安装:

Bash
1
2
3
4
5
# 安装最新版 requests
pip install requests

# 安装特定版本 requests
pip install requests==2.28.1

本文将介绍 Python 中的几个常用的第三方库。

1. HTTP 请求(requests)

requests库是一个用于发送 HTTP 请求的库,官方网站为 requests.readthedocs.io

1.1 发送 GET 请求并获取响应体

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import requests

# 发送 HTTP Get 请求
resp = requests.get('https://httpbin.org/get')

# 检查响应代码,在 4xx 或 5xx 时抛出错误
resp.raise_for_status()

# 响应代码
print('响应结果 resp.status_code 的为:', resp.status_code)

# 直接输出响应体文本
data = resp.text
print('响应结果 resp.text 的类型为:', type(data))
print('响应结果 resp.text 的内容为:', data)

# 以 JSON 方式解析响应体
data = resp.json()
print('响应结果 resp.json() 的类型为:', type(data))
print('响应结果 resp.json() 的内容为:', data)

输出:

Text Output
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
响应结果 resp.status_code 的为: 200
响应结果 resp.text 的类型为: <class 'str'>
响应结果 resp.text 的内容为: {
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.28.1",
    "X-Amzn-Trace-Id": "Root=1-63118d02-7473a7f52d01e431446e6d2a"
  },
  "origin": "101.132.183.69",
  "url": "https://httpbin.org/get"
}

响应结果 resp.json() 的类型为: <class 'dict'>
响应结果 resp.json() 的内容为: {'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.28.1', 'X-Amzn-Trace-Id': 'Root=1-63118d02-7473a7f52d01e431446e6d2a'}, 'origin': '101.132.183.69', 'url': 'https://httpbin.org/get'}

1.2 发送更复杂的请求

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import requests

# 发送时指定 Query 参数
params = { 'user-id': 'u-001' }
resp = requests.get('https://httpbin.org/get', params=params)
print('发送时指定 Query 参数:', resp.text)

# 发送时指定请求头
headers = { 'X-User-Id': 'u-001' }
resp = requests.get('https://httpbin.org/get', headers=headers)
print('发送时指定请求头:', resp.text)

# 发送时指定超时时间
resp = requests.get('https://httpbin.org/get', timeout=3)
print('发送时指定超时时间:', resp.text)

# 发送时忽略 HTTPS 证书验证(请求自签名域名时使用)
resp = requests.get('https://httpbin.org/get', verify=False)
print('发送时忽略 HTTPS 证书验证(请求自签名域名时使用):', resp.text)

# 发送 POST 请求,请求体为 Form 格式
data = { 'key': 'value' }
resp = requests.post('https://httpbin.org/post', data=data)
print('发送 POST 请求,请求体为 Form 格式:', resp.text)

# 发送 POST 请求,请求体为 JSON 格式
data = { 'key': 'value' }
resp = requests.post('https://httpbin.org/post', json=data)
print('发送 POST 请求,请求体为 JSON 格式:', resp.text)

输出:

Text Output
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
发送时指定 Query 参数: {
  "args": {
    "user-id": "u-001"
  },
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.28.1",
    "X-Amzn-Trace-Id": "Root=1-63118f09-083cd24569089d0b24dc78b8"
  },
  "origin": "101.132.183.69",
  "url": "https://httpbin.org/get?user-id=u-001"
}

发送时指定请求头: {
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.28.1",
    "X-Amzn-Trace-Id": "Root=1-63118f0a-5cbb1a1a0f1dc8b46d648575",
    "X-User-Id": "u-001"
  },
  "origin": "101.132.183.69",
  "url": "https://httpbin.org/get"
}

发送时指定超时时间: {
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.28.1",
    "X-Amzn-Trace-Id": "Root=1-63118f0a-6c6cf1b94cc4c1144faa7054"
  },
  "origin": "101.132.183.69",
  "url": "https://httpbin.org/get"
}

/usr/local/lib/python3.8/dist-packages/urllib3/connectionpool.py:842: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  warnings.warn((
发送时忽略 HTTPS 证书验证(请求自签名域名时使用): {
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.28.1",
    "X-Amzn-Trace-Id": "Root=1-63118f0b-632853b91c5290d55f49bef4"
  },
  "origin": "101.132.183.69",
  "url": "https://httpbin.org/get"
}

发送 POST 请求,请求体为 Form 格式: {
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "key": "value"
  },
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Content-Length": "9",
    "Content-Type": "application/x-www-form-urlencoded",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.28.1",
    "X-Amzn-Trace-Id": "Root=1-63118f0c-4e725597001f988434096767"
  },
  "json": null,
  "origin": "101.132.183.69",
  "url": "https://httpbin.org/post"
}

发送 POST 请求,请求体为 JSON 格式: {
  "args": {},
  "data": "{\"key\": \"value\"}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Content-Length": "16",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.28.1",
    "X-Amzn-Trace-Id": "Root=1-63118f0d-66486dcd4c6889b61d4249c9"
  },
  "json": {
    "key": "value"
  },
  "origin": "101.132.183.69",
  "url": "https://httpbin.org/post"
}

2. 时间处理(arrow)

arrow库是一个用于时间的库,官方网站为 arrow.readthedocs.io

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import arrow

t = arrow.utcnow().timestamp
print('获取当前 Unix 时间戳                           :', t)

t = arrow.now('Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss')
print('获取当前北京时间字符串                         :', t)

t = arrow.now('Asia/Shanghai').isoformat()
print('获取当前北京时间的 ISO8601 格式字符串          :', t)
#
t = arrow.get(1577808000).to('Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss')
print('从 Unix 时间戳解析,并输出北京时间字符串       :', t)

t = arrow.get('2019-12-31T16:00:00Z').to('Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss')
print('从 ISO8601 时间字符串解析,并输出北京时间字符串:', t)

t = arrow.get('2020-01-01 00:00:00', 'YYYY-MM-DD HH:mm:ss').replace(tzinfo='Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss')
print('从非标准时间字符串解析,并作为北京时间字符串   :', t)

t = arrow.get('2019-12-31T16:00:00Z').shift(days=-1).to('Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss')
print('时间运算:获取前一天,并输出北京时间字符串     :', t)

输出:

Text Output
1
2
3
4
5
6
7
获取当前 Unix 时间戳                           : 1662095305
获取当前北京时间字符串                         : 2022-09-02 13:08:25
获取当前北京时间的 ISO8601 格式字符串          : 2022-09-02T13:08:25.920213+08:00
从 Unix 时间戳解析,并输出北京时间字符串       : 2020-01-01 00:00:00
从 ISO8601 时间字符串解析,并输出北京时间字符串: 2020-01-01 00:00:00
从非标准时间字符串解析,并作为北京时间字符串   : 2020-01-01 00:00:00
时间运算:获取前一天,并输出北京时间字符串     : 2019-12-31 00:00:00

3. XML 转 JSON(xmltodict)

xmltodict库是一个用于将 XML 数据转换为 JSON 的库,Github 网址为 github.com/martinblech/xmltodict

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import xmltodict
import json

data = '''
<root>
    <name>张三</name>
    <age>25</age>
    <job>程序员</job>
    <job>项目经理</job>
</root>
'''
data = xmltodict.parse(data)
print('XML 解析为 JSON 后的结果:', data)
print('XML 解析为 JSON 后输出为 JSON 字符串:', json.dumps(data, indent=2, ensure_ascii=False))

输出:

Text Output
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
XML 解析为 JSON 后的结果: {'root': {'name': '张三', 'age': '25', 'job': ['程序员', '项目经理']}}
XML 解析为 JSON 后输出为 JSON 字符串: {
  "root": {
    "name": "张三",
    "age": "25",
    "job": [
      "程序员",
      "项目经理"
    ]
  }
}