前几次文章介绍了页面爬取的三种用法,并且也使用到Requests模块,但是没有详细的讲解,本次推文专门带大家了解一下Requests模块。
一、模块简介
Requests是使用Apache2 licensed 许可证的HTTP库;
是一个基于Python开的Http库,其在Python内置模块的基础上进行了高度的封装,从而我们在使用Http请求的时候变得非常的简单;
比urllib2模块更简洁好用;
二、安装
安装很简单
pip install requests
三、请求类型
HTTP的请求类型分别为:GET(获取数据)、POST(提交表单)、PUT(更新)、DETELE(删除)、HEAD(获取相应头信息)、OPTIONS(获取指定资源所支持HTTP请求方法)以及PATCH(新引入的,是对PUT方法的补充,用来对已知资源进行局部更新)
常用到的是GET与POST.
基本用法都很简单:
r = requests.get('https://api.github.com/events')
r = requests.post('http://httpbin.org/post', data = {'key':'value'})
r = requests.put('http://httpbin.org/put', data = {'key':'value'})
r = requests.delete('http://httpbin.org/delete')
r = requests.head('http://httpbin.org/get')
r = requests.options('http://httpbin.org/get')
具体使用哪种方式,是取决于服务端的限制,我们也可以通过options的方式获取所支持的HTTP请求方式;
四、请求参数
HTTP请求的方式有哪些参数呢?
4.1 url 请求地址
r = requests.get('http://github.com') #括号中的地址就是url
4.2 params 接口参数
params= {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params=params)
Get还可以使用 ”?Key=value” 拼接的方式
r = requests.get("http://httpbin.org/get?key=value")
4.3 headers 头部信息
headers是一个字典的形式,可以随便找一个网站,
按下F12——>选择Network——>选择一个Http请求,
就可以查看到Request Headers的信息了;
content-type:显示此HTTP请求提交的内容类型;一般在开发过程,会约定好使用什么字符编码格式来提交数据,然后会按照固定的字符编码来解析提交的数据;
我们也可以从浏览器上直接获取到接口的传递参数时的编码类型:
User-Agent:HTTP客户端运行的浏览器类型的详细信息。通过该头部信息web服务器可以判断到当前HTTP请求的客户端浏览器类别;
我们在爬虫的时候,有些网站限制了
User-agent(查看网站的robots.txt文档),所以需要在爬虫的时候伪装成浏览器去访问;
如果大家不知道写啥可以去打开浏览器随便找一个网站F12查看网络请求的User-agent值就可以了;
referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面;
某些网页可能设置限制了必须要从某个页面才能点击进入下一个页面,如果直接进入后一个链接,将会识别为机器所为,不是真实的人在操作;
headers的设置还有很多,每一种配置都有自己的含义;
设置headers中的User-Agent + Referer也是反爬虫的一种手段;
4.4 cookie
Cookie 的返回对象为 RequestsCookieJar,与字典类似;我们常遇到的跨域的问题与之相关;
cookies= requests.cookies.RequestsCookieJar()
cookies.set('tasty_cookie', 'yum', domain=’pythonzhishixuetang.com’, path='/cookies')
cookies.set('gross_cookie', 'blech', domain=’pythonzhishixuetang.com’, path='/elsewhere')
url = 'http://pythonzhishixuetang.org/getlist'
r = requests.get(url, cookies=cookies)
我们怎么看网站的cookies信息呢?
F12——>点击 Application——>选择左边的 Cookies,
就可以查看网站的所有cookies信息了
各种参数的含义:
4.5 timeout 响应超时
响应超时处理,理论上所有的请求都应该加上超时时间,防止程序可能永远失去相应;
4.6 SSL证书验证
Requests 可以为 HTTPS 请求验证 SSL 证书,SSL 验证默认是开启的,如果证书验证失败,Requests 会抛出 SSLError:
import requests
r = requests.get('https://12306.cn/')
print(r.text)
结果如下:
我们可以设置不校验SSL证书,添加参数verify=False,如下
import requests
r = requests.get('https://12306.cn/',verify=False)
r.encoding='utf-8'
print(r.text)
结果
对于私有证书,你也可以传递一个 CA_BUNDLE 文件的路径给 verify;如果 verify 设为文件夹路径,文件夹必须通过 OpenSSL 提供的 c_rehash 工具处理。
requests.get('https://github.com', verify='/path/to/certfile')
你也可以指定一个本地证书用作客户端证书,可以是单个文件(包含密钥和证书)或一个包含两个文件路径的元组:
requests.get('https://kennethreitz.org', cert=('/path/client.cert', '/path/client.key'))
#或
requests.get('https://kennethreitz.org', cert='/wrong_path/client.pem')
不过本地证书的私有 key 必须是解密状态。目前,Requests 不支持使用加密的 key。
4.7 auth 身份验证
许多要求身份认证的web服务都接受 HTTP Basic Auth。这是最简单的一种身份认证,并且 Requests 对这种认证方式的支持是直接开箱即可用;
requests.get('https://api.github.com/user', auth=('user', 'pass'))
如下:
import requests
r=requests.get('https://api.github.com/user')
print(r.text) #提示需要登录身份信息
r=requests.get('https://api.github.com/user',auth=('[email protected]', 'xxx'))#可以把这里的账号换成自己的github的账号与密码
print(r.text) #获取到个人账号信息
结果
[图片上传失败...(image-cb2feb-1618584887859)]
当然auth 也是可以存在会话session(在下面会介绍)中,不需要每次请求都去设置一次;
当然我们可以自定义认证方式,要想自己实现,就从 AuthBase 继承一个子类,并实现 call() 方法:
class MyAuth(requests.auth.AuthBase):
def __call__(self, r):
#Implement my authentication
return r
url = 'http://httpbin.org/get'
r= requests.get(url, auth=MyAuth())
print(r)
4.8 proxies 代理
需要使用代理,你可以通过为任意请求方法提供 proxies 参数来配置单个请求:
proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}
requests.get("http://example.org", proxies=proxies)
如果你的代理需要auth验证,
也可以使用 http://user:password@host/ 语法:
proxies = {
"http": "http://user:[email protected]:3128/",
}
五、 会话
什么是会话?
即session会话对象可以跨请求保持某些参数
import requests
r=requests.get("http://httpbin.org/cookies/set/sessioncookie/python") #设置一个name为sessioncookie 值为python的cookie值
r=requests.get('http://httpbin.org/cookies') #获取cookie值
print(r.text) #返回结果为空
s = requests.Session()
s.cookies.set("sessioncookie","python zhi shi xue tang") #在会话中设置一个name为sessioncookie 值为python zhi shi xue tang的cookie值
r = s.get("http://httpbin.org/cookies") #通过会话使用Get方式获取所有的cookie
print(r.text) #获取到cookie值
简单的说就是创建一个会话,并且在会话中保存cookie值,那所有通过该会话发出去的请求都含有会话中保存的cookie;
session 还可以设置headers、auth、proxies、cert以及verify等等,可以尝试一下;
这种方式大大的提高了性能与效率;
六、响应内容
6.1 text
返回的是Unicode型的数据
import requests
r = requests.get('https://api.github.com/events')
print(r.text)
当你访问 r.text 之时,Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。能够使用 r.encoding 属性来改变它:
r.encoding = 'utf-8'
6.2 content
返回的是bytes型也就是二进制的数据
import requests
r = requests.get('https://api.github.com/events')
print(r.content)
以字节的方式访问请求响应体;
6.3 json
返回的是一个Json格式的数据
import requests
r = requests.get('https://api.github.com/events')
for item in r.json():
print(item)
如果 JSON 解码失败,r.json() 就会抛出一个异常
如果是获取文本,可以通过r.text;如果是获取图片,文件,则可以通过r.content;如果是获取json对象,可以通过r.json();
七、总结
本篇文章讲述了Requests模块的一些内容,在之前爬虫的教程中,只是非常简单的使用了Requests模块,没有使用过多的功能。后面的教程中可能就会用到比较多的功能了,比如设置Requests的headers信息,使用auth、会话session、代理等等方式,希望大家能灵活运用。
对了,http://httpbin.org/ 网站是一个可以能测试 HTTP 请求和响应的各种信息的网站,蛮好用的,大家可以了解一下。
最后还是贴出Requests模块官网链接:
https://requests.readthedocs.io