Requests库
Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库
如果你看过上篇文章关于urllib库的使用,你会发现,其实urllib还是非常不方便的,而Requests它会比urllib更加方便,可以节约我们大量的工作。(用了requests之后,你基本都不愿意用urllib了)一句话,requests是python实现的最简单易用的HTTP库,建议爬虫使用requests库。
字节流数据处理
#字节流处理 import requests url = 'https://i.blingabc.com/' response = requests.get(url) print(response.content.decode('utf-8')) #如果返回数据是二进制字节流数据,增加urf-8编码
返回tex和json数据的区别:
print(r.text) :客户端请求服务端,服务端返回的任何格式数据都是可以的 print(r.json) :客户端请求服务端,服务端返回的数据是json格式的字符串,如果不是会报错
各种请求方式
#各种请求方式
import requests
requests.post("http://httpbin.org/post")
requests.put("http://httpbin.org/put")
requests.delete("http://httpbin.org/delete")
requests.head("http://httpbin.org/get")
requests.options("http://httpbin.org/get")
get请求
#get请求和添加headders
#get请求 import requests #https://oapi.blingabc.com/cms/user-api/student/live/v1/styles?stuNum=795571161 url = 'https://oapi.blingabc.com/cms/user-api/student/live/v1/styles' params= {"stuNum":"795571161"} #字典类型 headers = {"token":"eyJhbGciOiJIUzUxMiJ9.eyJpc3MiOiJjb20ueGRmLmJsaW5nIiwiYXVkIjoiY2xpZW50IiwidXNlcmNvZGUiOiI3OTU1NzExNiIsImV4cCI6MTU5MzI0NTc3MCwiaWF0IjoxNTkyNjQwOTcwfQ.5sRnqFPS4W0sbRz0N--cuflmmeCMQp0hETh59XhpwoJcwpfewF2kVzYEVii0GaMbHiHDpo8Oif3Rrn1tK5TBIA" } response = requests.get(url,headers=headers,params=params) print(response.json())
基于Post请求
#post请求 import requests import json url = 'https://oapi.blingabc.com/auth/open-api/user/v1/login' data = {"mobile":"17621763856","password":"123456a"} headers = {"Content-Type": "application/json" } #data和json区别: #response = requests.post(url,data = json.dumps(data),headers=headers) response = requests.post(url,json = data,headers=headers) print(response.json())
返回数据格式、编码处理
print(json.dumps(response.json(),indent=True,ensure_ascii=False)) #使用json序列化,对返回数据格式、编码处理 print(json.dumps(response.text(),indent=True,ensure_ascii=False)) #使用json序列化,对返回数据格式、编码处理
timeout
response = requests.get(url,headers=headers,params=params,timeout = 3)
文件上传
实现方法和其他参数类似,也是构造一个字典然后通过files参数传递。
import requests files= {"files":open("git.jpeg","rb")} response = requests.post("http://httpbin.org/post",files=files) print(response.text)
例子:
#上传文件 import requests url = 'https://sfile.t.blingabc.com/open-api/file/v1/upload' headers = {"Content-Type": "multipart/form-data", "token":"eyJhbGciOiJIUzUxMiJ9.eyJkZXBhcnRtZW50TmFtZSI6IuWkluaVmeeuoeeQhuS4reW_gyIsInJvbGVJZCI6IjE0NywxNDEsMTEwLDEwNiw5Miw5MSw5MCw4MCw2NSIsImRlcGFydG1lbnRJZCI6MiwibW9iaWxlIjoiMTk5KioqKjAwMDEyMTUiLCJpc3MiOiJjb20ueGRmLmJsaW5nIiwib3BlcmF0b3JDb2RlIjoiIiwib3BlcmF0b3JOYW1lIjoi5bKz5paH5am3MSIsImNybUlkIjoyMTUsImF1ZCI6ImNsaWVudCIsInVzZXJjb2RlIjoiY2hhbmdwaW4iLCJleHAiOjE1OTMzOTkwNDAsIm9wZXJhdG9ySWQiOjIxNSwiaWF0IjoxNTkyNzk0MjQwLCJlbWFpbCI6ImNoYW5ncGluQGJsaW5nYWJjLmNvbSIsInBsYXRmb3JtQ29kZSI6IjAwMDMifQ.VwIrClq9QuVeTHnXk7g6flYFJpwU4GxDeWWI4QUxk21QEW6V_EqDSUsml1F5sVsU02Ltg36CMRiyMaJYhebd0A" } files = {"file": ("Level1.jpg",open("/Users/zhaohuarui/Desktop/python project/two/wy/Level1.jpg","rb"),"application/octet-stream ",{})} response = requests.post(url,headers=headers,files = files) print(response.json())
获取cookie
import requests response=requests.get("http://www.baidu.com") print(response.cookies) for key,value in response.cookies.items(): print(key+"="+value)
cookie处理思路
从上个接口函数中返回cookie然后下个函数调用cookie
token处理思路
#cookie import requests headers = {"Content-Type": "application/json" } def login(): url = 'https://oapi.blingabc.com/auth/open-api/user/v1/login' data = {"mobile": "17621763856", "password": "123456a"} r = requests.post(url,json=data,headers=headers) #print(r.cookies) #return r.cookies return r.json()['data']['token'] def style(): url = 'https://oapi.blingabc.com/cms/user-api/student/live/v1/styles' params = {"stuNum":"795571161"} headers['token'] = login() r = requests.get(url, params = params,headers=headers) print(r.text) #login() style()
5.会话维持
cookie的一个作用就是可以用于模拟登陆,做会话维持
#通过创建一个session对象,两次请求都通过这个对象访问
import requests s=requests.session() s.get("http://httpbin.org/cookies/set/number/123456") response=s.get("http://httpbin.org/cookies") print(response.text)
证书处理
import requests from requests.packages import urllib3 urllib3.disable_warnings() response = requests.get("https://www.12306.cn",verify=False) print(response.status_code)
鉴权处理
>>> from requests.auth import HTTPBasicAuth
>>> requests.get('https://api.github.com/user', auth=HTTPBasicAuth('user', 'pass'))
<Response [200]>
7.代理设置
8.异常处理
import requests
from requests.exceptions import ReadTimeout,ConnectionError,RequestException
try:
response=requests.get("http://httpbin.org/get",timout=0.1)
print(response.status_code)
except ReadTimeout:
print("timeout")
except ConnectionError:
print("connection Error")
except RequestException:
print("error")
9.response的返回内容
print(r.status_code) #状态码
print(r.text) #返回文本信息
print(r.encoding)# 编码格式
print(r.content)#字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩
print(r.headers)#以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
print(r.json()) #Requests中内置的JSON解码器
print(r.url) #获取url
print(r.cookies) #获取cookies
print(r.raw) #返回原始相应体
python序列化
把python的对象编码转换为json格式的字符串,反序列化可以理解为:把json格式
字符串解码为python数据对象。在python的标准库中,专门提供了json库。
#json的主要方法
import json print(json.__all__)
输出:['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONDecodeError', 'JSONEncoder']
Json.dumps:将python对象编码成json字符串
Json.loads:将字符串解码为python对象。
import json dict1={'name':'花花','age':24,'address':'上海'} print (u'未序列化前的数据类型为:',type(dict1)) print (u'未序列化前的数据:',dict1) #对dict1进行序列化的处理 str1=json.dumps(dict1) print (u'序列化后的数据类型为:',type(str1)) print (u'序列化后的数据为:',str1) #对str1进行反序列化 dict2=json.loads(str1) print (u'反序列化后的数据类型:',type(dict2)) print (u'反序列化后的数据:',dict2)
输出:未序列化前的数据类型为: <class 'dict'>
未序列化前的数据: {'name': '花花', 'age': 24, 'address': '上海'}
序列化后的数据类型为: <class 'str'>
序列化后的数据为: {"name": "u82b1u82b1", "age": 24, "address": "u4e0au6d77"}
反序列化后的数据类型: <class 'dict'>
反序列化后的数据: {'name': '花花', 'age': 24, 'address': '上海'}