
快速入门急于开始此页面将很好地介绍如何开始使用 。首先确保让我们从一些简单的示例开始。发出请求使用 发出请求非常简单。首先导入 模块 import requests此刻, 咱们试着去获取一个网页。就这个示例而言, 咱们去获取那公开的时间线。 r requests.get(https://api.github.com/events)如今, 存在一个名为 r 的对象, 我们能够从中获取所需的全部信息。的简易 API 表明, 所有样式的 HTTP 请求都清晰可见, 举例来说, 下面是怎样发送 HTTP POST 请求的。 r requests.post(https://httpbin.org/post, data{key: value})可以这么说, 是不是? 那其他的HTTP请求类型, 像PUT、HEAD还有别的? 这些通通都同样简易。 r requests.put(https://httpbin.org/put, data{key: value}) r requests.delete(https://httpbin.org/delete) r requests.head(https://httpbin.org/get) r requests.options(https://httpbin.org/get)这些都很好但这只是 所能做的事情的开始。在 URL 中传递参数您平常趋向于在URL的查询字符串里发送某类数据。要是您手动去构建URL, 那么此数据会当作问号后面URL里的键/值对予以呈现, 就像 /get?keyval 这样。它准许您运用关键字参数把这些参数当作字符串字典来提供。举例而言, 倘若您想把 key1 以及 key2 传送给 /get, 那么能够采用如下代码。 payload {key1: value1, key2: value2} r requests.get(https://httpbin.org/get, paramspayload)您可以通过打印 URL 来看到 URL 已正确编码 print(r.url) https://httpbin.org/get?key2value2key1value1需留意, 任何字典之中存在键的值是 None 的情况, 都不会被增添至 URL 的查询字符串里。您还可以将项目列表作为值传递 payload {key1: value1, key2: [value2, value3]} r requests.get(https://httpbin.org/get, paramspayload) print(r.url) https://httpbin.org/get?key1value1key2value2key2value3响应内容我们可以读取服务器响应的内容。再次考虑 时间线 import requests r requests.get(https://api.github.com/events) r.text [{repository:{open_issues:0,url:https://github.com/...来自服务器的内容将被自动解码, 大多数字符集可以在不用缝隙的情况下进行解码。当您发出那个请求的时候, 会依据 HTTP 标头去对响应的编码做出合理的猜测。当您去访问 r.text 的时候, 会利用猜测的文本编码。您能够借助 r. 属性找出到底正在使用啥编码并且对这个编码加以更改。 r.encoding utf-8 r.encoding ISO-8859-1若是您变更编码, 那么一旦您调用r.text, 便会运用r的新值, 您或许期望在任何可以施行特殊逻辑以判定内容编码的情形下开展此操作, 举例来说, HTML以及XML能够于其正文中指明其编码, 在此种情形下, 您应当借助r查找编码, 随后设定r, 这会准许您运用正确编码借助r.text。对于自定义编码, 若您有需求就会去使用。要是您创建了属于自己的编码进而运用模块对其做到了注册情况, 那么仅仅将那个用作编解码器名称的东西当作r的值这种处理方式, 就会针对您相应地处理解码事宜。二进制响应内容对于非文本请求您还可以将响应正文作为字节访问 r.content b[{repository:{open_issues:0,url:https://github.com/...gzip 和 传输编码会自动为您解码。要是进行了库的安装, 像这般的或者那那般的, 那么br传输编码就会自行给您予以解码。例如要从请求返回的二进制数据中创建图像可以使用以下代码 from PIL import Image from io import BytesIO i Image.open(BytesIO(r.content))JSON 响应内容要是您所处理的属于 JSON 数据, 另外还存在着一个内置的 JSON 解码器, 就这样。 import requests r requests.get(https://api.github.com/events) r.json() [{repository: {open_issues: 0, url: https://github.com/...要是JSON解码失败, 那么r.json()会引发异常, 举例来说, 要是响应收到204无内容, 或者要是响应包含无效的JSON, 那尝试r.json()会引发···, 此包装异常给出对不同版本以及JSON序列化库可能抛出的多个异常的互操作性。需留意的是, 对r.json()的调用成功, 并不意味着响应成功。有些服务器可能在失败响应里返回JSON对象, 比如说HTTP 500的错误详情。这类JSON会被解码且返回。要查验请求是否成功, 可使用r.(), 或者检查r是否契合您的预期。原始响应内容在极少的情形当中, 如果您期望从服务器那儿获取原始套接字的响应, 您能够去访问 r.raw。要是您打算做这个操作, 那就得确保在初始请求里设置 True。等做完这些之后, 您能够实施如下的行为。 r requests.get(https://api.github.com/events, streamTrue) r.raw r.raw.read(10) b\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03不过, 一般情形下, 您得运用像这般样式的模式把进行流式传输之物储存在文件之中。with open(filename, wb) as fd: for chunk in r.iter_content(chunk_size128): fd.write(chunk)凭借 . 去处理诸多您于直接运用 .raw 时所要处理的事项。于流式传输下载之际, 上述这般的方法成了检索内容的优先且得着推荐的办法。要留意, 能够随意去调适转变成更契合您自身用例的数字。注意有关运用. 以及. raw的关键说明, . 能够自动对gzip和传输编码进行解码, . raw属于字节的原始流, 它不会对响应内容予以转换, 要是你确切有需求去访问返回的字节, 那就使用. raw。自定义标头倘若您打算给请求增添 HTTP 标头, 只要把 dict 传送给参数即可。例如我们在前面的示例中没有指定我们的用户代理 url https://api.github.com/some/endpoint headers {user-agent: my-app/0.0.1} r requests.get(url, headersheaders)注意与更具体的信息来源相比自定义标头的优先级较低。例如此外, 其行为不会依据指定哪些属于自定义的标头这种情况, 而发生改变。标头只会被传递到最后的请求当中。注意, 所有的标头值, 都一定得是字节串, 或者是另外一种情况, 哪怕允许, 不过建议还是要避开传递如此这般的标头值。更复杂的 POST 请求平常情况下, 您期望发送某些表单编码的数据, 如同HTML表单那般。若要开展此行动, 仅仅把字典传递给data参数就行。在发出请求之际, 您的数据字典会自动被进行表单编码。 payload {key1: value1, key2: value2} r requests.post(https://httpbin.org/post, datapayload) print(r.text) { ... form: { key2: value2, key1: value1 }, ... }对于每一个键而言, data 参数也是能够拥有多个值的。这是能够借助把 data 设置成元组列表或者将列表当作值来传递的字典得以达成的。当表单有着使用相同键的多个元素之际, 这是格外有用的。 payload_tuples [(key1, value1), (key1, value2)] r1 requests.post(https://httpbin.org/post, datapayload_tuples) payload_dict {key1: [value1, value2]} r2 requests.post(https://httpbin.org/post, datapayload_dict) print(r1.text) { ... form: { key1: [ value1, value2 ] }, ... } r1.text r2.text True有时, 您或许会期望去发送那未曾进行表单编码的数据, 您传递并非dict的数值时, 该数据便会直接被发布。比如, API v3接纳采用JSON编码形式的POST/PATCH数据。 import json url https://api.github.com/some/endpoint payload {some: data} r requests.post(url, datajson.dumps(payload))请留意, 上述代码不会去添加 -Type 标头, 所以它不会把它设置成 /json。倘若您有关于设置此标头的需求, 且不打算亲自针对 dict 予以编码, 那么您能够借助 json 参数于版本 2.4.2 中被添加上的, 去直接传递它, 如此一来它便会自行实现编码。 url https://api.github.com/some/endpoint payload {some: data} r requests.post(url, jsonpayload)要留意, 假如传递了data, 或者传递了files, 那么json参数将会被忽略、。发布多部分编码文件简化了多部分编码文件上传 url https://httpbin.org/post files {file: open(report.xls, rb)} r requests.post(url, filesfiles) r.text { ... files: { file: }, ... }您可以显式设置文件名、 和标头 url https://httpbin.org/post files {file: (report.xls, open(report.xls, rb), application/vnd.ms-excel, {Expires: 0})} r requests.post(url, filesfiles) r.text { ... files: { file: }, ... }如果您愿意可以发送字符串以作为文件接收 url https://httpbin.org/post files {file: (report.csv, some,data,to,send\nanother,row,to,send\n)} r requests.post(url, filesfiles) r.text { ... files: { file: some,data,to,send\\nanother,row,to,send\\n }, ... }要是您打算把极为庞大的文件当作 /form-data 请求去发布, 您或许会期望就该请求开展 流式处理, 默认状况下, 此功能并不被支持, 然而有一个单独的包能够支持这一功能, 您应当去阅读相关的文档, 以便获取关于怎样运用它的更多详尽信息。有关在一个请求中发送多个文件请参阅 部分。警告强力建议您于下开启文件, 这是鉴于, 或许会试着给您提供一头, 要是它如此行事, 此数值将会被设定为文件里的字节数。倘若您于文本模式下打开文件, 有可能会遇上错误。响应状态代码我们可以检查响应状态代码 r requests.get(https://httpbin.org/get) r.status_code 200还附带一个内置的状态代码查找对象以便于参考 r.status_code requests.codes.ok True倘若我们发出了那种错误请求, 也就是4XX客户端错误或者5XX服务器错误响应, 那么我们能够运用引发它。 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但是由于r的为200当我们调用()时我们会得到 r.raise_for_status() None一切正常。响应头我们可以使用 字典查看服务器的响应头 r.headers { content-encoding: gzip, transfer-encoding: chunked, connection: close, server: nginx/1.0.4, x-runtime: 148ms, etag: e1ca502697e5c9317743dc078f67693f, content-type: application/json }然而, 此字典别具一格, 它专为 HTTP 头而设, 鉴于 HTTP 头名称并不区分大小写。因此我们可以使用任何我们想要的大小写来访问头 r.headers[Content-Type] application/json r.headers.get(content-type) application/json它存在另外一个特殊的地方, 就是, 服务器有可能会运用不一样的值, 多次去发送同一个头, 紧接着, 会把它们进行组合, 目的是, 依照其中的规定, 在单独一个映射里, 以字典的形式将它们呈现出来。能接收的一方, 能够把多个有着相同字段名称的头字段, 组合成一个“字段名: 字段值”对, 且不会去改变消息的语义, 其方法乃是按照顺序, 将每个后续的字段值附加到组合的字段值里面, 并且用逗号进行分隔。如果响应包含一些 您可以快速访问它们 url http://example.com/some/cookie/setting/url r requests.get(url) r.cookies[example_cookie_name] example_cookie_value要将您自己的 发送到服务器您可以使用参数 url https://httpbin.org/cookies cookies dict(cookies_areworking) r requests.get(url, cookiescookies) r.text {cookies: {cookies_are: working}}返回的形式是这样的, 它好似一个dict, 然而它还供给了一个更为完备的界面, 适用于跨越多个域或者路径来使用。jar同样能够传递给请求。 jar requests.cookies.RequestsCookieJar() jar.set(tasty_cookie, yum, domainhttpbin.org, path/cookies) jar.set(gross_cookie, blech, domainhttpbin.org, path/elsewhere) url https://httpbin.org/cookies r requests.get(url, cookiesjar) r.text {cookies: {tasty_cookie: yum}}重定向和历史记录倘若没有自行设定 那便会针对 HEAD 之外的全部别类动词, 都去实施位置重定向操作。我们可以使用 对象的属性来跟踪重定向。含有为达成请求所创建对象的列表, 被按从最陈旧到最新鲜的响应予以排序。例如 将所有 HTTP 请求重定向到 HTTPS r requests.get(http://github.com/) r.url https://github.com/ r.status_code 200 r.history []倘若您正处于运用GET、、POST、PUT、PATCH或者 的情形之下, 您能够借助 参数来将重定向处理予以禁用。 r requests.get(http://github.com/, allow_redirectsFalse) r.status_code 301 r.history []如果您正在使用 HEAD您也可以启用重定向 r requests.head(http://github.com/, allow_redirectsTrue) r.url https://github.com/ r.history []超时您能够运用 参数告知 在既定秒数之后中止等候响应。差不多所有生产代码理应在此几乎都是所有请求里运用这个参数。要是不这么做 , 极有可能致使您的程序没完没了地挂起。 requests.get(https://github.com/, timeout0.001) Traceback (most recent call last): File , line 1, in requests.exceptions.Timeout: HTTPConnectionPool(hostgithub.com, port80): Request timed out. (timeout0.001)注意不是针对整个响应下载的时间给出限制, 而是, 要是服务器在特定秒数内没有发出响应, 更确切讲要是在底层套接字上去没有收到任何字节达特定秒数时, 那么就会引发异常。要是没有明确进行指定超时的情况, 请求是不会出现超时现象的。错误和异常当出现网络问题, 像 DNS 故障、拒绝连接这类情况时, 就会引发 异常。如果 HTTP 请求返回不成功的状态代码将引发 。如果请求超时将引发 异常。如果请求超过配置的最大重定向次数将引发 异常。明确引发的所有异常都继承自 。