zoukankan      html  css  js  c++  java
  • Python-第三方模块requests快速入手

    首先确认一下 

    • Requests 已经安装
    • Requests 是最新的版本

    如果没有安装requests,请按照下面的方式安装

    安装requests

    window和Linux环境下都可以输入

    $ pip install requests

    发送请求

    使用requests可以发送get、post、put、delete、head以及options等类型的Http请求

    使用Requests发送网络请求非常简单,首先要导入Requests模块:

    >>> import requests

    然后,尝试获取某个网页

    >>> r = requests.get('https://dc.kellyx.com:9635/match/games?pageNum=1&matchId=&countryId=')

    >>> print(r.text)

    传递URL参数

    你也许经常想为 URL 的查询字符串(query string)传递某种数据。如果你是手工构建 URL,那么数据会以键/值对的形式置于 URL 中,跟在一个问号的后面。例如, httpbin.org/get?key=val。 Requests 允许你使用 params 关键字参数,以一个字符串字典来提供这些参数。举例来说,如果你想传递 key1=value1 和 key2=value2 到 httpbin.org/get ,那么你可以使用如下代码:

    >>> payload = {"pageNum":1,"matchId":"","countryId":""} 
    >>> url =
    "https://dc.kellyx.com:9635/match/games"
    >>>h = {

    "Accept": "application/json,text/plain,*/*",
    "User-Agent": "Mozilla/5.0(Linux;Android6.0;Nexus  5Build/MRA58N) AppleWebKit/537.36(KHTML,likeGecko) Chrome/68.0.3440.106 Mobile Safari/537.36"
    }
    >>> r = requests.get(url,params =payload,header=h)

    通过打印输出该 URL,你能看到 URL 已被正确编码:

    >>> print(r.url)

    注意字典里值为 None 的键都不会被添加到 URL 的查询字符串里。

    你还可以将一个列表作为值传入:

    >>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
    
    >>> r = requests.get('http://httpbin.org/get', params=payload)
    >>> print(r.url)
    http://httpbin.org/get?key1=value1&key2=value2&key2=value3

    响应内容

    我们能读取服务器响应的内容,

    Requests 会自动解码来自服务器的内容。大多数 unicode 字符集都能被无缝地解码。

    请求发出后,Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。当你访问 r.text 之时,Requests 会使用其推测的文本编码。你可以找出 Requests 使用了什么编码,并且能够使用r.encoding 属性来改变它:

    >>> r.encoding
    'utf-8'
    >>> r.encoding = 'ISO-8859-1'

    其他操作

    response的返回内容还有其它更多信息
    >>> r.status_code          #响应状态码
    >>> r.content              #字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩
    >>> r.headers              #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
    >>> r.url                   # 获取url
    >>> r.encoding              # 编码格式
    >>> r.cookies               # 获取返回的cookie
    >>> r.text                  #字符串方式的响应体,会自动根据响应头部的字符编码进行解码
    >>> r.raise_for_status()  #失败请求(非200响应)抛出异常

    >>> r.json()                #Requests中内置的JSON解码器 ,json转成python的字典了

    如果 JSON 解码失败, r.json() 就会抛出一个异常。例如,响应内容是 401 (Unauthorized),尝试访问 r.json() 将会抛出 ValueError: No JSON object could be decoded 异常。

    需要注意的是,成功调用 r.json() 并**不**意味着响应的成功。有的服务器会在失败的响应中包含一个 JSON 对象(比如 HTTP 500 的错误细节)。这种 JSON 会被解码返回。要检查请求是否成功,请使用 r.raise_for_status() 或者检查 r.status_code 是否和你的期望相同。

    定制请求头

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

    例如,在前一个示例中我们没有指定 content-type:

    >>> url = 'https://api.github.com/some/endpoint'
    >>> headers = {'user-agent': 'my-app/0.0.1'}
    
    >>> r = requests.get(url, headers=headers)
    

    注意: 定制 header 的优先级低于某些特定的信息源,例如:

    • 如果在 .netrc 中设置了用户认证信息,使用 headers= 设置的授权就不会生效。而如果设置了 auth= 参数,``.netrc`` 的设置就无效了。
    • 如果被重定向到别的主机,授权 header 就会被删除。
    • 代理授权 header 会被 URL 中提供的代理身份覆盖掉。
    • 在我们能判断内容长度的情况下,header 的 Content-Length 会被改写。

    更进一步讲,Requests 不会基于定制 header 的具体情况改变自己的行为。只不过在最后的请求中,所有的 header 信息都会被传递进去。

    注意: 所有的 header 值必须是 string、bytestring 或者 unicode。尽管传递 unicode header 也是允许的,但不建议这样做。

    更加复杂的 POST 请求

    带有参数的Post请求的样式主要有两个类型,一类是参数在URL中,一类是在body中。

    常见的四类形式:

    • application/json: {“key1“:”value1”,“keyt2":“value2"}
    • application/x-www-form-urlencoded:name1= value1&name2=value2
    • multipart/form-data:这一种是表单格式的(文件上传,图片上传等混合式)
    • Content-Type:octets/stream(文件下载)

    通常,你想要发送一些编码为表单形式的数据——非常像一个 HTML 表单。要实现这个,只需简单地传递一个字典给 data 参数。你的数据字典在发出请求时会自动编码为表单形式:

    >>> payload = {'key1': 'value1', 'key2': 'value2'}
    
    >>> r = requests.post("http://httpbin.org/post", data=payload)
    >>> print(r.text)
    {
      ...
      "form": {
        "key2": "value2",
        "key1": "value1"
      },
      ...
    }
    

    你还可以为 data 参数传入一个元组列表。在表单中多个元素使用同一 key 的时候,这种方式尤其有效:

    >>> payload = (('key1', 'value1'), ('key1', 'value2'))
    >>> r = requests.post('http://httpbin.org/post', data=payload)
    >>> print(r.text)
    {
      ...
      "form": {
        "key1": [
          "value1",
          "value2"
        ]
      },
      ...
    }
    

    很多时候你想要发送的数据并非编码为表单形式的。如果你传递一个 string 而不是一个 dict,那么数据会被直接发布出去。

    例如,Github API v3 接受编码为 JSON 的 POST/PATCH 数据:

    >>> import json
    
    >>> url = 'https://api.github.com/some/endpoint'
    >>> payload = {'some': 'data'}
    
    >>> r = requests.post(url, data=json.dumps(payload))
    

    此处除了可以自行对 dict 进行编码,你还可以使用 json 参数直接传递,然后它就会被自动编码。这是 2.4.2 版的新加功能:

    >>> url = 'https://api.github.com/some/endpoint'
    >>> payload = {'some': 'data'}
    
    >>> r = requests.post(url, json=payload)
    

    POST一个多部分编码(Multipart-Encoded)的文件

    Requests 使得上传多部分编码文件变得很简单:

    >>> url = 'http://httpbin.org/post'
    >>> files = {'file': open('report.xls', 'rb')}
    
    >>> r = requests.post(url, files=files)
    >>> r.text
    {
      ...
      "files": {
        "file": "<censored...binary...data>"
      },
      ...
    }
    

    你可以显式地设置文件名,文件类型和请求头:

    >>> url = 'http://httpbin.org/post'
    >>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
    
    >>> r = requests.post(url, files=files)
    >>> r.text
    {
      ...
      "files": {
        "file": "<censored...binary...data>"
      },
      ...
    }
    

    如果你想,你也可以发送作为文件来接收的字符串:

    >>> url = 'http://httpbin.org/post'
    >>> files = {'file': ('report.csv', 'some,data,to,send
    another,row,to,send
    ')}
    
    >>> r = requests.post(url, files=files)
    >>> r.text
    {
      ...
      "files": {
        "file": "some,data,to,send\nanother,row,to,send\n"
      },
      ...
    }
    

    如果你发送一个非常大的文件作为 multipart/form-data 请求,你可能希望将请求做成数据流。默认下 requests 不支持, 但有个第三方包 requests-toolbelt 是支持的。

     
  • 相关阅读:
    独立与条件独立
    独立事件、笛卡尔积与矩阵向量乘法
    独立事件、笛卡尔积与矩阵向量乘法
    OpenCV图像增强算法实现(直方图均衡化、拉普拉斯、Log、Gamma)
    等高线的认识
    等高线的认识
    概率相关的证明
    概率相关的证明
    OpenGl中使用着色器的基本步骤及GLSL渲染简单示例
    中英文对照 —— 歌词
  • 原文地址:https://www.cnblogs.com/fanjc/p/9791569.html
Copyright © 2011-2022 走看看