请求库之requests库
request 模块基本使用
安装
pip install requests
1.发送http请求
# get,delete,post 本质都是调用request函数 ret = requests.get('http://www.baidu.com') print(ret.status_code) # 响应状态码 print(ret.text) # 响应体,转成了字符串 print(ret.content) # 响应体,二进制,比如图片视频 ret = requests.post('https://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3')
2. get请求带参数
# 方式一 response=requests.get('http://127.0.0.1:8000/?name=bh', headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36', 'cookie':'islogin=xxx;key2=value' }) print(response.text) # 方式二(推荐) 中文会自动转码 ret = requests.get('http://127.0.0.1:8000/',params={'name':'美女','age':18}, cookies={'islogin':'xxx'}) print(ret.text)
3.发送post请求(注册,登录) 携带数据(body)
# data=None,json=None # data:urlencoded编码 ret = requests.post('http://127.0.0.1:8000/',data={'name':'hank','age':18}) # json:json编码 import json data = json.dumps({'name':'hank','age':18}) ret = requests.post('http://127.0.0.1:8000/',data=data) print(ret) # 注意:编码格式是请求头中带的,所有可以在headers中手动修改
4.session对象
session=requests.session() # 跟requests.get/post用起来完全一样,但是它处理了cookie # 假设是一个登陆,并且成功 session.post() # 再向该网站发请求,就是登陆状态,不需要手动携带cookie session.get("地址")
5.响应对象
print(response.text) # 响应体转成str print(response.content) # 响应体二进制(图片,视频) print(response.status_code) # 响应状态码 print(response.headers) # 响应头 print(response.cookies) # 服务端返回的cookie print(response.cookies.get_dict()) # 转成字典 print(response.cookies.items()) print(response.url) # 当次请求的地址 print(response.history) # 如果有重定向,将重定向的地址放到一个列表中 print(response.encoding) # 编码方式 response.iter_content() # 视频,图片迭代取值 with open("a.mp4",'wb') as f: for line in response.iter_content(): f.write(line)
6.乱码问题
# 加载回来的页面,打印出来乱码(我们用的是utf8编码),如果网站用gbk, ret.encoding='gbk' ret=requests.get('http://127.0.0.1:8000/user') # # ret.apparent_encoding拿到当前页面的编码 ret.encoding=ret.apparent_encoding
7.解析json
et = requests.get('http://127.0.0.1:8000/') print(type(ret.text)) print(ret.text) a=ret.json() print(a['name']) print(type(a))
8.使用代理
# 正向代理 # django如何拿到客户端ip地址 META.get("REMOTE_ADDR") ret=requests.get('http://127.0.0.1:8000/',proxies={'http':'地址'}) print(type(ret.text)) print(ret.text) ## 代理 # 网上会有免费代理,不稳定 # 使用代理有什么用? # drf:1分钟只能访问6次,限制ip # 每次发请求都使用不同代理,random一下 # 代理池:列表,其实就是代理池的一种 import requests ret=requests.get('https://www.cnblogs.com/',proxies={'http':'222.85.28.130:40505'}) print(ret.text) #高匿:服务端,根本不知道我是谁 #普通:服务端是能够知道我的ip的 # http请求头中:X-Forwarded-For:代理的过程 ret=requests.get('http://101.133.225.166:8080',proxies={'http':'114.99.54.65:8118'}) print(ret.text)
9.上传文件
file={'myfile':open('1.txt','rb')} ret =requests.post('http://127.0.0.1:8000/',files=file) print(ret.content)
requests库的十三个参数
params
:字典或字节序列,作为参数增加到链接中data
:字典,字节序列或文件对象,作为请求的内容json
:JSON格式的数据,作为Request的内容headers
:字典,HTTP定制头(模拟浏览器进行访问)cookies
:字典或CpplieJar,Request中的cookieauth
:元祖,支持HTTP认证功能files
:字典类型,传输文件timeout
:设定超时时间,秒为单位proxies
:字典类型,设定访问代理服务器,可以增加登陆认证allow_redirects
:True//False,默认为True,重定向开关stream
:True/False,默认为True,获取内容立即下载开关verify
:True/False,默认为True,认证SSL证书开关cert
:本地SSL证书路径