Python技术教程之request模块
1.1 简介
Python 内置了 requests 模块,该模块主要用来发 送 HTTP 请求,requests 模块比 urllib 模块更简洁。requests是使用Apache2 licensed 许可证的HTTP库。Request支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POST数据自动编码。在python内置模块的基础上进行了高度的封装,从而使得python进行网络请求时,变得人性化,使用Requests可以轻而易举的完成浏览器可有的任何操作。当然,requests模块国际化,友好。requests会自动实现持久连接keep-alive。
上面写了一大堆,简单总结来说,如下:
- 简洁
- 支持HTTP连接和连接池,自动实现长连接
- 支持cookie
- 支持文件上传
- 支持响应内容的编码
- 支持国际化
🎈1.2 安装
从以前学习的,可以知道这个库很容易安装,在Mac下,打开终端,如下:
# 查看已经安装的库
Aion.Liu $ pip list
Package Version
---------- -------
meson 0.63.0
pip 22.2.2
protobuf 4.21.4
pymongo 4.2.0
PyMySQL 1.0.2
pypi 2.1
setuptools 63.2.0
xlrd 2.0.1
xlwt 1.3.0
xmltodict 0.13.0
# 安装requests库
Aion.Liu $ pip install requests
Collecting requests
Using cached requests-2.28.1-py3-none-any.whl (62 kB)
Collecting certifi>=2017.4.17
Downloading certifi-2022.6.15-py3-none-any.whl (160 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 160.2/160.2 kB 360.7 kB/s eta 0:00:00
Collecting idna<4,>=2.5
Downloading idna-3.3-py3-none-any.whl (61 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 61.2/61.2 kB 160.3 kB/s eta 0:00:00
Collecting charset-normalizer<3,>=2
Downloading charset_normalizer-2.1.0-py3-none-any.whl (39 kB)
Collecting urllib3<1.27,>=1.21.1
Downloading urllib3-1.26.11-py2.py3-none-any.whl (139 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 139.9/139.9 kB 69.9 kB/s eta 0:00:00
Installing collected packages: urllib3, idna, charset-normalizer, certifi, requests
Successfully installed certifi-2022.6.15 charset-normalizer-2.1.0 idna-3.3 requests-2.28.1 urllib3-1.26.11
现在,我们已经安装了requests模块,下面开始更详细的了解他。
🏮2 requests模块详操
🎈2.1 resquests属性和方法
|
属性和方法 |
备注 |
|
delete(url, args) |
发送 DELETE 请求到指定 url |
|
get(url, params, args) |
发送 GET 请求到指定 url |
|
head(url, args) |
发送 HEAD 请求到指定 url |
|
patch(url, data, args) |
发送 PATCH 请求到指定 url |
|
post(url, data, json, args) |
发送 POST 请求到指定 url |
|
put(url, data, args) |
发送 PUT 请求到指定 url |
|
request(method, url, args) |
向指定的 url 发送指定的请求方法 |
🎈2.2 response属性和方法
|
属性和方法 |
备注 |
|
apparent_encoding |
编码方式 |
|
close() |
关闭与服务器的连接 |
|
response.content |
返回响应的内容,字节(byte)为单位的数据 |
|
response.text |
返回响应的内容,字符串unicode 类型数据 |
|
response.content.decode |
解决中文乱码,默认utf-8,其他的编码类型gbk、gb2312、asci、iso-8859-1、 |
|
cookies |
返回一个 CookieJar 对象,包含了从服务器发回的 cookie |
|
elapsed |
返回一个 timedelta 对象,包含了从发送请求到响应到达之间经过的时间量,可以用于测试响应速度。比如 r.elapsed.microseconds 表示响应到达需要多少微秒。 |
|
encoding |
解码 r.text 的编码方式 |
|
headers |
返回响应头,字典格式 |
|
history |
返回包含请求历史的响应对象列表(url) |
|
is_permanent_redirect |
如果响应是永久重定向的 url,则返回 True,否则返回 False |
|
is_redirect |
如果响应被重定向,则返回 True,否则返回 False |
|
iter_content() |
迭代响应 |
|
iter_lines() |
迭代响应的行 |
|
json() |
返回结果的 JSON 对象 (结果需要以 JSON 格式编写的,否则会引发错误) |
|
links |
返回响应的解析头链接 |
|
next |
返回重定向链中下一个请求的 PreparedRequest 对象 |
|
ok |
检查 “status_code” 的值,如果小于400,则返回 True,如果不小于 400,则返回 False |
|
raise_for_status() |
如果发生错误,方法返回一个 HTTPError 对象 |
|
reason |
响应状态的描述,比如 “Not Found” 或 “OK” |
|
request |
返回请求此响应的请求对象 |
|
status_code |
返回 http 的状态码,比如 404 和 200(200 是 OK,404 是 Not Found) |
|
url |
返回响应的 URL |
简单实验下,如下:
# 导入库,引入依赖 >>> import requests >>> >>> url = "http://www.baidu.com" >>> >>> response = requests.get(url) # 获取请求 >>> print(response) # 请求返回值的类型 >>> print(type(response)) # 请求返回值的响应编码 >>> print(response.status_code) 200 # 请求返回值内容类型 >>> print(type(response.text)) <class 'str'> # 请求返回值的cookies >>> print(response.cookies) # 请求返回值的文本内容 >>> print(response.text)
有些属性没有罗列出来,可以实验性的测试下。
🎈2.3 GET请求|发送带headers参数请求
- 1)查看浏览器请求头部信息
打开百度,然后使用快捷键F12打开,或者任意一个网页任意处右键打开检查。
- 2)依次打开网络(Network)==> 名称(Name) ==> 标头(Headers) ==> User-Agent

可以看到请求头信息:User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36
- 3)实验代码
headers接收字典类型的参数作为请求头,请求头部字段作为key,字段对应的值作为value。具体的实验代码如下:
>>> import requests
# 目标网址
>>> url = "http://www.baidu.com/"
# 构建请求头字典,最重要的就是User-Agent
# 如果需要其他请求头,就在headers字典中加上
>>> headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'}
# 发送请求获取响应
>>> response = requests.get(url,headers=headers)
>>> print(response.text)
2.4 GET请求|发送带参数的请求
/s是百度搜索的 “入口路径”(官方定死);wd是百度搜索的 “关键词参数名”(官方定死);kw是你自己的 “参数字典变量名”(随便改)。
- 删除网页多余的参数,简化搜索
第二个URL:https://www.baidu.com/s?word=python
- 方式一:网页带参数
>>> import requests
# 目标网址
>>> url = "https://www.baidu.com/s?wd=python"
>>> headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'}
# 发送请求获取响应
>>> response = requests.get(url,headers=headers)
>>> print(response.text)
- 方式二:通过
params构造参数字典
>>> import requests
# 目标网址
>>> url = "https://www.baidu.com/s?"
>>> headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'}
# 请求参数是一个字典
>>> kw = {'wd': 'python'}
# 发送请求的时候设置参数字典,获取响应
>>> response = requests.get(url, headers=headers, params=kw)
>>> print(response.text)
🎈2.5 发送带参数的请求|携带cookie
首先找到cookie,找到cookie的步骤如下,网络 ==> 名称 ==> 请求标头,找到Cookie,这个便是要找到的值。

2.6 超时参数timeout
背景: 请求很久没有结果,网页一直在Loading,在爬虫中,这个就降低了我们的效率。这个时候我们需要对请求进行强制要求,让请求在特定的时间内返回结果,否则报错。
import requests
#url:就是平时我们使用的网址;
url="http://www.baidu.com/s"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
}#发送请求获取响应
#请求参数,设置成字典;
kw={'wd':'python'}
response=requests.get(url,headers=headers,timeout=10)
for i in range(4):
response=requests.get(url,headers=headers,timeout=20)
if response.status_code==200:
break
if response and response.status_code == 200:
html_str = response.content.decode('utf-8')
print(html_str)
else:
print("所有访问尝试都失败了!")
html_str = "" # 避免变量未定义
print(html_str)
备注:r = requests.get('url',timeout=1) #设置秒数超时,仅对于连接有效。
- 点赞
- 收藏
- 关注作者

评论(0)