资讯专栏INFORMATION COLUMN

python三方库之requests-快速上手

xioqua / 2701人阅读

摘要:基于发送请求发送请求发送请求其他请求接口与请求类型一致,如等。如果请求返回或状态码,调用会抛出此异常。请求超过配置的最大重定向数。

基于2.21.0

发送请求

发送GET请求:

r = requests.get("https://api.github.com/events")

发送POST请求:

r = requests.post("https://httpbin.org/post", data={"key":"value"})

其他请求接口与HTTP请求类型一致,如PUT, DELETE, HEAD, OPTIONS等。

在URL查询字符串中使用参数

params参数传递一个字典对象:

>>> payload = {"key1": "value1", "key2": "value2"}
>>> r = requests.get("https://httpbin.org/get", params=payload)
>>> print(r.url)
https://httpbin.org/get?key2=value2&key1=value1

字典的值也可以是一个列表:

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

参数中值为None的键值对不会加到查询字符串

文本响应内容

Response对象的text属性可以获取服务器响应内容的文本形式,Requests会自动解码:

>>> r = requests.get("https://api.github.com/events")
>>> r.text
"[{"id":"9167113775","type":"PushEvent","actor"...

访问Response.text时,Requests将基于HTTP头猜测响应内容编码。使用Response.encoding属性可以查看或改变Requests使用的编码:

>>> r.encoding
"utf-8"
>>> r.encoding = "ISO-8859-1"
二进制响应内容

Response对象的content属性可以获取服务器响应内容的二进制形式:

>>> r.content
b"[{"id":"9167113775","type":"PushEvent","actor"...
JSON响应内容

Response对象的json()方法可以获取服务器响应内容的JSON形式:

