简介

requests 库是 python 中一个最常用的网络请求库,在爬虫时使用甚多。它请求的方式简单,只需简单地调用其内置地 get、post 等方法即可发送请求。本文章从面向对象的角度来介绍其使用方法以及源码解析。

requests 库使用了 restful 风格设计的 api,即 getpostputpatchdelete 五种 HTTP 方法,对应了 CRUD 操作。

Requests 请求对象

requests 中,这几个 api 入参后会构造一个 Requests 对象:

  • method:请求方法,默认 get,可选择的有:getpostputpatchdeleteheadoptions,例如:
python
1
2
import requests
requests.request(method='get',url='https://api.bimg.cc/all')

这种写法有些冗余,所以一般不使用 request 方法,而是直接使用 requests.getrequests.postrequests.putrequests.patchrequests.deleterequests.headrequests.options,例如:

python
1
2
3
4
5
import requests
requests.get('https://api.github.com')
requests.post('https://httpbin.org/post', data={'key':'value'})
requests.put('https://httpbin.org/put', data={'key':'value'})
requests.delete('https://httpbin.org/delete')
python
1
2
import requests
requests.get('https://api.bimg.cc/all',headers={'Access-Control-Allow-Origin':'*','Access-Control-Allow-Headers':'Content-Type','Access-Control-Allow-Methods':'*','Content-Type':'application/json;charset=utf-8'})
  • files:文件列表,上传文件,详情
  • params:请求参数,在 get 方法中,可以用 ?key=value 来作为请求参数,也可使用 params={'key':'value} 的形式来请求参数,例如:
python
1
2
3
import requests
response = requests.get('https://api.bimg.cc/all',params={'page': '2'})
print(response.json())
  • data:请求参数,在 post 等方法中,如果是表单请求(即请求内容是 application/x-www-form-urlencoded),可使用 data={'key':'value'} 的形式发送请求参数,例如:
python
1
2
import requests
requests.post('https://httpbin.org/post', data={'key':'value'})
  • json:请求参数,在 post 等方法中,如果是发送 json 数据(即请求内容是 application/json),可使用 json={'key':'value'} 的形式发送请求参数,例如:
python
1
2
import requests
requests.post('https://httpbin.org/post', json={'key':'value'})
  • cookies:cookie,保存服务器的一些数据,发送请求时携带在请求头上,headers={'cookie':'xxxx'},或者用以下方法也可携带 cookie:
python
1
2
import requests
requests.post('https://httpbin.org/post', cookies={'key':'value'})
  • auth:认证,等同于在请求头加上 {'Authorization':'xxxxxxxxxxx'},不常用

  • hooks:回调方法

requests.get(url, params=None, **kwargs) 也设置了一些参数来辅助构造 Requests 对象:

  • timeout 超时时间 (秒),可整数 / 浮点数,如果请求在规定时间内还未响应,则抛出一个 exception,也可传入一个包含两个简单浮点数的元组,用来分别设置请求超时时间和读取超时时间,例如:
python
1
2
3
import requests
requests.post('https://httpbin.org/post', timeout=3)
requests.post('https://httpbin.org/post', timeout=(2,5))
  • stream,是否以流的方式传输,默认情况下 stream=False,当请求到服务器资源后,它会立即开始下载文件并存放到内存当中,如果文件过大就会导致内存不足的情况,如果以流的方式传输,则请求会先下载响应头,数据内容还未下载,例如:
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import requests
r = requests.get('https://blog.aqcoder.cn/code/txt/version/news.txt', stream=True)
f = open("news.txt", "wb")

max_size=10*1024*1024 #文件下载的最大值
current_size=0

for chunk in r.iter_content(chunk_size=512): # 按照块的大小读取
# for chunk in r.iter_lines(): # 按照一行一行的读取
if chunk and current_size<max_size:
current_size=current_size+512
f.write(chunk)
else:
print("no no no")
  • proxies,设置代理
  • verify,是否验证请求地址的证书,默认 True
  • cert,证书,如果是 String 类型,表示.pem 文件路径,如果是 Tuple 类型,表示 ('cert', 'key')

Response 响应对象

requests 中,这几个 api 的返回值是一个 Response 对象:

python
1
2
3
import requests
response = requests.get('https://api.bimg.cc/all',params={'page': '2'})
print(response.status_code)
python
1
2
3
import requests
response = requests.get('https://api.bimg.cc/all',params={'page': '2'})
print(response.headers)
  • url,请求地址
  • encoding,编码
  • cookies,cooike

更多参数

requests 也设置了一些参数来辅助构造 Response 对象:

  • text,返回响应的内容,unicode 类型数据,例如:
python
1
2
3
import requests
response = requests.get('https://baidu.com')
print(response.text)
  • content,返回响应的内容,以字节为单位,例如:
python
1
2
3
import requests
response = requests.get('https://api.bimg.cc/all',params={'page': '2'})
print(response.content)
  • json(),返回响应的 JSON 对象 ,例如:
python
1
2
3
import requests
response = requests.get('https://api.bimg.cc/all',params={'page': '2'})
print(response.json())
  • ok,检查 “status_code” 的值,如果小于 400,则返回 True,如果不小于 400,则返回 False,例如:
python
1
2
3
import requests
response = requests.get('https://api.bimg.cc/all',params={'page': '2'})
print(response.ok)

源码解析

待完善……

参考文章

https://realpython.com/python-requests/

https://restfulapi.cn/

https://github.com/psf/requests

https://www.runoob.com/python3/python-requests.html