一直以来都是在使用requests库,但没有对它做深入的了解,下面是自己对此库的源码理解。
此模块主要是导入一些模块包括urllib3、request、get、post、delete等请求方法,检查一些依赖库或模块的兼容性和检查字符串的类型等。
1、只导入了一个模块叫session。
2、其中有一个叫request的基础方法很重要,此方法用上下文管理器with调用session的Session类下的request方法并返回。
3、此模块还包括requests常用的get、post、put、delete、option等api方法它们通过调用api模块中的request产生作用。
下面分析sessions模块下的类Session
1、Session是session模块下的一个类,init方法不接收任何参数,类似api模块,封装了request(基础方法,供get、post等方法调用)、get、post、delete等请求方法。
2、我们都用过requests.get(url,headers,proxies,timeout),其实这个get方法就是直接实例化了Session(),然后调用了它的request()方法。
3、Session下的request是所有请求方法都会调用的基础方法,它的参数值的研究一下:
def request(self, method, url,
params=None, data=None, headers=None, cookies=None, files=None,
auth=None, timeout=None, allow_redirects=True, proxies=None,
hooks=None, stream=None, verify=None, cert=None, json=None):
这些参数中我们最常用的就是method(直接调用需自己写值(get、post等字符串),不必区分大小写),url、data、headers、cookies、timeout、proxies,跳过认证的时候会用到verify。
其他的参数分别是什么意思呢:
params:用于拼接url
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params=payload)
print(r.url)
#结果:http://httpbin.org/get?key1=value1&key2=value2
files:上传编码文件
>>> url = 'http://httpbin.org/post'
>>> files = {'file': open('report.xls', 'rb')}
>>> r = requests.post(url, files=files)
>>> r.text
{
...
"files": {
"file": ""
},
...
}
显示的设置文件名、文件类型、请求头:
>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
>>> r = requests.post(url, files=files)
>>> r.text
{
...
"files": {
"file": ""
},
...
}
如果你想,你也可以发送作为文件来接收的字符串:
>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')}
>>> r = requests.post(url, files=files)
>>> r.text
{
...
"files": {
"file": "some,data,to,send\\nanother,row,to,send\\n"
},
...
}
auth:web端的认证
基本认证:许多需要身份验证的Web服务都接受HTTP Basic Auth,这是最简单的类型
>>> requests.get('https://api.github.com/user', auth=('user', 'pass'))
<Response [200]>
摘要认证,开箱即用:
>>> from requests.auth import HTTPDigestAuth
>>> url = 'https://httpbin.org/digest-auth/auth/user/pass'
>>> requests.get(url, auth=HTTPDigestAuth('user', 'pass'))
<Response [200]>
OAuth 1身份验证等其他验证,详见链接[ http://docs.python-requests.org/en/master/user/authentication/ ]
allow_redirects:顾名思义是允许重定向的意思,默认为True,允许。
hooks:
stream:
cert:
json:
大家都用过requests.session()方法,用于cookie保持,防止频繁登录,一般都这样用:
from requests import session
s = session()
#登录请求
s.post(url,data,proxies,headers)
#登录成功后,s这个对象中就带着cookie了,再请求此网站其他的页面url2...就可以了
s.get(url2,headers)
说白了,代码中的session在源码中就是一个两行代码的方法,如下:
def session():
return Session()
返回值还是实例化的Session对象。
持续更新中!!!