>>> r = requests.get("https://api.github.com/events")
>>> r.json()
[{"repo": {"url": "https://api.github.com/...

如果JSON解码失败,将抛出异常。

原始响应内容

在极少情况下,可能需要访问服务器原始套接字响应。通过在请求中设置stream=True参数,并访问Response对象的raw属性实现:

>>> r = requests.get("https://api.github.com/events", stream=True)
>>> r.raw

>>> r.raw.read(10)
"x1fx8bx08x00x00x00x00x00x00x03"

通常的用法是用下面这种方式将原始响应内容保存到文件,Response.iter_content方法将自动解码gzipdeflate传输编码:

with open(filename, "wb") as fd:
    for chunk in r.iter_content(chunk_size=128):
        fd.write(chunk)
定制请求头

传递一个dict对象到headers参数,可以添加HTTP请求头:

>>> url = "https://api.github.com/some/endpoint"
>>> headers = {"user-agent": "my-app/0.0.1"}

>>> r = requests.get(url, headers=headers)

定制的header的优先级较低,在某些场景或条件下可能被覆盖。

所有header的值必须是string, bytestringunicode类型。但建议尽量避免传递unicode类型的值

更复杂的POST请求 发送form-encoded数据

data参数传递一个字典对象:

>>> payload = {"key1": "value1", "key2": "value2"}
>>> r = requests.post("https://httpbin.org/post", data=payload)

如果有多个值对应一个键,可以使用由元组组成的列表或者值是列表的字典:

>>> payload_tuples = [("key1", "value1"), ("key1", "value2")]
>>> r1 = requests.post("https://httpbin.org/post", data=payload_tuples)
>>> payload_dict = {"key1": ["value1", "value2"]}
>>> r2 = requests.post("https://httpbin.org/post", data=payload_dict)
发送非form-encoded数据

如果传递的是字符串而非字典,将直接发送该数据:

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

或者可以使用json参数自动对字典对象编码:

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

a) 如果在请求中使用了datafiles参数,json参数会被忽略。b) 在请求中使用json参数会改变Content-Type的值为application/json

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

上传文件:

>>> url = "https://httpbin.org/post"
>>> files = {"file": open("report.xls", "rb")}
>>> r = requests.post(url, files=files)

显式地设置文件名,内容类型(Content-Type)以及请求头:

>>> url = "https://httpbin.org/post"
>>> files = {"file": ("report.xls", open("report.xls", "rb"), "application/vnd.ms-excel", {"Expires": "0"})}
>>> r = requests.post(url, files=files)

甚至可以发送作为文件接收的字符串:

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

如果发送的文件过大,建议使用第三方包requests-toolbelt做成数据流。

强烈建议以二进制模式打开文件,因为Requests可能以文件中的字节长度来设置Content-Length

响应状态码

Response对象的status_code属性可以获取响应状态:

>>> r = requests.get("https://httpbin.org/get")
>>> r.status_code
200

requests库还内置了状态码以供参考:

>>> r.status_code == requests.codes.ok
True

如果请求异常(状态码为4XX的客户端错误或5XX的服务端错误),可以调用raise_for_status()方法抛出异常:

>>> bad_r = requests.get("https://httpbin.org/status/404")
>>> bad_r.status_code
404
>>> bad_r.raise_for_status()
Traceback (most recent call last):
  File "requests/models.py", line 832, in raise_for_status
    raise http_error
requests.exceptions.HTTPError: 404 Client Error
响应头

Response对象的headers属性可以获取响应头,它是一个字典对象,键不区分大小写:

>>> r.headers
{
    "content-encoding": "gzip",
    "transfer-encoding": "chunked",
    "connection": "close",
    "server": "nginx/1.0.4",
    "x-runtime": "148ms",
    "etag": ""e1ca502697e5c9317743dc078f67693f"",
    "content-type": "application/json"
}
>>> r.headers["Content-Type"]
"application/json"
>>> r.headers.get("content-type")
"application/json"
Cookies

Response对象的cookies属性可以获取响应中的cookie信息:

>>> url = "http://example.com/some/cookie/setting/url"
>>> r = requests.get(url)
>>> r.cookies["example_cookie_name"]
"example_cookie_value"

使用cookies参数可以发送cookie信息:

>>> url = "https://httpbin.org/cookies"
>>> cookies = dict(cookies_are="working")
>>> r = requests.get(url, cookies=cookies)

Response.cookies返回的是一个RequestsCookieJar对象,跟字典类似但提供了额外的接口,适合多域名或多路径下使用,也可以在请求中传递:

>>> jar = requests.cookies.RequestsCookieJar()
>>> jar.set("tasty_cookie", "yum", domain="httpbin.org", path="/cookies")
>>> jar.set("gross_cookie", "blech", domain="httpbin.org", path="/elsewhere")
>>> url = "https://httpbin.org/cookies"
>>> r = requests.get(url, cookies=jar)
>>> r.text
"{"cookies": {"tasty_cookie": "yum"}}"
重定向及请求历史

requests默认对除HEAD外的所有请求执行地址重定向。Response.history属性可以追踪重定向历史,它返回一个list,包含为了完成请求创建的所有Response对象并由老到新排序。

下面是一个HTTP重定向HTTPS的用例:

>>> r = requests.get("http://github.com/")
>>> r.url
"https://github.com/"
>>> r.status_code
200
>>> r.history
[]

使用allow_redirects参数可以禁用重定向:

>>> r = requests.get("http://github.com/", allow_redirects=False)
>>> r.status_code
301
>>> r.history
[]

如果使用的是HEAD请求,也可以使用allow_redirects参数允许重定向:

>>> r = requests.head("http://github.com/", allow_redirects=True)
>>> r.url
"https://github.com/"
>>> r.history
[]
请求超时

使用timeout参数设置服务器返回响应的最大等待时间:

>>> requests.get("https://github.com/", timeout=0.001)
Traceback (most recent call last):
  File "", line 1, in 
requests.exceptions.Timeout: HTTPConnectionPool(host="github.com", port=80): Request timed out. (timeout=0.001)
错误及异常

ConnectionError:网络异常,比如DNS错误,连接拒绝等。
HTTPError:如果请求返回4XX或5XX状态码,调用Response.raise_for_status()会抛出此异常。
Timeout:连接超时。
TooManyRedirects:请求超过配置的最大重定向数。
RequestException:异常基类。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43297.html

相关文章

  • python三方库之Django学习笔记一

    摘要:一个空文件,告诉该目录是一个包。运行项目切换到目录执行命令浏览器输入看到以下界面运行成功小贴士修改端口命令创建切换到同级目录,执行命令现在的结构目录如下编写你的第一个视图新建文件运行命令查看运行结果 1、安装Django pip install Django 2、版本号查询 python -m django --version showImg(https://segmentfa...

    canger 评论0 收藏0
  • python三方库之Django学习笔记二

    摘要:上一节项目框架已经搭建完毕,现在开始连接数据库,创建数据库设置默认安装了数据库打开文件数据库引擎数据库的名字小贴士如果你选择,数据库是以文件的形式生成,要设置成绝对路径创建表结构创建模型激活模型执行命令执行成功后目录结构如下图 上一节项目框架已经搭建完毕,现在开始连接数据库,创建model 1、数据库设置python默认安装了sqlite数据库 打开文件:dayang/settings...

    Java3y 评论0 收藏0
  • 保姆级教程带你开发优质的Python库之上篇【建议收藏】

    摘要:正式的专栏第篇,同学站住,别错过这个从开始的文章前面学委的入门到精通专栏积累了篇文章,当然学委博客还有几十篇应用的文章。 正式的Python专栏第9篇,同学站住...

    hyuan 评论0 收藏0
  • BeautifulSoup:网页解析利器上手简介

    摘要:文档写得很清楚,也有中文版,你只要看了最初的一小部分,就可以在代码中派上用场了。 关于爬虫的案例和方法,我们已讲过许多。不过在以往的文章中,大多是关注在 如何把网页上的内容抓取下来 。今天我们来分享下,当你已经把内容爬下来之后, 如何提取出其中你需要的具体信息 。 网页被抓取下来,通常就是 str 字符串类型的对象 ,要从里面寻找信息,最直接的想法就是直接通过字符串的 find 方法 ...

    Carl 评论0 收藏0

发表评论

0条评论

xioqua

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<