❮ Requests 使用请求进行 Web 抓取
Requests 有用的资源 ❯
Requests - 快速指南
更新于 2025/2/2 15:52:17
Requests - 概述
Requests 是一个 HTTP 库,它提供了简单的功能来处理 Web 应用程序中的 http 请求/响应。该库是用 Python 开发的。
Python Requests 的官方网站位于 https://2.python-requests.org/en/master/,其对 Requests 的定义如下 −
Requests 是一个优雅而简单的 Python HTTP 库,专为人类而构建。
Requests 的功能
下面讨论了 Requests 的功能 −
Request
python 请求库具有易于使用的方法来处理 Http 请求。传递参数和处理请求类型(如 GET、POST、PUT、DELETE 等)非常容易。
响应
您可以以所需的格式获取响应,支持的格式包括文本格式、二进制响应、json 响应和原始响应。
标头
该库允许您根据需要读取、更新或发送新标头。
超时
使用 python 请求库可以轻松将超时添加到您正在请求的 URL。碰巧您正在使用第三方 URL 并等待响应。
在 URL 上设置超时始终是一个好习惯,因为我们可能希望 URL 在超时内响应,或者由于超时而出现错误。不这样做可能会导致无限期地等待该请求。
错误处理
请求模块支持错误处理,其中包括连接错误、超时错误、TooManyRedirects、Response.raise_for_status 错误等。
Cookies
该库允许您读取、写入和更新请求的 URL。
会话
要维护数据,您需要在请求之间进行会话。因此,如果一次又一次地调用同一主机,您可以重新使用 TCP 连接,从而提高性能。
SSL 证书
SSL 证书是安全 URL 附带的安全功能。当您使用请求时,它还会验证给定的 https URL 的 SSL 证书。 SSL 验证在请求库中默认启用,如果证书不存在,则会抛出错误。
身份验证
HTTP 身份验证是在服务器端进行的,当客户端请求 URL 时,要求提供一些身份验证信息,如用户名、密码。这是客户端和服务器之间交换的请求和响应的额外安全性。
使用 Python 请求库的优势
以下是使用 Python 请求库的优势 −
易于使用并从给定的 URL 获取数据。
请求库可用于从网站抓取数据。
使用请求,您可以获取、发布、删除、更新给定 URL 的数据。
处理 cookie 和会话非常容易。
在身份验证模块支持的帮助下,安全性也得到了保障。
Requests - 环境设置
在本章中,我们将介绍 Requests 的安装。要开始使用 Requests 模块,我们需要先安装 Python。因此,我们将进行以下操作 −
安装 Python
安装 Requests
安装 Python
转到 Python 官方网站:https://www.python.org/downloads/,如下所示,然后单击适用于 Windows、Linux/Unix 和 Mac OS 的最新版本。根据您可用的 64 位或 32 位操作系统下载 Python。
下载后,单击 .exe 文件并按照步骤在您的系统上安装 python。
python 包管理器(即 pip)也将默认安装在上述安装中。要使其在您的系统上全局运行,请直接将 python 的位置添加到 PATH 变量。安装开始时会显示相同的内容,请记住选中"添加到 PATH"复选框。如果您忘记检查,请按照以下步骤将其添加到 PATH。
要添加到 PATH,请按照以下步骤 −
右键单击您的计算机图标,然后单击属性 > 高级系统设置。
它将显示如下所示的屏幕 −
单击如上所示的环境变量。它将显示如下所示的屏幕 −
选择路径并单击编辑按钮,在末尾添加您的 python 的位置路径。现在,让我们检查一下 python 版本。
检查 python 版本
E:\prequests>python --version
Python 3.7.3
安装 Requests
现在我们已经安装了 python,我们将安装 Requests。
一旦安装了 python,python 包管理器即 pip 也将安装。以下是检查 pip 版本的命令。
E:\prequests>pip --version
pip 19.1.1 from c:\users\xxxxx\appdata\local\programs\python\python37\lib\site-
packages\pip (python 3.7)
我们已经安装了 pip,版本是 19.1.1。现在,将使用 pip 安装 Requests 模块。
命令如下 −
pip install requests
E:\prequests>pip install requests
Requirement already satisfied: requests in c:\users\xxxx\appdata\local\programs
\python\python37\lib\site-packages (2.22.0)
Requirement already satisfied: certifi>=2017.4.17 in c:\users\kamat\appdata\local\
programs\python\python37\lib\site-packages (from requests) (2019.3.9)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in c:\use
rs\xxxxx\appdata\local\programs\python\python37\lib\site-packages (from requests
) (1.25.3)
Requirement already satisfied: idna<2.9,>=2.5 in c:\users\xxxxxxx\appdata\local\
programs\python\python37\lib\site-packages (from requests) (2.8)
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in c:\users\xxxxx\appdata\
local\programs\python\python37\lib\site-packages (from requests) (3.0.4)
我们已经安装了该模块,因此在命令提示符中它显示要求已满足;如果没有安装,它会下载安装所需的软件包。
要检查已安装的请求模块的详细信息,您可以使用以下命令 −
pip show requests
E:\prequests>pip show requests
Name: requests
Version: 2.22.0
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: me@kennethreitz.org
License: Apache 2.0
Location: c:\users\xxxxx\appdata\local\programs\python\python37\lib\site-package
S
Requires: certifi, idna, urllib3, chardet
Required-by:
Requests模块版本为2.22.0。
Requests - Http Requests 如何工作?
Python 的 Requests 是一个 HTTP 库,可帮助我们在客户端和服务器之间交换数据。假设您有一个带有表单的 UI,您需要在其中输入用户详细信息,因此一旦输入,您就必须提交数据,而这只不过是从客户端到服务器的 Http POST 或 PUT 请求以保存数据。
当您想要数据时,您需要从服务器获取数据,这又是一个 Http GET 请求。客户端请求数据时与服务器响应所需数据之间的数据交换,客户端和服务器之间的这种关系非常重要。
请求是针对给定的 URL 发出的,它可以是安全或非安全的 URL。
可以使用 GET、POST、PUT、DELETE 向 URL 发出请求。最常用的是GET方法,主要用于从服务器获取数据时。
您还可以将数据作为查询字符串发送到URL,例如−
https://jsonplaceholder.typicode.com/users?id=9&username=Delphine
因此,在这里,我们将id = 9和username = Delphine传递给URL。所有值均以问号(?)后的键/值对形式发送,多个参数以&分隔传递给URL。
使用请求库,使用字符串字典按如下方式调用URL。
其中,发送到URL的数据作为字符串字典。如果要传递 id = 9 和 username = Delphine,可以执行以下操作 −
payload = {'id': '9', 'username': 'Delphine'}
请求库的调用方式如下 −
res = request.get('https://jsonplaceholder.typicode.com/users',
params = payload')
使用 POST,我们可以执行以下操作 −
res = request.post('https://jsonplaceholder.typicode.com/users', data =
{'id':'9', 'username':'Delphine'})
使用 PUT
res = request.put('https://jsonplaceholder.typicode.com/users', data =
{'id':'9', 'username':'Delphine'})
使用 DELETE
res = request.delete('https://jsonplaceholder.typicode.com/users')
Http 请求的响应可以是文本编码形式、二进制编码、json 格式或原始响应。请求和响应的细节将在下一章中详细解释。
Requests - 使用 Requests
在本章中,我们将了解如何使用 Requests 请求模块。我们将研究以下内容 −
发出 HTTP 请求。
将参数传递给 HTTP 请求。
发出 HTTP 请求
要发出 Http 请求,我们需要首先导入请求模块,如下所示 −
import request
现在让我们看看如何使用请求模块调用 URL。
让我们使用 URL − https://jsonplaceholder.typicode.com/users 在代码中,测试请求模块。
示例
import request
getdata = request.get('https://jsonplaceholder.typicode.com/users')
print(getdata.status_code)
使用 request.get() 方法调用 url − https://jsonplaceholder.typicode.com/users。 URL 的响应对象存储在 getdata 变量中。当我们打印变量时,它会给出 200 响应代码,这意味着我们已成功获得响应。
输出
E:\prequests>python makeRequest.py
要从响应中获取内容,我们可以使用 getdata.content 进行操作,如下所示 −
示例
import request
getdata = request.get('https://jsonplaceholder.typicode.com/users')
print(getdata.content)
getdata.content 将打印响应中可用的所有数据。
输出
E:\prequests>python makeRequest.py
b'[
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light
",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "
92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.149
6"
}
},
"phone": "1-770-736-8031 x56442",
"website": "hild
egard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhr
ase": "Multi-layered client-server neural-net",
"bs": "harness real-time
e-markets"
}
}
向 HTTP 请求传递参数
仅请求 URL 是不够的,我们还需要向 URL 传递参数。
参数大多以键/值对的形式传递,例如 −
https://jsonplaceholder.typicode.com/users?id=9&username=Delphine
因此,我们有 id = 9 和 username = Delphine。现在,我们将看到如何将这些数据传递给请求 Http 模块。
示例
import requests
payload = {'id': 9, 'username': 'Delphine'}
getdata = requests.get('https://jsonplaceholder.typicode.com/users',
params = payload)
print(getdata.content)
详细信息存储在对象有效负载中的键/值对中,并传递给 get() 方法中的 params。
输出
E:\prequests>python makeRequest.py
b'[
{
"id": 9,
"name": "Glenna Reichert",
"username": "Delphin
e",
"email": "Chaim_McDermott@dana.io",
"address": {
"street":
"Dayna Park",
"suite": "Suite 449",
"city": "Bartholomebury",
"zipcode": "76495-3109",
"geo": {
"lat": "24.6463",
"lng": "-168.8889"
}
},
"phone": "(775)976-6794 x41206",
"
website": "conrad.com",
"company": {
"name": "Yost and Sons",
"catchPhrase": "Switchable contextually-based project",
"bs": "aggregate
real-time technologies"
}
}
]'
我们现在在响应中获取 id = 9 和 username = Delphine 的详细信息。
如果您想查看,在传递参数后 URL 的外观,请利用响应对象到 URL。
示例
import requests
payload = {'id': 9, 'username': 'Delphine'}
getdata = requests.get('https://jsonplaceholder.typicode.com/users',
params = payload)
print(getdata.url)
输出
E:\prequests>python makeRequest.py
https://jsonplaceholder.typicode.com/users?id=9&username=Delphine
处理 HTTP 请求的响应
在本章中,我们将详细介绍从请求模块收到的响应。我们将讨论以下细节 −
获取响应
JSON 响应
RAW 响应
二进制响应
获取响应
我们将使用 request.get() 方法向 URL 发出请求。
import 请求
getdata = request.get('https://jsonplaceholder.typicode.com/users');
getdata 有响应对象。它包含响应的所有详细信息。我们可以通过两种方式获得响应,即 (text) 和 (.content)。使用 response.text 将以文本格式返回数据,如下所示 −
示例
E:\prequests>python makeRequest.py
[
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
"phone": "1-770-736-8031 x56442",
"website": "hildegard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhrase": "Multi-layered client-server neural-net",
"bs": "harness real-time e-markets"
}
},
]
您将看到响应与浏览器中查看 URL 源代码时显示的内容相同,如下所示 −
您还可以尝试 .html URL 并使用 response.text 查看内容,它将与浏览器中 .html URL 的查看源代码内容相同。
现在,让我们对同一 URL 尝试 response.content 并查看输出。
示例
import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users')
print(getdata.content)
输出
E:\prequests>python makeRequest.py
b'[
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light
",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "
92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.149
6"
}
},
"phone": "1-770-736-8031 x56442",
"website": "hild
egard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhr
ase": "Multi-layered client-server neural-net",
"bs": "harness real-time
e-markets"
}
},
{
"id": 2,
"name": "Ervin Howell",
"username": "Antonette",
"email": "Shanna@melissa.tv",
"address": {
"street": "Victor Plains",
"suite": "Suite 879",
"city": "Wisoky
burgh",
"zipcode": "90566-7771",
"geo": {
"lat": "-43.950
9",
"lng": "-34.4618"
}
},
"phone": "010-692-6593 x091
25",
"website": "anastasia.net",
"company": {
"name": "Deckow-Crist",
"catchPhrase": "Proactive didactic contingency",
"bs":
"synergize scalable supply-chains"
}
},
{
"id": 3,
"name":
"Clementine Bauch",
"username": "Samantha",
"email":
"Nathan@yesenia.net",
"address": {
"street": "Douglas Extension",
"suite": "Suite
847",
"city": "McKenziehaven",
"zipcode": "59590-4157",
"ge
o": {
"lat": "-68.6102",
"lng": "-47.0653"
}
},
响应以字节为单位。您将在响应开头看到一个字母 b。使用请求模块,您可以获取所使用的编码,并根据需要更改编码。例如,要获取编码,您可以使用 response.encoding。
print(getdata.encoding)
输出
utf-8
您可以按如下方式更改编码 − 您可以使用您选择的编码。
getdata.encoding = 'ISO-8859-1'
JSON 响应
您还可以使用 response.json() 方法以 json 格式获取 Http 请求的响应,如下所示 −
示例
import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users')
print(getdata.json())
输出
E:\prequests>python makeRequest.py
[{'id': 1, 'name': 'Leanne Graham', 'username': 'Bret', 'email': 'Sincere@april.
biz', 'address': {'street': 'Kulas Light', 'suite': 'Apt. 556', 'city': 'Gwenborough',
'zipcode': '92998-3874', 'geo': {'lat': '-37.3159', 'lng': '81.1496'}},
'
phone': '1-770-736-8031 x56442', 'website': 'hildegard.org', 'company': {'name':
'Romaguera-Crona', 'catchPhrase': 'Multi-layered client-server neural-net', 'bs':
'harness real-time e-markets'}}]
原始响应
如果您需要 Http URL 的原始响应,则可以使用 response.raw,还可以在 get 方法中添加 stream = True,如下所示 −
示例
import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users', stream=True)
print(getdata.raw)
输出
E:\prequests>python makeRequest.py
要从原始数据中读取更多内容,您可以按如下方式操作 −
print(getdata.raw.read(50))
输出
E:\prequests>python makeRequest.py
b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\x95\x98[o\xe38\x12\x85\xdf\xe7W\x10y\
xda\x01F\x82.\xd4m\x9f\xdc\x9dd\xba\xb7\x93\xf4\x06q\xef4\x06\x83A@K\x15\x89m'
二进制响应
要获取二进制响应,我们可以使用 response.content。
示例
import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users')
print(getdata.content)
输出
E:\prequests>python makeRequest.py
b'[
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light
",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "
92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.149
6"
}
},
"phone": "1-770-736-8031 x56442",
"website":
"hildegard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhr
ase": "Multi-layered client-server neural-net",
"bs": "harness real-time
e-markets"
}
},
{
"id": 2,
"name": "Ervin Howell",
"us
ername": "Antonette",
"email": "Shanna@melissa.tv",
"address": {
"street": "Victor Plains",
"suite": "Suite 879",
"city": "Wisoky
burgh",
"zipcode": "90566-7771",
"geo": {
"lat": "-43.950
9",
"lng": "-34.4618"
}
},
"phone": "010-692-6593 x091
25",
"website": "anastasia.net",
"company": {
"name": "Deckow-Crist",
"catchPhrase": "Proactive didactic contingency",
"bs": "syn
ergize scalable supply-chains"
}
},
{
"id": 3,
"name":
"Clementine Bauch",
"username": "Samantha",
"email": "Nathan@yesenia.net",
"address": {
"street": "Douglas Extension",
"suite": "Suite
847",
"city": "McKenziehaven",
"zipcode": "59590-4157",
"
geo": {
"lat": "-68.6102",
"lng": "-47.0653"
}
},
响应以字节为单位给出。您将在响应开头看到一个字母 b。二进制响应主要用于非文本请求。
Requests - HTTP 请求标头
在上一章中,我们了解了如何发出请求并获取响应。本章将进一步探讨 URL 的标头部分。因此,我们将研究以下内容 −
了解请求标头
自定义标头
响应标头
了解请求标头
在浏览器中点击任意 URL,检查它并在开发者工具网络选项卡中签入。
您将获得响应标头、请求标头、有效负载等。
例如,考虑以下 URL −
https://jsonplaceholder.typicode.com/users
您可以按如下方式获取标头详细信息−
示例
import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users',
stream = True)
print(getdata.headers)
输出
E:\prequests>python makeRequest.py
{'Date': 'Sat, 30 Nov 2019 05:15:00 GMT', 'Content-Type': 'application/json;
charset=utf-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive',
'Set-Cookie': '__cfduid=d2b84ccf43c40e18b95122b0b49f5cf091575090900; expires=Mon, 30-De
c-19 05:15:00 GMT; path=/; domain=.typicode.com; HttpOnly', 'X-Powered-By':
'Express', 'Vary': 'Origin, Accept-Encoding', 'Access-Control-Allow-Credentials': 't
rue', 'Cache-Control': 'max-age=14400', 'Pragma': 'no-cache', 'Expires': '-1', '
X-Content-Type-Options': 'nosniff', 'Etag': 'W/"160d-1eMSsxeJRfnVLRBmYJSbCiJZ1qQ
"', 'Content-Encoding': 'gzip', 'Via': '1.1 vegur', 'CF-Cache-Status': 'HIT',
'Age': '2271', 'Expect-CT': 'max-age=604800,
report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', 'Server': 'cloudflare', 'CF-RAY': '53da574f
f99fc331-SIN'}
要读取任何 http 标头,您可以按如下方式执行 −
getdata.headers["Content-Encoding"] // gzip
自定义标头
您还可以将标头发送到被调用的 URL,如下所示。
示例
import request
headers = {'x-user': 'test123'}
getdata = request.get('https://jsonplaceholder.typicode.com/users',
headers=headers)
传递的标头必须是字符串、字节串或 Unicode 格式。请求的行为不会根据传递的自定义标头而改变。
响应标头
当您在浏览器开发人员工具、网络选项卡中检查 URL 时,响应标头如下所示 −
要从请求模块获取标头的详细信息,请使用。Response.headers 如下所示 −
示例
import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users')
print(getdata.headers)
输出
E:\prequests>python makeRequest.py
{'Date': 'Sat, 30 Nov 2019 06:08:10 GMT', 'Content-Type': 'application/json;
charset=utf-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive',
'Set-Cookie': '__cfduid=de1158f1a5116f3754c2c353055694e0d1575094090; expires=Mon,
30-Dec-19 06:08:10 GMT; path=/; domain=.typicode.com; HttpOnly', 'X-Powered-By':
'Express', 'Vary': 'Origin, Accept-Encoding', 'Access-Control-Allow-Credentials': 't
rue', 'Cache-Control': 'max-age=14400', 'Pragma': 'no-cache', 'Expires': '-1', '
X-Content-Type-Options': 'nosniff', 'Etag': 'W/"160d-1eMSsxeJRfnVLRBmYJSbCiJZ1qQ
"', 'Content-Encoding': 'gzip', 'Via': '1.1 vegur', 'CF-Cache-Status': 'HIT',
'Age': '5461', 'Expect-CT': 'max-age=604800, report-uri="https://report-uri.cloudf
lare.com/cdn-cgi/beacon/expect-ct"', 'Server': 'cloudflare', 'CF-RAY': '53daa52f
3b7ec395-SIN'}
您可以按如下方式获取所需的任何特定标头 −
print(getdata.headers["Expect-CT"])
输出
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/exp
ect-ct
您还可以使用 get() 方法获取标头详细信息。
print(getdata.headers.get("Expect-CT"))
输出
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/exp
ect-ct
Requests - 处理 GET 请求
本章将重点介绍 GET 请求,这是最常见且最常用的请求。请求模块中 GET 的操作非常简单。这是一个使用 GET 方法处理 URL 的简单示例。
示例
import requests
getdata = requests.get('https://jsonplaceholder.typicode.com/users')
print(getdata.content)
getdata.content, will print all the data available in the response.
输出
E:\prequests>python makeRequest.py
b'[
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light
",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "
92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.149
6"
}
},
"phone": "1-770-736-8031 x56442",
"website":
"hildegard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhrase":
"Multi-layered client-server neural-net",
"bs":
"harness real-time e-markets"
}
}
您还可以使用 param 属性将参数传递给 get 方法,如下所示 −
import requests
payload = {'id': 9, 'username': 'Delphine'}
getdata = requests.get('https://jsonplaceholder.typicode.com/users',
params=payload)
print(getdata.content)
详细信息存储在对象有效负载中的键/值对中,并传递给 get() 方法内的 params。
输出
E:\prequests>python makeRequest.py
b'[
{
"id": 9,
"name": "Glenna Reichert",
"username": "Delphine",
"email": "Chaim_McDermott@dana.io",
"address": {
"street":
"Dayna Park",
"suite": "Suite 449",
"city": "Bartholomebury",
"zipcode": "76495-3109",
"geo": {
"lat": "24.6463",
"lng": "-168.8889"
}
},
"phone": "(775)976-6794 x41206",
"
website": "conrad.com",
"company": {
"name": "Yost and Sons",
"catchPhrase": "Switchable contextually-based project",
"bs": "aggregate
real-time technologies"
}
}
]'
处理 POST、PUT、PATCH 和 DELETE 请求
在本章中,我们将了解如何使用请求库中的 POST 方法以及如何将参数传递给 URL。
使用 POST
对于 PUT 请求,Requests 库有 request.post() 方法,其示例如下所示 −
导入 requests 请求
myurl = 'https://postman-echo.com/post'
myparams = {'name': 'ABC', 'email':'xyz@gmail.com'}
res = requests.post(myurl, data=myparams)
print(res.text)
输出
E:\prequests>python makeRequest.py
{"args":{},"data":"","files":{},"form":{"name":"ABC","email":"xyz@gmail.com"},
"headers":{"x-forwarded-proto":"https","host":"postman-echo.com","content-
length":"30","accept":"*/*","accept-encoding":"gzip,deflate","content-
type":"application/x-www-form-urlencoded","user-agent":"python-
requests/2.22.0","x-forwarded-
port":"443"},"json":{"name":"ABC","email":"xyz@gmail.com"},
"url":"https://postman-echo.com/post"}
在上面的示例中,您可以将表单数据作为键值对传递给requests.post()中的数据参数。我们还将了解如何在请求模块中使用PUT、PATCH和DELETE。
使用PUT
对于PUT请求,Requests库具有requests.put()方法,其示例如下所示。
import requests
myurl = 'https://postman-echo.com/put'
myparams = {'name': 'ABC', 'email':'xyz@gmail.com'}
res = requests.put(myurl, data=myparams)
print(res.text)
输出
E:\prequests>python makeRequest.py
{"args":{},"data":"","files":{},"form":{"name":"ABC","email":"xyz@gmail.com"},
"headers":{"x-forwarded-proto":"https","host":"postman-echo.com","content-
length":
"30","accept":"*/*","accept-encoding":"gzip, deflate","content-
type":"applicatio
n/x-www-form-urlencoded","user-agent":"python-requests/2.22.0","x-forwarded-
port
":"443"},"json":{"name":"ABC","email":"xyz@gmail.com"},
"url":"https://postman-echo.com/put"}
使用 PATCH
对于 PATCH 请求,Requests 库有 request.patch() 方法,其示例如下所示。
import requests
myurl = https://postman-echo.com/patch'
res = requests.patch(myurl, data="testing patch")
print(res.text)
输出
E:\prequests>python makeRequest.py
{"args":{},"data":{},"files":{},"form":{},"headers":{"x-forwarded-
proto":"https"
,"host":"postman-echo.com","content-length":"13","accept":"*/*","accept-
encoding
":"gzip, deflate","user-agent":"python-requests/2.22.0","x-forwarded-
port":"443"
},"json":null,"url":"https://postman-echo.com/patch"}
使用 DELETE
对于 DELETE 请求,Requests 库有 request.delete() 方法,其示例如下所示。
import requests
myurl = 'https://postman-echo.com/delete'
res = requests.delete(myurl, data="testing delete")
print(res.text)
输出
E:\prequests>python makeRequest.py
{"args":{},"data":{},"files":{},"form":{},"headers":{"x-forwarded-
proto":"https"
,"host":"postman-echo.com","content-length":"14","accept":"*/*","accept-
encoding
":"gzip, deflate","user-agent":"python-requests/2.22.0","x-forwarded-
port":"443"
},"json":null,"url":"https://postman-echo.com/delete"}
Requests - 文件上传
在本章中,我们将使用请求上传文件并读取已上传文件的内容。我们可以使用 files 参数执行此操作,如以下示例所示。
我们将使用 http://httpbin.org/post 上传文件。
示例
import requests
myurl = 'https://httpbin.org/post'
files = {'file': open('test.txt', 'rb')}
getdata = requests.post(myurl, files=files)
print(getdata.text)
Test.txt
File upload test using Requests
输出
E:\prequests>python makeRequest.py
{
"args": {},
"data": "",
"files": {
"file": "File upload test using Requests"
},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "175",
"Content-Type": "multipart/form-data;
boundary=28aee3a9d15a3571fb80d4d2a94bfd33",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.22.0"
},
"json": null,
"origin": "117.223.63.135, 117.223.63.135",
"url": "https://httpbin.org/post"
}
也可以发送如下所示的文件内容−
示例
import requests
myurl = 'https://httpbin.org/post'
files = {'file': ('test1.txt', 'Welcome to TutorialsPoint')}
getdata = requests.post(myurl, files=files)
print(getdata.text)
输出
E:\prequests>python makeRequest.py
{
"args": {},
"data": "",
"files": {
"file": "Welcome to TutorialsPoint"
},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "170",
"Content-Type": "multipart/form-data;
boundary=f2837238286fe40e32080aa7e172be4f",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.22.0"
},
"json": null,
"origin": "117.223.63.135, 117.223.63.135",
"url": "https://httpbin.org/post"
}
Requests - 使用 Cookies
本章将讨论如何处理 cookies。您可以使用请求库在调用 URL 时获取 cookie 以及发送 cookie。
url,https://jsonplaceholder.typicode.com/users,当在浏览器中点击时,我们可以获得 cookie 的详细信息,如下所示 −
您可以读取 cookie,如下所示 −
示例
import request
getdata = 请求。获取('https://jsonplaceholder.typicode.com/users')
print(getdata.cookies["__cfduid"])
输出
E:\prequests>python makeRequest.py
d1733467caa1e3431fb7f768fa79ed3741575094848
您也可以在我们发出请求时发送 cookie。
示例
import request
cookies = dict(test='test123')
getdata = request.get('https://httpbin.org/cookies',cookies=cookies)
print(getdata.text)
输出
E:\prequests>python makeRequest.py
{
"cookies": {
"test": "test123"
}
}
Requests - 处理错误
本章将讨论如何处理使用 Http 请求库时出现的错误。始终管理所有可能情况的错误是一种很好的做法。
错误异常
请求模块提供以下类型的错误异常 −
ConnectionError − 如果出现任何连接错误,则会引发此异常。例如,网络失败、DNS 错误,因此请求库将引发 ConnectionError 异常。
Response.raise_for_status() − 根据状态代码(即 401、404),它将为请求的 URL 引发 HTTPError。
HTTPError − 如果对所发出的请求的响应无效,则会引发此错误。
超时 −请求的 URL 超时引发错误。
TooManyRedirects − 如果超出最大重定向限制,则会引发 TooManyRedirects 错误。
示例
以下是超时错误的示例 −
import requests
getdata =
requests.get('https://jsonplaceholder.typicode.com/users',timeout=0.001)
print(getdata.text)
输出
raise ConnectTimeout(e, request=request)
requests.exceptions.ConnectTimeout:
HTTPSConnectionPool(host='jsonplaceholder.ty
picode.com', port=443): Max retries exceeded with url: /users (Caused
by Connect
TimeoutError( 0x000000B02AD E76A0>, 'Connection to jsonplaceholder.typicode.com timed out. (connect timeout = 0.001)')) Requests - 处理超时 您可以轻松将超时添加到您请求的 URL。碰巧的是,您正在使用第三方 URL 并等待响应。为 URL 提供超时始终是一种很好的做法,因为我们可能希望 URL 在一定时间范围内响应或错误。不这样做可能会导致无限期地等待该请求。 我们可以使用超时参数为 URL 提供超时,并以秒为单位传递值,如下例所示 − 示例 import requests getdata = requests.get('https://jsonplaceholder.typicode.com/users',timeout=0.001) print(getdata.text) 输出 raise ConnectTimeout(e, request=request) requests.exceptions.ConnectTimeout: HTTPSConnectionPool(host='jsonplaceholder.typicode.com', port=443): Max retries exceeded with url: /users (Caused by Connect TimeoutError( 0x000000B02AD E76A0>, 'Connection to jsonplaceholder.typicode.com timed out. (connect timeout = 0.001)')) 给出的超时如下 − getdata = requests.get('https://jsonplaceholder.typicode.com/users',timeout=0.001) 执行抛出连接超时错误,如输出所示。给出的超时为 0.001,请求无法返回响应并抛出错误。现在,我们将增加超时并检查。 示例 import requests getdata = requests.get('https://jsonplaceholder.typicode.com/users',timeout=1.000) print(getdata.text) 输出 E:\prequests>python makeRequest.py [ { "id": 1, "name": "Leanne Graham", "username": "Bret", "email": "Sincere@april.biz", "address": { "street": "Kulas Light", "suite": "Apt. 556", "city": "Gwenborough", "zipcode": "92998-3874", "geo": { "lat": "-37.3159", "lng": "81.1496" } }, "phone": "1-770-736-8031 x56442", "website": "hildegard.org", "company": { "name": "Romaguera-Crona", "catchPhrase": "Multi-layered client-server neural-net", "bs": "harness real-time e-markets" } } ] 超时 1 秒后,我们可以获得所请求 URL 的响应。 Requests - 处理重定向 本章将介绍 Request 库如何处理 URL 重定向情况。 示例 import 请求 getdata = request.get('http://google.com/') print(getdata.status_code) print(getdata.history) URL:http://google.com 将使用状态代码 301(永久移动)重定向到 https://www.google.com/。重定向将被保存在历史记录中。 输出 执行上述代码后,我们得到以下结果 − E:\prequests>python makeRequest.py 200 [ 您可以使用 allow_redirects = False 停止 URL 重定向。可以在使用的 GET、POST、OPTIONS、PUT、DELETE、PATCH 方法上执行此操作。 示例 以下是相同的示例。 import requests getdata = request.get('http://google.com/', allow_redirects=False) print(getdata.status_code) print(getdata.history) print(getdata.text) 现在,如果您检查输出,重定向将不被允许,并将获得状态代码 301。 输出 E:\prequests>python makeRequest.py 301 []
301 Moved
The document has moved
here.
Requests - 处理历史记录
您可以使用 response.history 获取给定 URL 的历史记录。如果给定的 URL 有任何重定向,则该重定向将存储在历史记录中。
对于历史记录
import requests
getdata = requests.get('http://google.com/')
print(getdata.status_code)
print(getdata.history)
输出
E:\prequests>python makeRequest.py
200
[
response.history 属性将包含根据请求完成的响应对象的详细信息。存在的值将按从最旧到最新的顺序排序。response.history 属性跟踪对请求的 URL 执行的所有重定向。
Requests - 处理会话
要维护请求之间的数据,您需要会话。因此,如果一次又一次地调用同一主机,您可以重用 TCP 连接,从而提高性能。现在让我们看看如何在使用会话发出的请求之间维护 cookie。
使用会话添加 cookie
import requests
req = requests.Session()
cookies = dict(test='test123')
getdata = req.get('https://httpbin.org/cookies',cookies=cookies)
print(getdata.text)
输出
E:\prequests>python makeRequest.py
{
"cookies": {
"test": "test123"
}
}
使用会话,您可以跨请求保存 cookie 数据。也可以使用会话传递标头数据,如下所示 −
示例
import requests
req = requests.Session()
req.headers.update({'x-user1': 'ABC'})
headers = {'x-user2': 'XYZ'}
getdata = req.get('https://httpbin.org/headers', headers=headers)
print(getdata.headers)
Requests - SSL 证书
SSL 证书是安全 URL 附带的安全功能。当您使用 Requests 库时,它还会验证给定的 https URL 的 SSL 证书。默认情况下,请求模块中启用了 SSL 验证,如果证书不存在,则会抛出错误。
使用安全 URL
以下是使用安全 URL 的示例 −
import requests
getdata = requests.get(https://jsonplaceholder.typicode.com/users)
print(getdata.text)
输出
E:\prequests>python makeRequest.py
[
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
"phone": "1-770-736-8031 x56442",
"website": "hildegard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhrase": "Multi-layered client-server neural-net",
"bs": "harness real-time e-markets"
}
}
]
我们很容易从上面的 https URL 获得响应,这是因为请求模块可以验证 SSL 证书。
您可以通过简单地添加 verify=False 来禁用 SSL 验证,如下例所示。
示例
import request
getdata =
requests.get('https://jsonplaceholder.typicode.com/users', verify=False)
print(getdata.text)
您将获得输出,但它也会给出一条警告消息,指出 SSL 证书未经验证,建议添加证书验证。
输出
E:\prequests>python makeRequest.py
connectionpool.py:851: InsecureRequestWarning: Unverified HTTPS request is
being made. Adding certificate verification is strongly advised. See:
https://urllib3
.readthedocs.io/en/latest/advanced-usage.htm l#ssl-warnings
InsecureRequestWarning)
[
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
"phone": "1-770-736-8031 x56442",
"website": "hildegard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhrase": "Multi-layered client-server neural-net",
"bs": "harness real-time e-markets"
}
}
]
您还可以通过在您的终端托管 SSL 证书并使用 verify 参数提供路径来验证证书,如下所示。
示例
import requests
getdata =
requests.get('https://jsonplaceholder.typicode.com/users', verify='C:\Users\AppData\Local\certificate.txt')
print(getdata.text)
输出
E:\prequests>python makeRequest.py
[
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
"phone": "1-770-736-8031 x56442",
"website": "hildegard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhrase": "Multi-layered client-server neural-net",
"bs": "harness real-time e-markets"
}
}
]
Requests - 身份验证
本章将讨论请求模块中可用的身份验证类型。
我们将讨论以下内容 −
HTTP 请求中的身份验证工作
基本身份验证
摘要身份验证
OAuth2 身份验证
HTTP 请求中的身份验证工作
HTTP 身份验证是在服务器端进行的,当客户端请求 URL 时,会要求提供一些身份验证信息,如用户名、密码。这是客户端和服务器之间交换的请求和响应的额外安全性。
从客户端,这些额外的身份验证信息(即用户名和密码)可以在标头中发送,稍后将在服务器端进行验证。仅当身份验证有效时,才会从服务器端传递响应。
Requests 库在 request.auth 中有最常用的身份验证,即基本身份验证 (HTTPBasicAuth) 和摘要身份验证 (HTTPDigestAuth)。
基本身份验证
这是向服务器提供身份验证的最简单形式。要使用基本身份验证,我们将使用请求库中提供的 HTTPBasicAuth 类。
示例
这是一个如何使用它的工作示例。
import requests
from requests.auth import HTTPBasicAuth
response_data =
requests.get('httpbin.org/basic-auth/admin/admin123',
auth = HTTPDigestAuth('admin', 'admin123'))
print(response_data.text)
我们正在调用 URL,https://httpbin.org/basic-auth/admin/admin123,用户为 admin,密码为 admin123。
因此,如果没有身份验证(即用户和密码),此 URL 将无法工作。一旦您使用 auth 参数进行身份验证,则只有服务器会返回响应。
输出
E:\prequests>python makeRequest.py
{
"authenticated": true,
"user": "admin"
}
摘要式身份验证
这是请求中可用的另一种身份验证形式。我们将利用请求中的 HTTPDigestAuth 类。
示例
import requests
from requests.auth import HTTPDigestAuth
response_data =
requests.get('https://httpbin.org/digest-auth/auth/admin/admin123',
auth = HTTPDigestAuth('admin', 'admin123'))
print(response_data.text)
输出
E:\prequests>python makeRequest.py
{
"authenticated": true,
"user": "admin"
}
OAuth2 身份验证
要使用 OAuth2 身份验证,我们需要"requests_oauth2"库。要安装"requests_oauth2",请执行以下操作 −
pip install request_oauth2
安装时终端中的显示内容将如下所示 −
E:\prequests>pip install requests_oauth2
Collecting requests_oauth2
Downloading https://files.pythonhosted.org/packages/52/dc/01c3c75e6e7341a2c7a9
71d111d7105df230ddb74b5d4e10a3dabb61750c/requests-oauth2-0.3.0.tar.gz
Requirement already satisfied: requests in c:\users\xyz\appdata\local\programs
\python\python37\lib\site-packages (from requests_oauth2) (2.22.0)
Requirement already satisfied: six in c:\users\xyz\appdata\local\programs\pyth
on\python37\lib\site-packages (from requests_oauth2) (1.12.0)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in c:\use
rs\xyz\appdata\local\programs\python\python37\lib\site-packages (from requests
->requests_oauth2) (1.25.3)
Requirement already satisfied: certifi>=2017.4.17 in c:\users\xyz\appdata\loca
l\programs\python\python37\lib\site-packages (from requests->requests_oauth2) (2
019.3.9)
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in c:\users\xyz\appdata\l
ocal\programs\python\python37\lib\site-packages (from requests->requests_oauth2)
(3.0.4)
Requirement already satisfied: idna<2.9,>=2.5 in c:\users\xyz\appdata\local\pr
ograms\python\python37\lib\site-packages (from requests->requests_oauth2) (2.8)
Building wheels for collected packages: requests-oauth2
Building wheel for requests-oauth2 (setup.py) ... done
Stored in directory: C:\Users\xyz\AppData\Local\pip\Cache\wheels\90\ef\b4\43
3743cbbc488463491da7df510d41c4e5aa28213caeedd586
Successfully built requests-oauth2
我们已安装"requests-oauth2"。要使用 Google、Twitter 的 API,我们需要获得其同意,使用 OAuth2 身份验证也是如此。
对于 OAuth2 身份验证,我们需要客户端 ID 和密钥。如何获取它的详细信息,请参阅https://developers.google.com/identity/protocols/OAuth2。
稍后,登录 Google API 控制台(位于 https://console.developers.google.com/)并获取客户端 ID 和密钥。
示例
以下是如何使用"requests-oauth2"的示例。
import requests
from requests_oauth2.services import GoogleClient
google_auth = GoogleClient(
client_id="xxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
redirect_uri="http://localhost/auth/success.html",
)
a = google_auth.authorize_url(
scope=["profile", "email"],
response_type="code",
)
res = requests.get(a)
print(res.url)
我们将无法重定向到给定的 URL,因为它需要登录 Gmail 帐户,但在这里,您将从示例中看到,google_auth 有效并且给出了授权的 URL。
输出
E:\prequests>python oauthRequest.py
https://accounts.google.com/o/oauth2/auth?redirect_uri=
http%3A%2F%2Flocalhost%2Fauth%2Fsuccess.html&
client_id=xxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com&
scope=profile+email&response_type=code
Requests - 事件钩子
我们可以使用事件钩子将事件添加到请求的 URL。在下面的示例中,我们将添加一个回调函数,该函数将在响应可用时被调用。
示例
要添加回调,我们需要使用钩子参数,如下例所示 −
import requests
def printData(r, *args, **kwargs):
print(r.url)
print(r.text)
getdata = requests.get('https://jsonplaceholder.typicode.com/users',
hooks={'response': printData})
输出
E:\prequests>python makeRequest.py
https://jsonplaceholder.typicode.com/users
[
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
"phone": "1-770-736-8031 x56442",
"website": "hildegard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhrase": "Multi-layered client-server neural-net",
"bs": "harness real-time e-markets"
}
}
]
您还可以调用多个回调函数,如下所示 −
示例
import requests
def printRequestedUrl(r, *args, **kwargs):
print(r.url)
def printData(r, *args, **kwargs):
print(r.text)
getdata = requests.get('https://jsonplaceholder.typicode.com/users',
hooks = {'response': [printRequestedUrl, printData]})
输出
E:\prequests>python makeRequest.py
https://jsonplaceholder.typicode.com/users
[
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
"phone": "1-770-736-8031 x56442",
"website": "hildegard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhrase": "Multi-layered client-server neural-net",
"bs": "harness real-time e-markets"
}
}
]
您还可以将钩子添加到创建的会话中,如下所示 −
示例
import requests
def printData(r, *args, **kwargs):
print(r.text)
s = requests.Session()
s.hooks['response'].append(printData)
s.get('https://jsonplaceholder.typicode.com/users')
输出
E:\prequests>python makeRequest.py
[
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
"phone": "1-770-736-8031 x56442",
"website": "hildegard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhrase": "Multi-layered client-server neural-net",
"bs": "harness real-time e-markets"
}
}
]
Requests - 代理
到目前为止,我们已经看到客户端直接连接并与服务器通信。使用代理,交互如下 −
客户端向代理发送请求。
代理将请求发送到服务器。
服务器将响应发送回代理。
代理将响应发送回客户端。
使用 Http 代理是分配的额外安全性,用于管理客户端和服务器之间的数据交换。请求库还可以通过使用代理参数来处理代理,如下所示 −
示例
import requests
proxies = {
'http': 'http://localhost:8080'
}
res = requests.get('http://httpbin.org/', proxies=proxies)
print(res.status_code)
请求将路由到 http://localhost:8080 URL。
输出
200
Requests - 使用请求进行 Web 抓取
我们已经了解了如何使用 Python 请求库从给定 URL 获取数据。我们将尝试从 Tutorialspoint 网站抓取数据,该网站位于 https://www.tutorialspoint.com/tutorialslibrary.htm,使用以下 −
请求库
来自 Python 的 Beautiful soup 库
我们已经安装了请求库,现在让我们安装 Beautiful soup 包。如果您想了解 beautiful soup 的更多功能,请访问以下网址:https://www.crummy.com/software/BeautifulSoup/bs4/doc/。
安装 Beautifulsoup
我们将在下面看到如何安装 Beautiful Soup−
E:\prequests>pip install beautifulsoup4
Collecting beautifulsoup4
Downloading https://files.pythonhosted.org/packages/3b/c8/a55eb6ea11cd7e5ac4ba
cdf92bac4693b90d3ba79268be16527555e186f0/beautifulsoup4-4.8.1-py3-none-any.whl
(
101kB)
|████████████████████████████████| 102kB 22kB/s
Collecting soupsieve>=1.2 (from beautifulsoup4)
Downloading https://files.pythonhosted.org/packages/81/94/03c0f04471fc245d08d0
a99f7946ac228ca98da4fa75796c507f61e688c2/soupsieve-1.9.5-py2.py3-none-any.whl
Installing collected packages: soupsieve, beautifulsoup4
Successfully installed beautifulsoup4-4.8.1 soupsieve-1.9.5
现在我们已安装好 Python 请求库和 Beautiful Soup。
现在让我们编写代码,从给定的 URL 中抓取数据。
网页抓取
import requests
from bs4 import BeautifulSoup
res = requests.get('https://www.tutorialspoint.com/tutorialslibrary.htm')
print("The status code is ", res.status_code)
print("
")
soup_data = BeautifulSoup(res.text, 'html.parser')
print(soup_data.title)
print("
")
print(soup_data.find_all('h4'))
使用请求库,我们可以从给定的 URL 获取内容,而 beautiful soup 库可以帮助解析它并按照我们想要的方式获取详细信息。
您可以使用 beautiful soup 库通过 Html 标签、类、id、css 选择器等多种方式获取数据。以下是我们得到的输出,其中我们打印了页面的标题以及页面上的所有 h4 标签。
输出
E:\prequests>python makeRequest.py
The status code is 200
[
Academic
,Computer Science
,Digital Marketing
,Monuments
,Machine Learning
,Mathematics
,Mobile Development
,SAP
,Software Quality
,Big Data & Analytics
,Databases
,Engineering Tutorials
,Mainframe Development
,Microsoft Technologies
,Java Technologies
,XML Technologies
,Python Technologies
,Sports
,Computer Programming
,DevOps
,Latest Technologies
,Telecom
,Exams Syllabus
,UPSC IAS Exams
,Web Development
,Scripts
,Management
,Soft Skills
,Selected Reading
,Misc
]❮ Requests 使用请求进行 Web 抓取
Requests 有用的资源 ❯