简介 requests 库是python中一个最常用的网络请求库,在爬虫时使用甚多。它请求的方式简单,只需简单地调用其内置地get、post等方法即可发送请求。本文章从面向对象的角度来介绍其使用方法以及源码解析。
requests 库使用了restful 风格设计的api,即get,post,put,patch,delete五种 HTTP 方法,对应了 CRUD 操作。
Requests请求对象 在requests 中,这几个api 入参后会构造一个Requests 对象:
method:请求方法,默认get,可选择的有:get,post,put,patch,delete,head,options,例如:1 2 import requestsrequests.request(method='get' ,url='https://api.bimg.cc/all' )
这种写法有些冗余,所以一般不使用request方法,而是直接使用requests.get ,requests.post ,requests.put ,requests.patch ,requests.delete ,requests.head ,requests.options ,例如:
1 2 3 4 5 import requestsrequests.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 requestsrequests.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 requestsresponse = 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 requestsrequests.post('https://httpbin.org/post' , data={'key' :'value' })
json:请求参数,在post等方法中,如果是发送json数据(即请求内容是application/json),可使用json={'key':'value'}的形式发送请求参数,例如:1 2 import requestsrequests.post('https://httpbin.org/post' , json={'key' :'value' })
cookies:cookie,保存服务器的一些数据,发送请求时携带在请求头上,headers={'cookie':'xxxx'},或者用以下方法也可携带cookie:1 2 import requestsrequests.post('https://httpbin.org/post' , cookies={'key' :'value' })
requests.get(url, params=None, **kwargs)也设置了一些参数来辅助构造Requests 对象:
timeout 超时时间(秒),可整数/浮点数,如果请求在规定时间内还未响应,则抛出一个exception ,也可传入一个包含两个简单浮点数的元组,用来分别设置请求超时时间和读取超时时间,例如:1 2 3 import requestsrequests.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 requestsr = 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 ): if chunk and current_size<max_size: current_size=current_size+512 f.write(chunk) else : print ("no no no" )
proxies,设置代理verify,是否验证请求地址的证书,默认Truecert,证书,如果是String类型,表示.pem文件路径,如果是Tuple类型,表示('cert', 'key')Response响应对象 在requests 中,这几个api 的返回值是一个Response 对象:
1 2 3 import requestsresponse = requests.get('https://api.bimg.cc/all' ,params={'page' : '2' }) print (response.status_code)
1 2 3 import requestsresponse = 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 requestsresponse = requests.get('https://baidu.com' ) print (response.text)
content,返回响应的内容,以字节为单位,例如:1 2 3 import requestsresponse = requests.get('https://api.bimg.cc/all' ,params={'page' : '2' }) print (response.content)
json(),返回响应的 JSON 对象 ,例如:1 2 3 import requestsresponse = requests.get('https://api.bimg.cc/all' ,params={'page' : '2' }) print (response.json())
ok,检查 “status_code” 的值,如果小于400,则返回 True,如果不小于 400,则返回 False,例如:1 2 3 import requestsresponse = 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