zoukankan      html  css  js  c++  java
  • Requests库使用总结

    概述

    Requests是python中一个很Pythonic的HTTP库,用于构建HTTP请求与解析响应

    Requests开发哲学

    • Beautiful is better than ugly.(美丽优于丑陋)
    • Explicit is better than implicit.(直白优于含蓄)
    • Simple is better than complex.(简单优于复杂)
    • Complex is better than complicated.(复杂优于繁琐)
    • Readability counts.(可读性很重要)

    安装

    直接安装

    pip install requests

    简单上手

    导入模块

    import requests

    发送请求

    #get
    r = requests.get('http://httpbin.org/get')
    
    #post
    r = requests.post('http://httpbin.org/post', data = {'key':'value'})

    通过requests.get或post方法实际发出一个http请求,返回一个response对象,http://httpbin.org是一个可以测试http请求的网站

    处理响应

    r.text  #返回响应内容主体,Requests 会自动解码来自服务器的内容
    
    r.content  #返回二进制的响应内容主体
    
    r.json() #处理json的响应内容,返回解码后的dict

    构造请求

    Requests中requests.get或post这些方法实际都是通过requests.request(method, url, **kwargs)实现的,主要返回response对象,下面主要介绍这个方法的参数

    method -- Request对象的请求方法.
    url -- 请求的URL.
    params -- (可选) 请求的URL查询字符串中要发送的字典或字节.
    data -- (可选) 字典或者元组列表[(key, value)] (form-encoded), 字节, 或者文件对象包含在请求主体中发生,主要是post put使用.
    json -- (可选) 包含请求主体中的json数据.
    headers -- (可选) HTTP首部(请求/通用/实体首部),字典形式.
    cookies -- (可选) Dict 或者 CookieJar对象包含在首部cookie字段发送.
    files -- (可选) “名称”:类文件对象(或{“名称:file-tuple}”)的字典,用于分段编码上传。 file-tuple可以是2元组(“ filename”,fileobj),3元组(“ filename”,fileobj,“ content_type”)或4元组(“ filename”,fileobj,“ content_type”,custom_headers), 其中,“ content-type”是一个字符串,用于定义给定文件的内容类型,而custom_headers是一个类似dict的对象,其中包含要为该文件添加的其他标题。
    auth -- (可选)  用于Basic/Digest/Custom HTTP 认证,元组类型.
    timeout (float or tuple) -- (可选)超时时间,在放弃请求之前,等待服务器发送数据的秒数,以浮点数或(连接超时,读取超时)元组为单位.
    allow_redirects (bool) -- (可选)布尔值。 启用/禁用GET / OPTIONS / POST / PUT / PATCH / DELETE / HEAD重定向。 默认为True。
    proxies -- (可选)字典,代理设置
    verify -- (可选)布尔值(在这种情况下,它控制我们是否验证服务器的TLS证书)或字符串(在这种情况下,它必须是要使用的CA捆绑包的路径)。 默认为True。
    stream -- (可选) 如果为False,则将立即下载响应内容。
    cert -- (可选) 如果为String,则为ssl客户端证书文件(.pem)的路径。 如果是元组,则(“证书”,“密钥”)配对。

    GET请求 

    requests.get(url, params=None, **kwargs)等价于requests.request('get', url, params=None,**kwargs),**kwargs即上面支持的可选参数

    payload = {'key1': 'value1', 'key2': 'value2'}
    r = requests.get("http://httpbin.org/get", params=payload)
    
    #即向http://httpbin.org/get?key2=value2&key1=value1请求

    POST请求

    requests.post(url, data=None, json=None, **kwargs)等价于requests.request('post', url, data=None, json=None, **kwargs)**kwargs即上面支持的可选参数

    POST提交请求,数据一般是放在HTTP报文主体中,数据编码主要有以下三种方式并在请求首部Content-Type 中指定

    • application/x-www-form-urlencoded :最常见post提交数据的方式,以form表单形式提交数据。
    • application/json :以json串提交数据。
    • multipart/form-data :一般使用来上传文件。
    #application/x-www-form-urlencoded,一般form提交
    
    payload = {'key1': 'value1', 'key2': 'value2'}
    
    r = requests.post("http://httpbin.org/post", data=payload)
    
    #application/json,如果使用 json 参数直接传递dict,就会被自动编码等同于json.dumps(payload)。如果使用data参数传递json.dumps(payload),与json参数不同在于前者有Content-Type,后者无
    
    payload = {'key1': 'value1', 'key2': 'value2'}
    
    r = requests.post("http://httpbin.org/post", json=payload)
    
    #multipart/form-data 传文件
    
    url = 'http://httpbin.org/post'
    
    files = {'file': open('report.xls', 'rb')}
    
    r = requests.post(url, files=files)

    定制请求头

    如果想为请求添加 HTTP 头部,只要简单地传递一个 dict 给 headers 参数就可以了

    headers = {'user-agent': 'my-app/0.0.1'}
    
    r = requests.get('http://httpbin.org/get', headers=headers)

    注意的是如果headers中包含Cookie会覆盖使用cookies参数时传入的dict

    传入Cookie

    直接将字典类型的cookies传入到cookies参数即可

    cookies = dict(cookies_are='working')
    
    r = requests.get('http://httpbin.org/get',cookies=cookies)

    处理响应

    requests方法返回一个response对象

    响应内容主体

    r = requests.get('http://httpbin.org/get')
    
    r.text  #返回响应内容主体,Requests 会自动解码来自服务器的内容
    
    r.content  #返回二进制的响应内容主体
    
    r.json() #处理json的响应内容,返回解码后的dict

    注意:有的中文网站使用r.text时,返回的内容为乱码,实际是自动解码错误了,解决办法主要有

    #先返回二进制内容,再根据实际的编码解码
    
    r.content.decode("utf-8")
    
    #不知道具体编码形式时,可以使用下面方法自动解码
    
    r.encoding = r.apparent_encoding
    
    r.text

    获取响应头部

    1.响应头部信息

    r.headers

    2.获取此响应的原始请求的头部

    r.request.headers

    响应状态

    1.返回状态码

    r.status_code

    2.响应是400或500类就抛出HTTPError异常

    r.raise_for_status()

    3返回状态原因

    r.reason

    响应内容编码

    r.encoding     #从HTTP报文header中猜测的响应内容的编码方式
    
    r.apparent_encoding  #从内容中分析响应内容的编码方式(备选编码方式,一般从html<meta>标签中属性charset获取)

    需要注意的是

    • r.encoding:如果header中不存在charset,则认为编码是ISO-8859-1
    • r.text根据r.encoding显示网页内容
    • r.apparent_encoding:根据网页内容分析处的编码方式可以看做是r.encoding的备选

    其它方法与属性

    response对象其它的方法与属性参考,具体可以查看官网地址http://cn.python-requests.org/zh_CN/latest/api.html#requests.Response

    • apparent_encoding:由html chardet属性表示的编码
    • close():关闭连接,一般不用
    • content:二进制内容主体
    • cookies:返回CookieJar对象
    • elapsed:从发送请求到响应到达之间经过的时间
    • encoding:决定.text的编码,从头部获取
    • headers:响应的头部信息,以字典形式
    • history:是一个 Response 对象的列表,为了完成请求而创建了这些对象。这个对象列表按照从最老到最近的请求进行排序。主要用在重定向中
    • is_permanent_redirect:如果此响应是重定向的永久版本之一,则为True。
    • is_redirect:如果此响应是自动处理后格式正确的HTTP重定向,则为true
    • links:返回响应的已解析头链接(如果有)。
    • ok:如果status_code小于400,则返回True。
    • request:这个响应的原始request对象
    • url:响应的最终URL

    会话对象

    有时候可能需要多个请求才能完成任务的情况,比如模拟登录后的请求操作,如果单独用requests去请求的话,就需要将最初的请求响应的cookie或header保存下来并且在后面的请求中都加入,这样比较麻烦。

    所以requests提供了个Session对象,用来让你能够跨请求保持某些参数,它也会在同一个 Session 实例发出的所有请求之间保持 cookie,并且向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来显著的性能提升。

    1.跨请求保持一些 cookie

    s = requests.Session()
    
    s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
    r = s.get("http://httpbin.org/cookies")
    
    print(r.text)
    # '{"cookies": {"sessioncookie": "123456789"}}'

    2.属性的合并

    s = requests.Session()
    s.auth = ('user', 'pass')
    s.headers.update({'x-test': 'true'})
    
    # both 'x-test' and 'x-test2' are sent
    s.get('http://httpbin.org/headers', headers={'x-test2': 'true'})

    注意的是,只有对象属性才能合并,方法层的参数覆盖则会覆盖

    s = requests.Session()
    
    r = s.get('http://httpbin.org/cookies', cookies={'from-my': 'browser'})
    print(r.text)
    # '{"cookies": {"from-my": "browser"}}'
    
    r = s.get('http://httpbin.org/cookies')
    print(r.text)
    # '{"cookies": {}}'

    3.前后文管理器

    with requests.Session() as s:
        s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')

    这样就能确保with区块退出后会话能被关闭,即使发生了异常也一样

    参考:http://cn.python-requests.org/zh_CN/latest/

  • 相关阅读:
    CF1096C Polygon for the Angle
    CF1149A Prefix Sum Primes
    CF1153C Serval and Parenthesis Sequence
    leetcode134 Gas Station
    leetcode23 Merge k Sorted Lists
    leetcode982 Triples with Bitwise AND Equal To Zero
    CF1110C Meaningless Operations
    【bzoj4567】SCOI2016背单词
    【不定期更】【友链整理】
    【bzoj2006】NOI2010超级钢琴
  • 原文地址:https://www.cnblogs.com/fengf233/p/11697192.html
Copyright © 2011-2022 走看看