requests库

安装

使用pip进行安装

要安装 requests,最方便快捷的方法是使用 pip 进行安装。

pip install requests

如果还没有安装pip,这个链接 Properly Installing Python 详细介绍了在各种平台下如何安装 python 以及 setuptools,pip,virtualenv 等常用的 python 工具,可以参考其中的步骤来进行安装。

发送请求与传递参数

使用 Requests 发送网络请求非常简单。

一开始要导入 Requests 模块:

>>> import requests

然后,尝试获取某个网页。本例子中,我们来获取 Github 的公共时间线:

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

现在,我们有一个名为 rResponse 对象。我们可以从这个对象中获取所有我们想要的信息。

Requests 简便的 API 意味着所有 HTTP 请求类型都是显而易见的。例如,你可以这样发送一个 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')

都很不错吧,但这也仅是 Requests 的冰山一角呢。

传递 URL 参数

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

>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.get("http://httpbin.org/get", params=payload)

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

>>> print(r.url)
http://httpbin.org/get?key2=value2&key1=value1

注意字典里值为 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

参数说明

http 请求 getpost 是最常用的,url 为必选参数,常用常用参数有params、data、json、files、timeout、headers、cookies;其他基本用不到的有verify,cert,auth,allow_redirects,proxies,hooks,stream。

下面列表对具体的参数说明:

重点在 params、data、json、files、timeout,其次headers、cookies,其他略过就可以。

undefined

Response对象

get请求是最简单的、发送的数据量比较小。

使用 requests方法后,会返回一个response对象,其存储了服务器响应的内容,如上实例中已经提到的 r.text、r.status_code…… 获取文本方式的响应体实例:当你访问 r.text 之时,会使用其响应的文本编码进行解码,并且你可以修改其编码让 r.text 使用自定义的编码进行解码。

r = requests.get('http://www.itwhy.org')
print(r.text, '\n{}\n'.format('*'*79), r.encoding)
r.encoding = 'GBK'
print(r.text, '\n{}\n'.format('*'*79), r.encoding)

其他响应:

r.status_code # 响应状态码
 r.encoding  # 获取网页编码
r.raw #返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read() 读取
r.content #字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩
r.text #字符串方式的响应体,会自动根据响应头部的字符编码进行解码
r.headers #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
#*特殊方法*#
r.json() #Requests中内置的JSON解码器
r.raise_for_status() #失败请求(非200响应)抛出异常
  • 示例2.1: 带多个参数的请求,返回文本数据
import requests

# 带参数的GET请求,timeout请求超时时间
params = {'key1': 'python', 'key2': 'java'}
r = requests.get(url='http://httpbin.org/get', params=params, timeout=3)

# 注意观察url地址,它已经将参数拼接起来
print('URL地址:', r.url)
# 响应状态码,成功返回200,失败40x或50x
print('请求状态码:', r.status_code)
print('header信息:', r.headers)
print('cookie信息:', r.cookies)
print('响应的数据:', r.text)
# 如响应是json数据 ,可以使用 r.json()自动转换为dict
print('响应json数据', r.json())
  • 示例2.2:get 返回二进制数据,如图片。
from PIL import Image
from io import BytesIO
import requests

# 请求获取图片并保存
r = requests.get('https://pic3.zhimg.com/247d9814fec770e2c85cc858525208b2_is.jpg')
i = Image.open(BytesIO(r.content))
# i.show()  # 查看图片
# 将图片保存
with open('img.jpg', 'wb') as fd:
   for chunk in r.iter_content():
       fd.write(chunk)

post请求,上传表单,文本,文件\图片

post 请求比 get 复杂,请求的数据有多种多样,有表单(form-data),文本(json\xml等),文件流(图片\文件)等。

要发送POST请求,只需要把get()方法变成post(),然后传入data参数作为POST请求的数据:

表单形式提交的post请求,只需要将数据传递给post()方法的data参数。见示例3.1.

json文本形式提交的post请求,一种方式是将json数据dumps后传递给data参数,另一种方式就是直接将json数据传递给post()方法的json参数。见示例3.2.

单个文件提交的post请求,将文件流给post()方法的files参数。见示例3.3。

多个文件提交的post请求,将文件设到一个元组的列表中,其中元组结构为 (form_field_name, file_info);然后将数据传递给post()方法的files。见示例3.4

  • 示例3.1:post 表单请求
import requests, json

