【Python Requests开发文档 2.10】快速上手

下面我们就开始学习Requests简单优雅的API吧!

首先,请先确保自己Requests已经安装好了。

我们将通过下面的例子来学习Requests:

  1. 发起请求
  2. Get请求给url添加参数
  3. Response的内容
  4. 二进制响应

发起请求

打开控制台,输入:

>>> import requests

引入requests模块

下面来获取一个网页,作为示例,我们来获取一下百度的首页:

>>> r = requests.get("https://www.baidu.com")

好了,这个 r 就是我们获取的Response对象,从r中能获取所有我们需要的信息。

Requests API的设计理念之一是所有的HTTP的请求都能在api中明显的体现。比如,我们可以用下面的api发起HTTP Post连接:

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

方便极了!

好了,下面来其他的HTTP方法吧:PUT、DELETE、HEAD、OPTIONS,它们也一样简单:

>>> r = requests.put('http://httpbin.org/put', data = {'key':'value'})
>>> r = requests.delete('http://httpbin.org/delete')
>>> r = requests.head('http://httpbin.org/get')
>>> r = requests.options('http://httpbin.org/get')

Get请求给url添加参数

大部分时候我们发起Get请求的时候需要给url添加参数,其它库很多都需要手动地添加查询参数,比如:

http://httpbin.org/get?key=val

Requests提供了一个功能:可以将参数放在字典里,然后由Requests自动组合成一个url去发起Get请求

payload={key1:val1, key2=val2}
r=requests.get('http://httpbin.org/get', params=payload)
print(r.url)

如果value为None,那对应的key就不会被添加到url里;另外,还可以添加value还可以是数组。

payload={key1:val1, key2=[val2,val3,val4]}
r=requests.get('http://httpbin.org/get', params=payload)
print(r.url)

Response的内容

下面我们来看一下Response中的内容:

import requests
r=requests.get("http://www.zgljl2012.com")
print(r.text)

可以看到输出了首页的整个内容。

requests可以自动地对服务器来的内容进行编码。做到了对绝大部分的Unicode字符的无缝支持。编码会在你调用r.text的时候起效。编码可以获取也可以修改:

>>> r.encoding
'utf-8'
>>> r.encoding='gbk'

除了r.text之外,还有一个变量可以查看内容:

>>> r.content

但r.content输出的是未经Unicode编码的。如果想要您的爬虫支持任何特殊情形的话,可以先用r.content取得编码,然后再用r.encoding设置编码,最后用r.text输出,当然,前提是您所访问的内容里有指定编码,比如html和xml。

二进制响应内容

对于gzip和defalte压缩的页面能自动解码。

示例,在网络上请求一张图片,可以使用如下方式:

>>> from PIL import Image
>>> from io import StringIO
>>> i = Image.open(StringIO(r.content))

JSON响应内容

Requests内置了JSON解码器,以便开发者处理JSON:

import requests
r = requests.get("http://example.json")
print(r.json())

如果解码失败,将抛出异常。当没有内容、或是返回的数据不符合JSON规范,都将抛出ValueError异常。另外,有些服务器在返回500错误的时候,返回的也是JSON数据,但这个时候数据就是错的,所以,建议先用r.raise_for_status()或者r.status_code检查一下返回是不是正常的数据(200)。