zoukankan      html  css  js  c++  java
  • Requests库

    Requests

    Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP
    如果你看过上篇文章关于urllib库的使用,你会发现,其实urllib还是非常不方便的,而Requests它会比urllib更加方便,可以节约我们大量的工作。(用了requests之后,你基本都不愿意用urllib了)一句话,requestspython实现的最简单易用的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": "u82b1u82b1", "age": 24, "address": "u4e0au6d77"}

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

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

  • 相关阅读:
    Linux配置Java环境
    Oracle的flashback特性之一:Flashback Query
    Oracle的flashback特性之二:Flashback Table
    吴恩达深度学习笔记 (补)1.1~1.5 神经网络概述
    吴恩达深度学习笔记 2.10~2.18 向量化与python
    吴恩达深度学习笔记 2.6~2.9 logistic中的梯度下降
    吴恩达深度学习笔记 2.3 logistic回归损失
    吴恩达深度学习笔记2.2 logistic回归
    吴恩达深度学习笔记2.1 二分分类
    [ubuntu]安装并使用python 3.6及与2.7的切换
  • 原文地址:https://www.cnblogs.com/huaerye/p/9132607.html
Copyright © 2011-2022 走看看