<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Requests从入门到精通 on 重定向学院</title><link>https://itest2025.pages.dev/categories/requests%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E7%B2%BE%E9%80%9A/</link><description>Recent content in Requests从入门到精通 on 重定向学院</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Tue, 17 Jun 2025 17:29:15 +0800</lastBuildDate><atom:link href="https://itest2025.pages.dev/categories/requests%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E7%B2%BE%E9%80%9A/index.xml" rel="self" type="application/rss+xml"/><item><title>如何安装requests?</title><link>https://itest2025.pages.dev/tutorials/42-001-%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85requests/</link><pubDate>Wed, 22 Nov 2017 03:23:57 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/42-001-%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85requests/</guid><description>&lt;p>&lt;a href="http://docs.python-requests.org/en/master/user/install/#install" target="_blank" rel="noopener noreffer ">官方文档&lt;/a>&lt;/p>
&lt;p>官方给出的安装方式是使用&lt;a href="http://pipenv.org/" target="_blank" rel="noopener noreffer ">pipenv&lt;/a>&lt;/p>
&lt;pre tabindex="0">&lt;code>pipenv install requests
&lt;/code>&lt;/pre>&lt;p>当然也可以直接使用pip安装&lt;/p>
&lt;pre tabindex="0">&lt;code>pip install requests
&lt;/code>&lt;/pre>&lt;p>还可以从源码安装&lt;/p>
&lt;pre tabindex="0">&lt;code>git clone git://github.com/requests/requests.git
cd requests
pip install .
&lt;/code>&lt;/pre>&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1559523182-a284c3fb7cff?w=300"
 data-srcset="https://images.unsplash.com/photo-1559523182-a284c3fb7cff?w=300, https://images.unsplash.com/photo-1559523182-a284c3fb7cff?w=300 1.5x, https://images.unsplash.com/photo-1559523182-a284c3fb7cff?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1559523182-a284c3fb7cff?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>requests如何发送get请求?</title><link>https://itest2025.pages.dev/tutorials/42-002-requests%E5%A6%82%E4%BD%95%E5%8F%91%E9%80%81get%E8%AF%B7%E6%B1%82/</link><pubDate>Wed, 22 Nov 2017 03:23:57 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/42-002-requests%E5%A6%82%E4%BD%95%E5%8F%91%E9%80%81get%E8%AF%B7%E6%B1%82/</guid><description>&lt;p>&lt;a href="http://docs.python-requests.org/en/master/user/quickstart/#make-a-request" target="_blank" rel="noopener noreffer ">官方文档&lt;/a>&lt;/p>
