Requests库的使用
一,简介
基于 urllib3 开发,更简单,更优雅
-
中文文档:http://cn.python-requests.org/zh_CN/latest/
-
英文文档:http://docs.python-requests.org/en/master/api/
Request作者:千万不要给自己懒散的生活态度,找任何借口,你可以变得更棒!只要愿意去追求,我们都能变成我们想要的样子
二,发起请求
每个请求方法都有一个对应的 API
-
requests.get()
GET请求import request args = { 'username': '邢益斌', # 1, url 路径参数传参,会自动解析中文 'password': '123456', } params = { 'username': '邢益斌', # 1, url 路径参数传参,会自动解析中文(能行) 'password': '123456', } headers = { 'referer': 'https://blog.csdn.net/jasonLee_lijiaqi/article/details/80312240', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' , } # 2, 构造请求头 cookies = { 'Session_id': '123456' # 3, 构造cookie } proxy ={ 'http': '175.25.36.18' # 4, 设置代理 } response = requests.get( 'http://httpbin.org/get', args=args, # 传入 url 路径参数 params=params, # 传入 url 路径参数(能行) header=headers, # 传入请求头 cookies=cookies, # 传入 cookies proxies=proxy, # 传入代理 ) print(response.encoding) # 查看该 response 编码方法,若为None,则会自动猜测 print(response.request.headars) # 查看 request 的请求头 response.encoding = 'utf-8' # 设置编码 print(response.text) # 获取文本,并且直接帮我们解码成字符串 print(response.request.url) # 查看 url --> 也可以写response.url
-
requests.post()
POST请求info = { 'username': 'xyb', # 5, POST 方法上传,上传form表单参数 'password': '123456' } resp = requests.post('http://httpbin.org/post',data=info)
-
其他请求接口
( put, delete, head, options )
resp = requests.put('http://httpbin.org/put', data={'key': 'value'}) resp = requests.delete('http://httpbin.org/delete') resp = requests.head('http://httpbin.org/get') resp = requests.options('http://httpbin.org/get')
-
默认重定向
# 在网络请求中,我们常常会遇到状态码是3开头的重定向问题,在Requests中默认是开启允许重定向,即遇到重定向时,会自动访问 resp = requests.get('http://github.com', allow_redirects=False) # 取消重定向 print(resp.url) # 重定向之后访问的网页是 https://github.com, 这里取消了重定向,所以 url 还是http://github.com print(resp.headers) # 查看响应头 {’Content-length‘: '0', 'Location': 'https://github.com/'} Location就是重定向跳去的地址
-
禁止证书认证
request.get('https://quanshuwang.com', verify=False) # 跳过证书验证(有些https网站证书过期不安全不能访问,跳过验证) # 但是关闭验证后会有一个烦人的warning验证 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 InsecureRequestWarning) # ---------------------关闭验证------------------
-
设置超时
request.get('https://quanshu1wang.com', timeout=0.0001) # 响应超过这个时间报错,单位秒
三,接收响应
发起请求后会得到一个 request.models.Response对象,就是响应
-
获取响应内容
response.text
, 获得字符串相应格式的响应内容resp = requests.get('http://www.httpbin.org.com') resp.encoding = 'gbk/utf-8' # 如果返回乱码, 切换编码方式 print(resp.text) # 获取响应内容,转换成文本格式
-
获取响应二进制内容
response.content
resp = requests.get('https://www.dwadidu.com/2.jpg') with open(r'1.jpg', 'wb') as f: f.write(resp.content) # 把图片二进制数据写入文件
-
获取Json格式的数据
response.json()
resp = requests.get('http://www.httpbin.org/get') # 取消重定向 print(resp.json()) # 将数据转换成 Json 格式 print(type(resp.json())) # 字典格式数据 <class 'dict'>
-
获取状态码
response.status_code
resp = requests.get('http://www.httpbin.org/get') print(resp.status_code) # 状态码 200
-
查看 响应头, cookie, url
resp = requests.post('http://www.baidu.com') print(resp.headers) # 打印响应头 print(resp.cookies.items()) # 打印 cookie print(resp.url) # 查看访问的 url
四,Session对象
最大的好处就是不会和网页断开链接,基于底层TCPip协议的重用(帮你自动处理cookie)
在Requests中,实现了Session(会话)功能,当我们使用Session时,能够像浏览器一样,在没有关闭关闭浏览器时,能够保持住访问的状态。------------------------》》
可以理解向同一个人打电话问问题,request请求就像你问一个问题,挂一次电话再重打问问题
session请求就像打一个电话,把所有的问题问完,性能很快
import time
import request
session = requests.session()
start_time = time.time()
for i in range(50):
# requests.get('https://www.baidu.com') # 6.9秒
session.get('https://www.baidu.com') # 1.8秒
-----------------------------session的速度非常的快------------------------------------
print("请求50次一共用时{}秒".format(time.time()-start_time))
五,流下载
通常下载视频先把所有数据存在一个变量,再写入本地,流下载可以一边读取,一边下载
流下载好处:
- 对于大文件,减少内存消耗,可以读取一点,写入一点,不必全部读取再写入
- 对于视频,边读,边写入,不必担心网络突然出现波动,读取多少写入多少
import time
url = 'https://rainymood.com/audio1110/0.m4a'
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.3"
"6 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
}
start_time = time.time() # 开始时间
response = requests.get(url=url, headers=headers, stream=True)
f = open('雨点.m4a', 'wb')
for chunk in response.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
print("下载视频一共用了{}秒".format(time.time()-start_time))