简介

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

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

Requests请求对象

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

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

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

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')
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}的形式来请求参数,例如:
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'}的形式发送请求参数,例如:
1
2
import requests
requests.post('https://httpbin.org/post', data={'key':'value'})
  • json:请求参数,在post等方法中,如果是发送json数据(即请求内容是application/json),可使用json={'key':'value'}的形式发送请求参数,例如:
1
2
import requests
requests.post('https://httpbin.org/post', json={'key':'value'})
  • cookies:cookie,保存服务器的一些数据,发送请求时携带在请求头上,headers={'cookie':'xxxx'},或者用以下方法也可携带cookie:
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,也可传入一个包含两个简单浮点数的元组,用来分别设置请求超时时间和读取超时时间,例如:
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,当请求到服务器资源后,它会立即开始下载文件并存放到内存当中,如果文件过大就会导致内存不足的情况,如果以流的方式传输,则请求会先下载响应头,数据内容还未下载,例如:
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对象:

1
2
3
import requests
response = requests.get('https://api.bimg.cc/all',params={'page': '2'})
print(response.status_code)
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类型数据,例如:
1
2
3
import requests
response = requests.get('https://baidu.com')
print(response.text)
  • content,返回响应的内容,以字节为单位,例如:
1
2
3
import requests
response = requests.get('https://api.bimg.cc/all',params={'page': '2'})
print(response.content)
  • json(),返回响应的 JSON 对象 ,例如:
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,例如:
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