python requests源码学习

python爬虫requests库源码学习

  • 前言
    • requests初始化模块__init__.py
    • requests.api模块
    • requests.sessions.Session
    • requests.session

前言

一直以来都是在使用requests库,但没有对它做深入的了解,下面是自己对此库的源码理解。

requests初始化模块__init__.py

此模块主要是导入一些模块包括urllib3、request、get、post、delete等请求方法,检查一些依赖库或模块的兼容性和检查字符串的类型等。

requests.api模块

1、只导入了一个模块叫session。
2、其中有一个叫request的基础方法很重要,此方法用上下文管理器with调用session的Session类下的request方法并返回。
3、此模块还包括requests常用的get、post、put、delete、option等api方法它们通过调用api模块中的request产生作用。
下面分析sessions模块下的类Session

requests.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

大家都用过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对象。

持续更新中!!!

你可能感兴趣的:(python)