• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
花儿爷
博客园    首页    新随笔    联系   管理     
Requests库

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请求

数据传参的区别:
params:get请求方式用,查询?后台面的字符串;
data:post请求方式用,post的from表单数据用;
json:post请求方式,发送json格式字符串的数据;
在Python里面的数据是字典,当填写的数据类型为data的时候,需要序列化处理将字典转为字符串data=json.dumps(data),
而json=data时就不需要序列化处理;
#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

在3秒内请求这个接口,没有请求到会报错,链接超时
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)

证书处理

报错信息包含:cert 443等信息时,客户端向服务端发起请求,服务端拒绝,因为需要安全证书
处理方法:1、请求当中加载上安全证书 2、忽略它,忽略关键字:verify=False

import requests

from requests.packages import urllib3

urllib3.disable_warnings()

response = requests.get("https://www.12306.cn",verify=False)

print(response.status_code)

 鉴权处理

我们常用的鉴权有四种:
1、HTTP Basic Authentication
2、session-cookie
3、Token 验证
4、OAuth(开放授权)

 

>>> 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": "\u82b1\u82b1", "age": 24, "address": "\u4e0a\u6d77"}

反序列化后的数据类型: <class 'dict'>

反序列化后的数据: {'name': '花花', 'age': 24, 'address': '上海'}

 

posted on 2018-06-04 11:49  flowerszhao  阅读(342)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3