requests模块高级使用
一、Cookie
cookie作用:服务器使用cookie来记录客户端的状态信息
实现流程:
- 执行登陆操作(获取cookie)
- 在发起个人主页请求时,需要将cookie携带到该请求中
注意:session对象,也可以发送请求,如果服务器端会给客户端返回cookie,session对象自动将cookie进行存储
import requests #创建session对象 session = requests.session() #创建headlers headers={ "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36" } #指定login对应url login_url = "https://accounts.douban.com/j/mobile/login/basic" #封装登陆相关数据 data = { "ck": "", "name": "17502368221", "password": "cv@125436", "remember": "true", "ticket": "" } #使用session发起登陆请求,将cookie获取且存储到session当中 login_response=session.post(url=login_url,data=data,headers=headers) #使用session对个人主页发起请求,获取响应页面数据 home_url="https://www.douban.com/people/191728538/" response=session.get(url=home_url,headers=headers) page_text=response.text with open("./doubanHomePage.html",'w',encoding="utf-8") as fp: fp.write(page_text)
二、代理
代理:第三方代替本体执行相关事务
什么要使用代理:
- 反爬操作。
- 反反爬手段
分类:
- 正向代理:代理客户端获取数据(爬虫使用正向代理)
- 反向代理:代替服务端提供数据
免费代理IP提供商:
- www.goubanjia.com
- 快代理
- 西祠代理
注意:我们请求网站的使用的协议和代理使用的协议要保证一致,http或者https
import requests url = 'http://www.baidu.com/s?wd=ip&ie=utf-8' #将代理IP封装到一个字典中 proxy={ "http":"195.208.172.70:8080" } #构建headers headers={ "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36" } #在请求之前更换网络IP response=requests.get(url=url,headers=headers,proxies=proxy) #数据持久化 page_text=response.text with open("./代理.html",'w',encoding='utf-8') as fp: fp.write(page_text)
三、加载证书密钥
requests模块在发起https请求时需要加载SSL证书,否则会报requests.exceptions.SSLError: HTTPSConnectionPool(host='www.baidu.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)'),))错误,
证书准备
由于我需要Fiddler来代理requests请求,所以requests模块需要加载Fiddler的根证书,但Fiddler导出的证书是CER格式。
但是requests支持的是pem格式,所以需要借助openssl工具来进行格式转换。
openssl在win下编译安装比较麻烦,点这里直接下载别人编译好的安装包,安装完成后用如下命令进行转换
openssl x509 -inform der -text -in FiddlerRoot.cer -out C:\Users\ya\Desktop\out.pem
requests使用证书
在请求参数中直接添加verify参数即可
response = requests.get(url='https://www.baidu.com', headers=headers,proxies=proxies,verify=r'C:\Users\ya\Desktop\out.pem')
在session中使用如下方式(未验证)
s = requests.Session() s.verify = '/path/to/certfile'