&lt;p>使用requests发送请求其实非常简单。&lt;/p>
&lt;p>首先导入Requests模块&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; import requests
&lt;/code>&lt;/pre>&lt;p>下面试着去发送具体的请求，比如获取github的timeline信息&lt;/p>
&lt;pre tabindex="0">&lt;code>r = requests.get(&amp;#39;https://api.github.com/events&amp;#39;)
&lt;/code>&lt;/pre>&lt;p>r是requests的&lt;a href="http://docs.python-requests.org/en/master/api/#requests.Response" target="_blank" rel="noopener noreffer ">响应(Response)&lt;/a>对象，我们可以从r里面获取各种信息，比如获取响应的内容&lt;code>print(r.text)&lt;/code>&lt;/p>
&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1513470270416-d3ff6f16b22f?w=300"
 data-srcset="https://images.unsplash.com/photo-1513470270416-d3ff6f16b22f?w=300, https://images.unsplash.com/photo-1513470270416-d3ff6f16b22f?w=300 1.5x, https://images.unsplash.com/photo-1513470270416-d3ff6f16b22f?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1513470270416-d3ff6f16b22f?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>requests如何发送post请求?</title><link>https://itest2025.pages.dev/tutorials/42-003-requests%E5%A6%82%E4%BD%95%E5%8F%91%E9%80%81post%E8%AF%B7%E6%B1%82/</link><pubDate>Wed, 22 Nov 2017 03:23:57 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/42-003-requests%E5%A6%82%E4%BD%95%E5%8F%91%E9%80%81post%E8%AF%B7%E6%B1%82/</guid><description>&lt;p>&lt;a href="http://docs.python-requests.org/en/master/user/quickstart/#make-a-request" target="_blank" rel="noopener noreffer ">官方文档&lt;/a>&lt;/p>
&lt;p>发送post请求跟发送get请求类似，使用&lt;code>requests.post&lt;/code>方法就可以了，如果需要传post data的话，直接将data以dict的格式传递就好。&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; import requests
&amp;gt;&amp;gt;&amp;gt; r = requests.post(&amp;#39;http://httpbin.org/post&amp;#39;, data = {&amp;#39;key&amp;#39;:&amp;#39;value&amp;#39;})
&lt;/code>&lt;/pre>&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/21/mac-glasses.JPG?w=300"
 data-srcset="https://images.unsplash.com/21/mac-glasses.JPG?w=300, https://images.unsplash.com/21/mac-glasses.JPG?w=300 1.5x, https://images.unsplash.com/21/mac-glasses.JPG?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/21/mac-glasses.JPG?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>requests如何发送其他请求</title><link>https://itest2025.pages.dev/tutorials/42-004-requests%E5%A6%82%E4%BD%95%E5%8F%91%E9%80%81%E5%85%B6%E4%BB%96%E8%AF%B7%E6%B1%82/</link><pubDate>Wed, 22 Nov 2017 03:23:57 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/42-004-requests%E5%A6%82%E4%BD%95%E5%8F%91%E9%80%81%E5%85%B6%E4%BB%96%E8%AF%B7%E6%B1%82/</guid><description>&lt;p>&lt;a href="http://docs.python-requests.org/en/master/user/quickstart/#make-a-request" target="_blank" rel="noopener noreffer ">官方文档&lt;/a>&lt;/p>
&lt;p>delete,options,put等类型的请求在requests中均有对应的方法&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; r = requests.put(&amp;#39;http://httpbin.org/put&amp;#39;, data = {&amp;#39;key&amp;#39;:&amp;#39;value&amp;#39;})
&amp;gt;&amp;gt;&amp;gt; r = requests.delete(&amp;#39;http://httpbin.org/delete&amp;#39;)
&amp;gt;&amp;gt;&amp;gt; r = requests.head(&amp;#39;http://httpbin.org/get&amp;#39;)
&amp;gt;&amp;gt;&amp;gt; r = requests.options(&amp;#39;http://httpbin.org/get&amp;#39;)
&lt;/code>&lt;/pre>&lt;p>也可以使用requests统一的request方法来发送各种请求&lt;/p>
&lt;pre tabindex="0">&lt;code>r = requests.request(&amp;#39;get&amp;#39;, &amp;#39;https://api.github.com/events&amp;#39;)
&amp;gt;&amp;gt;&amp;gt; r = requests.request(&amp;#39;post&amp;#39;, &amp;#39;http://httpbin.org/post&amp;#39;, data = {&amp;#39;key&amp;#39;:&amp;#39;value&amp;#39;})
&amp;gt;&amp;gt;&amp;gt; r = requests.request(&amp;#39;put&amp;#39;, &amp;#39;http://httpbin.org/put&amp;#39;, data = {&amp;#39;key&amp;#39;:&amp;#39;value&amp;#39;})
&amp;gt;&amp;gt;&amp;gt; r = requests.request(&amp;#39;delete&amp;#39;, &amp;#39;http://httpbin.org/delete&amp;#39;)
&amp;gt;&amp;gt;&amp;gt; r = requests.request(&amp;#39;head&amp;#39;, &amp;#39;http://httpbin.org/get&amp;#39;)
&amp;gt;&amp;gt;&amp;gt; r = requests.request(&amp;#39;options&amp;#39;, &amp;#39;http://httpbin.org/get&amp;#39;)
&lt;/code>&lt;/pre>&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1559523182-a284c3fb7cff?w=300"
 data-srcset="https://images.unsplash.com/photo-1559523182-a284c3fb7cff?w=300, https://images.unsplash.com/photo-1559523182-a284c3fb7cff?w=300 1.5x, https://images.unsplash.com/photo-1559523182-a284c3fb7cff?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1559523182-a284c3fb7cff?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>requests如何自定义请求的headers?</title><link>https://itest2025.pages.dev/tutorials/42-005-requests%E5%A6%82%E4%BD%95%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AF%B7%E6%B1%82%E7%9A%84headers/</link><pubDate>Wed, 22 Nov 2017 03:23:57 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/42-005-requests%E5%A6%82%E4%BD%95%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AF%B7%E6%B1%82%E7%9A%84headers/</guid><description>&lt;p>&lt;a href="http://docs.python-requests.org/en/master/user/quickstart/#custom-headers" target="_blank" rel="noopener noreffer ">官方文档&lt;/a>&lt;/p>
&lt;p>有时候我们需要自定义一些请求的headers，比如我们可能需要将jwt的token放到headers里以完成鉴权。&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; url = &amp;#39;https://api.github.com/some/endpoint&amp;#39;
&amp;gt;&amp;gt;&amp;gt; headers = {&amp;#39;user-agent&amp;#39;: &amp;#39;my-app/0.0.1&amp;#39;}

&amp;gt;&amp;gt;&amp;gt; r = requests.get(url, headers=headers)
&lt;/code>&lt;/pre>&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1432821596592-e2c18b78144f?w=300"
 data-srcset="https://images.unsplash.com/photo-1432821596592-e2c18b78144f?w=300, https://images.unsplash.com/photo-1432821596592-e2c18b78144f?w=300 1.5x, https://images.unsplash.com/photo-1432821596592-e2c18b78144f?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1432821596592-e2c18b78144f?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>requests如何构造复杂的post请求?</title><link>https://itest2025.pages.dev/tutorials/42-006-requests%E5%A6%82%E4%BD%95%E6%9E%84%E9%80%A0%E5%A4%8D%E6%9D%82%E7%9A%84post%E8%AF%B7%E6%B1%82/</link><pubDate>Wed, 22 Nov 2017 03:23:57 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/42-006-requests%E5%A6%82%E4%BD%95%E6%9E%84%E9%80%A0%E5%A4%8D%E6%9D%82%E7%9A%84post%E8%AF%B7%E6%B1%82/</guid><description>&lt;p>默认情况下，在post方法中使用 data 关键字参数，Requests的行为会表现的像是在发送一个html表单，比如&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; payload = {&amp;#39;key1&amp;#39;: &amp;#39;value1&amp;#39;, &amp;#39;key2&amp;#39;: &amp;#39;value2&amp;#39;}

&amp;gt;&amp;gt;&amp;gt; r = requests.post(&amp;#34;http://httpbin.org/post&amp;#34;, data=payload)
&amp;gt;&amp;gt;&amp;gt; print(r.text)
{
 ...
 &amp;#34;form&amp;#34;: {
 &amp;#34;key2&amp;#34;: &amp;#34;value2&amp;#34;,
 &amp;#34;key1&amp;#34;: &amp;#34;value1&amp;#34;
 },
 ...
}
&lt;/code>&lt;/pre>&lt;p>如果需要为多个元素使用同一key的话，可以在data中传入元组，比如&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; payload = ((&amp;#39;key1&amp;#39;, &amp;#39;value1&amp;#39;), (&amp;#39;key1&amp;#39;, &amp;#39;value2&amp;#39;))
&amp;gt;&amp;gt;&amp;gt; r = requests.post(&amp;#39;http://httpbin.org/post&amp;#39;, data=payload)
&amp;gt;&amp;gt;&amp;gt; print(r.text)
{
 ...
 &amp;#34;form&amp;#34;: {
 &amp;#34;key1&amp;#34;: [
 &amp;#34;value1&amp;#34;,
 &amp;#34;value2&amp;#34;
 ]
 },
 ...
}
&lt;/code>&lt;/pre>&lt;p>如果 data 中传的是string而不是dict的话，那么字符串将会被直接发送出去&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; import json

&amp;gt;&amp;gt;&amp;gt; url = &amp;#39;https://api.github.com/some/endpoint&amp;#39;
&amp;gt;&amp;gt;&amp;gt; payload = {&amp;#39;some&amp;#39;: &amp;#39;data&amp;#39;}

&amp;gt;&amp;gt;&amp;gt; r = requests.post(url, data=json.dumps(payload))
&lt;/code>&lt;/pre>&lt;p>因为现在很多api接受json字符串格式的post data，Requests为这种方式提供了更简单的写法&lt;/p></description></item><item><title>requests如何在url中传递参数?</title><link>https://itest2025.pages.dev/tutorials/42-007-requests%E5%A6%82%E4%BD%95%E5%9C%A8url%E4%B8%AD%E4%BC%A0%E9%80%92%E5%8F%82%E6%95%B0/</link><pubDate>Wed, 22 Nov 2017 03:23:57 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/42-007-requests%E5%A6%82%E4%BD%95%E5%9C%A8url%E4%B8%AD%E4%BC%A0%E9%80%92%E5%8F%82%E6%95%B0/</guid><description>&lt;p>&lt;a href="http://docs.python-requests.org/en/master/user/quickstart/#passing-parameters-in-urls" target="_blank" rel="noopener noreffer ">官方文档&lt;/a>&lt;/p>
&lt;p>我们经常需要在请求中加参数，比如一些分页信息，每页返回的资源数量等。&lt;/p>
&lt;p>如果我们手工去构造这些参数的话，我们会在url后面接&lt;code>?&lt;/code>，然后传入key/value对，比如&lt;code>httpbin.org/get?key=val&lt;/code>。多个key/value对以&lt;code>&amp;amp;&lt;/code>分隔。&lt;/p>
&lt;p>在Requests里，我们一般使用&lt;code>params&lt;/code>关键字参数的方式，传入dict来传递url参数。比如，假设我们想传递&lt;code>key1=value1&lt;/code>和&lt;code>key2=value2&lt;/code>这2个参数，我们可以用下面的代码&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="o">&amp;gt;&amp;gt;&amp;gt;&lt;/span> &lt;span class="n">payload&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="s1">&amp;#39;key1&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;value1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;key2&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;value2&amp;#39;&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">&amp;gt;&amp;gt;&amp;gt;&lt;/span> &lt;span class="n">r&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">requests&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;http://httpbin.org/get&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">params&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">payload&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以通过url方法来查看requests帮我们构造的编码后的url&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; print(r.url)
http://httpbin.org/get?key2=value2&amp;amp;key1=value1
&lt;/code>&lt;/pre>&lt;p>我们还可以为同一个key传递一组数据，比如&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; payload = {&amp;#39;key1&amp;#39;: &amp;#39;value1&amp;#39;, &amp;#39;key2&amp;#39;: [&amp;#39;value2&amp;#39;, &amp;#39;value3&amp;#39;]}

&amp;gt;&amp;gt;&amp;gt; r = requests.get(&amp;#39;http://httpbin.org/get&amp;#39;, params=payload)
&amp;gt;&amp;gt;&amp;gt; print(r.url)
http://httpbin.org/get?key1=value1&amp;amp;key2=value2&amp;amp;key2=value3
&lt;/code>&lt;/pre>&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1416339442236-8ceb164046f8?w=300"
 data-srcset="https://images.unsplash.com/photo-1416339442236-8ceb164046f8?w=300, https://images.unsplash.com/photo-1416339442236-8ceb164046f8?w=300 1.5x, https://images.unsplash.com/photo-1416339442236-8ceb164046f8?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1416339442236-8ceb164046f8?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>requests如何获取响应的状态码?</title><link>https://itest2025.pages.dev/tutorials/42-008-requests%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E5%93%8D%E5%BA%94%E7%9A%84%E7%8A%B6%E6%80%81%E7%A0%81/</link><pubDate>Wed, 22 Nov 2017 03:23:57 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/42-008-requests%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E5%93%8D%E5%BA%94%E7%9A%84%E7%8A%B6%E6%80%81%E7%A0%81/</guid><description>&lt;p>使用&lt;code>status_code&lt;/code> 就可以了。&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; r = requests.get(&amp;#39;http://httpbin.org/get&amp;#39;)
&amp;gt;&amp;gt;&amp;gt; r.status_code
200
&lt;/code>&lt;/pre>&lt;p>为方便引用，Requests还附带了一个内置的状态码查询对象：&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; r.status_code == requests.codes.ok
True
&lt;/code>&lt;/pre>&lt;p>如果发送了一个错误请求(一个 4XX 客户端错误，或者 5XX 服务器错误响应)，我们可以通过 Response.raise_for_status() 来抛出异常：&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; bad_r = requests.get(&amp;#39;http://httpbin.org/status/404&amp;#39;)
&amp;gt;&amp;gt;&amp;gt; bad_r.status_code
404

&amp;gt;&amp;gt;&amp;gt; bad_r.raise_for_status()
Traceback (most recent call last):
 File &amp;#34;requests/models.py&amp;#34;, line 832, in raise_for_status
 raise http_error
requests.exceptions.HTTPError: 404 Client Error
&lt;/code>&lt;/pre>&lt;p>如果在测试用例中直接使用&lt;code>raise_for_status()&lt;/code>方法，如果有异常抛出的话，用例会自动失败。&lt;/p>
&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1507919909716-c8262e491cde?w=300"
 data-srcset="https://images.unsplash.com/photo-1507919909716-c8262e491cde?w=300, https://images.unsplash.com/photo-1507919909716-c8262e491cde?w=300 1.5x, https://images.unsplash.com/photo-1507919909716-c8262e491cde?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1507919909716-c8262e491cde?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>requests如何查看响应内容?</title><link>https://itest2025.pages.dev/tutorials/42-009-requests%E5%A6%82%E4%BD%95%E6%9F%A5%E7%9C%8B%E5%93%8D%E5%BA%94%E5%86%85%E5%AE%B9/</link><pubDate>Wed, 22 Nov 2017 03:23:57 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/42-009-requests%E5%A6%82%E4%BD%95%E6%9F%A5%E7%9C%8B%E5%93%8D%E5%BA%94%E5%86%85%E5%AE%B9/</guid><description>&lt;p>&lt;code>text&lt;/code> 方法会拿到请求的响应内容，比如以再github的timeline接口为例&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; import requests

&amp;gt;&amp;gt;&amp;gt; r = requests.get(&amp;#39;https://api.github.com/events&amp;#39;)
&amp;gt;&amp;gt;&amp;gt; r.text
u&amp;#39;[{&amp;#34;repository&amp;#34;:{&amp;#34;open_issues&amp;#34;:0,&amp;#34;url&amp;#34;:&amp;#34;https://github.com/...
&lt;/code>&lt;/pre>&lt;p>Requests会自动去解码server端返回的内容，大部分的unicode字符集都会被无缝解码。&lt;/p>
&lt;p>当你发送请求的时候，Requests会根据HTTP headers来推断编码，并在&lt;code>r.text&lt;/code>调用的时候使用。我们可以查看和修改Requests的编码，比如&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; r.encoding
&amp;#39;utf-8&amp;#39;
&amp;gt;&amp;gt;&amp;gt; r.encoding = &amp;#39;ISO-8859-1&amp;#39;
&lt;/code>&lt;/pre>&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1488998527040-85054a85150e?w=300"
 data-srcset="https://images.unsplash.com/photo-1488998527040-85054a85150e?w=300, https://images.unsplash.com/photo-1488998527040-85054a85150e?w=300 1.5x, https://images.unsplash.com/photo-1488998527040-85054a85150e?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1488998527040-85054a85150e?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>requests中如何查看响应的headers?</title><link>https://itest2025.pages.dev/tutorials/42-010-requests%E4%B8%AD%E5%A6%82%E4%BD%95%E6%9F%A5%E7%9C%8B%E5%93%8D%E5%BA%94%E7%9A%84headers/</link><pubDate>Wed, 22 Nov 2017 03:23:57 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/42-010-requests%E4%B8%AD%E5%A6%82%E4%BD%95%E6%9F%A5%E7%9C%8B%E5%93%8D%E5%BA%94%E7%9A%84headers/</guid><description>&lt;p>&lt;code>r.headers&lt;/code> 可以拿到Python 字典形式展示的服务器响应头：&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; r.headers
{
 &amp;#39;content-encoding&amp;#39;: &amp;#39;gzip&amp;#39;,
 &amp;#39;transfer-encoding&amp;#39;: &amp;#39;chunked&amp;#39;,
 &amp;#39;connection&amp;#39;: &amp;#39;close&amp;#39;,
 &amp;#39;server&amp;#39;: &amp;#39;nginx/1.0.4&amp;#39;,
 &amp;#39;x-runtime&amp;#39;: &amp;#39;148ms&amp;#39;,
 &amp;#39;etag&amp;#39;: &amp;#39;&amp;#34;e1ca502697e5c9317743dc078f67693f&amp;#34;&amp;#39;,
 &amp;#39;content-type&amp;#39;: &amp;#39;application/json&amp;#39;
}
&lt;/code>&lt;/pre>&lt;p>但是这个字典比较特殊：它是仅为 HTTP 头部而生的。根据&lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html" target="_blank" rel="noopener noreffer ">RFC 2616&lt;/a>， HTTP 头部是大小写不敏感的。&lt;/p>
&lt;p>因此，我们可以使用任意大写形式来访问这些响应头字段：&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; r.headers[&amp;#39;Content-Type&amp;#39;]
&amp;#39;application/json&amp;#39;

&amp;gt;&amp;gt;&amp;gt; r.headers.get(&amp;#39;content-type&amp;#39;)
&amp;#39;application/json&amp;#39;
&lt;/code>&lt;/pre>&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1501959181532-7d2a3c064642?w=300"
 data-srcset="https://images.unsplash.com/photo-1501959181532-7d2a3c064642?w=300, https://images.unsplash.com/photo-1501959181532-7d2a3c064642?w=300 1.5x, https://images.unsplash.com/photo-1501959181532-7d2a3c064642?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1501959181532-7d2a3c064642?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>requests如何解析json响应?</title><link>https://itest2025.pages.dev/tutorials/42-011-requests%E5%A6%82%E4%BD%95%E8%A7%A3%E6%9E%90json%E5%93%8D%E5%BA%94/</link><pubDate>Wed, 22 Nov 2017 03:23:57 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/42-011-requests%E5%A6%82%E4%BD%95%E8%A7%A3%E6%9E%90json%E5%93%8D%E5%BA%94/</guid><description>&lt;p>&lt;a href="http://docs.python-requests.org/en/master/user/quickstart/#json-response-content" target="_blank" rel="noopener noreffer ">官方文档&lt;/a>&lt;/p>
&lt;p>如果服务器返回json格式的数据，那么我们一般希望可以把json字符串转成python的dict数据类型。&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; import requests

&amp;gt;&amp;gt;&amp;gt; r = requests.get(&amp;#39;https://api.github.com/events&amp;#39;)
&amp;gt;&amp;gt;&amp;gt; r.json()
[{u&amp;#39;repository&amp;#39;: {u&amp;#39;open_issues&amp;#39;: 0, u&amp;#39;url&amp;#39;: &amp;#39;https://github.com/...
&lt;/code>&lt;/pre>&lt;p>如果JSON解析失败，r.json()会抛异常。比如假设响应的返回状态码是204(No Content)，又或者响应的返回json字符串格式有错误，那么r.json()回抛出&lt;code>ValueError: No JSON object could be decoded.&lt;/code>异常。&lt;/p>
&lt;p>需要引起注意的是r.json()解析成功了并不代表请求是成功的。很多服务器在响应失败的时候也会返回json字符串，如果要判断响应的状态的话，建议使用&lt;code>r.raise_for_status()&lt;/code> 或者使用&lt;code>check r.status_code&lt;/code>来判断返回值是否符合预期。&lt;/p>
&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1497215641119-bbe6d71ebaae?w=300"
 data-srcset="https://images.unsplash.com/photo-1497215641119-bbe6d71ebaae?w=300, https://images.unsplash.com/photo-1497215641119-bbe6d71ebaae?w=300 1.5x, https://images.unsplash.com/photo-1497215641119-bbe6d71ebaae?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1497215641119-bbe6d71ebaae?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>requests如何查看cookies和发送cookies?</title><link>https://itest2025.pages.dev/tutorials/42-012-requests%E5%A6%82%E4%BD%95%E6%9F%A5%E7%9C%8Bcookies%E5%92%8C%E5%8F%91%E9%80%81cookies/</link><pubDate>Wed, 22 Nov 2017 03:23:57 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/42-012-requests%E5%A6%82%E4%BD%95%E6%9F%A5%E7%9C%8Bcookies%E5%92%8C%E5%8F%91%E9%80%81cookies/</guid><description>&lt;p>如果某个响应中包含一些 cookie，你可以快速访问它们：&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; url = &amp;#39;http://example.com/some/cookie/setting/url&amp;#39;
&amp;gt;&amp;gt;&amp;gt; r = requests.get(url)

&amp;gt;&amp;gt;&amp;gt; r.cookies[&amp;#39;example_cookie_name&amp;#39;]
&amp;#39;example_cookie_value&amp;#39;
&lt;/code>&lt;/pre>&lt;p>要想发送你的cookies到服务器，可以使用 cookies 参数：&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; url = &amp;#39;http://httpbin.org/cookies&amp;#39;
&amp;gt;&amp;gt;&amp;gt; cookies = dict(cookies_are=&amp;#39;working&amp;#39;)

&amp;gt;&amp;gt;&amp;gt; r = requests.get(url, cookies=cookies)
&amp;gt;&amp;gt;&amp;gt; r.text
&amp;#39;{&amp;#34;cookies&amp;#34;: {&amp;#34;cookies_are&amp;#34;: &amp;#34;working&amp;#34;}}&amp;#39;
&lt;/code>&lt;/pre>&lt;p>Cookie 的返回对象为 &lt;a href="http://docs.python-requests.org/zh_CN/latest/api.html#requests.cookies.RequestsCookieJar" target="_blank" rel="noopener noreffer ">RequestsCookieJar&lt;/a>，它的行为和字典类似，但界面更为完整，适合跨域名跨路径使用。你还可以把 Cookie Jar 传到 Requests 中：&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; jar = requests.cookies.RequestsCookieJar()
&amp;gt;&amp;gt;&amp;gt; jar.set(&amp;#39;tasty_cookie&amp;#39;, &amp;#39;yum&amp;#39;, domain=&amp;#39;httpbin.org&amp;#39;, path=&amp;#39;/cookies&amp;#39;)
&amp;gt;&amp;gt;&amp;gt; jar.set(&amp;#39;gross_cookie&amp;#39;, &amp;#39;blech&amp;#39;, domain=&amp;#39;httpbin.org&amp;#39;, path=&amp;#39;/elsewhere&amp;#39;)
&amp;gt;&amp;gt;&amp;gt; url = &amp;#39;http://httpbin.org/cookies&amp;#39;
&amp;gt;&amp;gt;&amp;gt; r = requests.get(url, cookies=jar)
&amp;gt;&amp;gt;&amp;gt; r.text
&amp;#39;{&amp;#34;cookies&amp;#34;: {&amp;#34;tasty_cookie&amp;#34;: &amp;#34;yum&amp;#34;}}&amp;#39;
&lt;/code>&lt;/pre>&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1501891037204-8754d498396b?w=300"
 data-srcset="https://images.unsplash.com/photo-1501891037204-8754d498396b?w=300, https://images.unsplash.com/photo-1501891037204-8754d498396b?w=300 1.5x, https://images.unsplash.com/photo-1501891037204-8754d498396b?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1501891037204-8754d498396b?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>requests如何处理url的重定向?</title><link>https://itest2025.pages.dev/tutorials/42-013-requests%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86url%E7%9A%84%E9%87%8D%E5%AE%9A%E5%90%91/</link><pubDate>Wed, 22 Nov 2017 03:23:57 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/42-013-requests%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86url%E7%9A%84%E9%87%8D%E5%AE%9A%E5%90%91/</guid><description>&lt;p>默认情况下，除了HEAD请求, Requests 会自动处理所有重定向。&lt;/p>
&lt;p>如果你使用的是GET、OPTIONS、POST、PUT、PATCH 或者 DELETE，那么你可以通过 allow_redirects 参数禁用重定向处理：&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; r = requests.get(&amp;#39;http://github.com&amp;#39;, allow_redirects=False)
&amp;gt;&amp;gt;&amp;gt; r.status_code
301
&amp;gt;&amp;gt;&amp;gt; r.history
[]
&lt;/code>&lt;/pre>&lt;p>可以使用&lt;code>history&lt;/code>方法来追踪重定向&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; r = requests.get(&amp;#39;http://github.com&amp;#39;)

&amp;gt;&amp;gt;&amp;gt; r.url
&amp;#39;https://github.com/&amp;#39;

&amp;gt;&amp;gt;&amp;gt; r.status_code
200

&amp;gt;&amp;gt;&amp;gt; r.history
[&amp;lt;Response [301]&amp;gt;]
&lt;/code>&lt;/pre>&lt;p>如果你使用了 HEAD 方法，你也可以启用重定向：&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; r = requests.head(&amp;#39;http://github.com&amp;#39;, allow_redirects=True)
&amp;gt;&amp;gt;&amp;gt; r.url
&amp;#39;https://github.com/&amp;#39;
&amp;gt;&amp;gt;&amp;gt; r.history
[&amp;lt;Response [301]&amp;gt;]
&lt;/code>&lt;/pre>&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1542744095-fcf48d80b0fd?w=300"
 data-srcset="https://images.unsplash.com/photo-1542744095-fcf48d80b0fd?w=300, https://images.unsplash.com/photo-1542744095-fcf48d80b0fd?w=300 1.5x, https://images.unsplash.com/photo-1542744095-fcf48d80b0fd?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1542744095-fcf48d80b0fd?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>requests如何处理二进制的响应内容？</title><link>https://itest2025.pages.dev/tutorials/42-014-requests%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%E4%BA%8C%E8%BF%9B%E5%88%B6%E7%9A%84%E5%93%8D%E5%BA%94%E5%86%85%E5%AE%B9/</link><pubDate>Wed, 22 Nov 2017 03:23:57 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/42-014-requests%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%E4%BA%8C%E8%BF%9B%E5%88%B6%E7%9A%84%E5%93%8D%E5%BA%94%E5%86%85%E5%AE%B9/</guid><description>&lt;p>&lt;a href="http://docs.python-requests.org/en/master/user/quickstart/#binary-response-content" target="_blank" rel="noopener noreffer ">官方文档&lt;/a>&lt;/p>
&lt;p>有时候服务器返回的数据不是文本的，而是二进制的，这时候我们就需要处理二进制的内容。&lt;/p>
&lt;p>Requests中可以使用content方法来返回二进制的响应内容，比如&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; r.content
b&amp;#39;[{&amp;#34;repository&amp;#34;:{&amp;#34;open_issues&amp;#34;:0,&amp;#34;url&amp;#34;:&amp;#34;https://github.com/...
&lt;/code>&lt;/pre>&lt;p>如果响应是gzip压缩过的，Requests会自动解压。&lt;/p>
&lt;p>下面这个例子演示了如何从服务器返回的二进制内容创建图片。&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; from PIL import Image
&amp;gt;&amp;gt;&amp;gt; from io import BytesIO

&amp;gt;&amp;gt;&amp;gt; i = Image.open(BytesIO(r.content))
&lt;/code>&lt;/pre>&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1501556466850-7c9fa1fccb4c?w=300"
 data-srcset="https://images.unsplash.com/photo-1501556466850-7c9fa1fccb4c?w=300, https://images.unsplash.com/photo-1501556466850-7c9fa1fccb4c?w=300 1.5x, https://images.unsplash.com/photo-1501556466850-7c9fa1fccb4c?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1501556466850-7c9fa1fccb4c?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>requests中如何设置请求的超时时间?</title><link>https://itest2025.pages.dev/tutorials/42-015-requests%E4%B8%AD%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE%E8%AF%B7%E6%B1%82%E7%9A%84%E8%B6%85%E6%97%B6%E6%97%B6%E9%97%B4/</link><pubDate>Wed, 22 Nov 2017 03:23:57 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/42-015-requests%E4%B8%AD%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE%E8%AF%B7%E6%B1%82%E7%9A%84%E8%B6%85%E6%97%B6%E6%97%B6%E9%97%B4/</guid><description>&lt;p>使用timeout 参数可以设定等待连接的秒数，如果等待超时，Requests会抛出异常&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; requests.get(&amp;#39;http://github.com&amp;#39;, timeout=0.001)
Traceback (most recent call last):
 File &amp;#34;&amp;lt;stdin&amp;gt;&amp;#34;, line 1, in &amp;lt;module&amp;gt;
requests.exceptions.Timeout: HTTPConnectionPool(host=&amp;#39;github.com&amp;#39;, port=80): Request timed out. (timeout=0.001)
&lt;/code>&lt;/pre>&lt;p>timeout 仅对连接过程有效，与响应体的下载无关。 timeout 并不是整个下载响应的时间限制，而是如果服务器在 timeout 秒内没有应答，将会引发一个异常（更精确地说，是在 timeout 秒内没有从基础套接字上接收到任何字节的数据时)。&lt;/p>
&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1498758536662-35b82cd15e29?w=300"
 data-srcset="https://images.unsplash.com/photo-1498758536662-35b82cd15e29?w=300, https://images.unsplash.com/photo-1498758536662-35b82cd15e29?w=300 1.5x, https://images.unsplash.com/photo-1498758536662-35b82cd15e29?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1498758536662-35b82cd15e29?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>requests中如何上传文件?</title><link>https://itest2025.pages.dev/tutorials/42-016-requests%E4%B8%AD%E5%A6%82%E4%BD%95%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6/</link><pubDate>Wed, 22 Nov 2017 03:23:57 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/42-016-requests%E4%B8%AD%E5%A6%82%E4%BD%95%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6/</guid><description>&lt;p>最简单的方式&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; url = &amp;#39;http://httpbin.org/post&amp;#39;
&amp;gt;&amp;gt;&amp;gt; files = {&amp;#39;file&amp;#39;: open(&amp;#39;report.xls&amp;#39;, &amp;#39;rb&amp;#39;)}

&amp;gt;&amp;gt;&amp;gt; r = requests.post(url, files=files)
&amp;gt;&amp;gt;&amp;gt; r.text
{
 ...
 &amp;#34;files&amp;#34;: {
 &amp;#34;file&amp;#34;: &amp;#34;&amp;lt;censored...binary...data&amp;gt;&amp;#34;
 },
 ...
}
&lt;/code>&lt;/pre>&lt;p>你可以显式地设置文件名，文件类型和请求头：&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt;&amp;gt;&amp;gt; url = &amp;#39;http://httpbin.org/post&amp;#39;
&amp;gt;&amp;gt;&amp;gt; files = {&amp;#39;file&amp;#39;: (&amp;#39;report.xls&amp;#39;, open(&amp;#39;report.xls&amp;#39;, &amp;#39;rb&amp;#39;), &amp;#39;application/vnd.ms-excel&amp;#39;, {&amp;#39;Expires&amp;#39;: &amp;#39;0&amp;#39;})}

&amp;gt;&amp;gt;&amp;gt; r = requests.post(url, files=files)
&amp;gt;&amp;gt;&amp;gt; r.text
{
 ...
 &amp;#34;files&amp;#34;: {
 &amp;#34;file&amp;#34;: &amp;#34;&amp;lt;censored...binary...data&amp;gt;&amp;#34;
 },
 ...
}
&lt;/code>&lt;/pre>&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1500989145603-8e7ef71d639e?w=300"
 data-srcset="https://images.unsplash.com/photo-1500989145603-8e7ef71d639e?w=300, https://images.unsplash.com/photo-1500989145603-8e7ef71d639e?w=300 1.5x, https://images.unsplash.com/photo-1500989145603-8e7ef71d639e?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1500989145603-8e7ef71d639e?w=300"
 title="课程图片" />&lt;/p></description></item></channel></rss>