# 带参数表单类型post请求
data={'custname': 'woodman','custtel':'13012345678','custemail':'woodman@11.com',
     'size':'small'}
r = requests.post('http://httpbin.org/post', data=data)
print('响应数据:', r.text)
  • 示例3.2:post json请求
# json数据请求
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
# 可以使用json.dumps(dict) 对编码进行编译
r = requests.post(url, data=json.dumps(payload))
print('响应数据:', r.text)

# 可以直接使用json参数传递json数据
r = requests.post(url, json=payload)
print('响应数据:', r.text)
  • 示例3.3:post提交单个文件
# 上传单个文件
url = 'http://httpbin.org/post'
# 注意文件打开的模式,使用二进制模式不容易发生错误
files = {'file': open('report.txt', 'rb')}
# 也可以显式地设置文件名,文件类型和请求头
# files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
r = requests.post(url, files=files)
r.encoding = 'utf-8'
print(r.text)

注意:文件的上传使用二进制打开不容易报错。

  • 示例3.4:上传多个文件
url = 'http://httpbin.org/post'
multiple_files = [
   ('images', ('foo.png', open('foo.png', 'rb'), 'image/png')),
   ('images', ('bar.png', open('bar.png', 'rb'), 'image/png'))]
r = requests.post(url, files=multiple_files)
print(r.text)

定制请求头

获取 getpost 请求响应的 headercookie 分别使用 r.headersr.cookies 。如果提交请求数据是对 header 与 cookie 有修改,需要在get()与post()方法中加入 headers 或 cookies 参数,它们值的类型都是字典

  • 示例4.1:定制请求头header
import requests

url = 'https://api.github.com/some/endpoint'
headers = {'user-agent': 'my-app/0.0.1'}
r = requests.get(url, headers=headers)
print(r.headers)  # 获取响应数据的header信息

注意:requests自带headers管理,一般情况下不需要设置header信息。Requests 不会基于定制 header 的具体情况改变自己的行为。只不过在最后的请求中,所有的 header 信息都会被传递进去。

  • 示例4.2:定制cookie信息
# 直接以字典型时传递cookie
url = 'http://httpbin.org/cookies'
cookies = {"cookies_are":'working'}
r = requests.get(url, cookies=cookies)
# 获取响应的cookie信息,返回结果是RequestsCookieJar对象
print(r.cookies)
print(r.text)

session与cookie存储

会话对象requests.Session能够跨请求地保持某些参数,比如cookies,即在同一个Session实例发出的所有请求都保持同一个cookies,而requests模块每次会自动处理cookies,这样就很方便地处理登录时的cookies问题。

如果你向同一主机发送多个请求,每个请求对象让你能够跨请求保持session和cookie信息,这时我们要使用到requests的Session()来保持回话请求的cookie和session与服务器的相一致。

import requests

url = "http://www.renren.com/PLogin.do"
data = {"email":"970138074@qq.com",'password':"pythonspider"}
headers = {
    'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"
}

# 登录
session = requests.session()
session.post(url,data=data,headers=headers)

# 访问大鹏个人中心
resp = session.get('http://www.renren.com/880151247/profile')

print(resp.text)

requests请求返回对象Response的常用方法

requests.get(url)requests.post(url) 的返回对象为Response 类对象。

Response响应类常用属性与方法:

Response.url           请求url,[见示例2.1]

Response.status_code   响应状态码,[见示例2.1]

Response.text          获取响应内容,[见示例2.1]

Response.content        以字节形式获取响应提,多用于非文本请求,[见示例2.2]

Response.json()           活动响应的JSON内容,[见示例2.1]

Response.ok            请求是否成功,status_code<400 返回True

Response.headers       响应header信息,[见示例2.1]

Response.cookies       响应的cookie,[见示例2.1]

Response.elapsed       请求响应的时间。

Response.links         返回响应头部的links连接,相当于Response.headers.get('link')

Response.raw           获取原始套接字响应,需要将初始请求参数stream=True

Response.encoding      查看响应头部字符编码

Response.iter_content() 迭代获取响应数据,[见示例2.2]

Response.history    重定向请求历史记录

Response.reason        响应状态的文本原因,如:"Not Found" or "OK"

Response.close()    关闭并释放链接,释放后不能再次访问’raw’对象。一般不会调用。

参考

  1. python3之requests
Update time: 2020-08-13

results matching ""

    No results matching ""