requests有关cookie的使用
2016-01-22 18:47
260 查看
requests有关cookie的使用
最近用requests把百度贴吧的脚本重写了一遍,把用urllib模拟登陆的部分全部重写了一遍,算是渗入接触了一下requests,感觉确实方便了很多。基本使用
get_req = requests.get(url, [cookies, headers]) post_req = requests.post(url, data, [cookies, headers]) req.text #unicode格式的内容,有些gzip格式的返回数据用这个可以直接显示,很方便 req.content #我猜是原始内容? req.cookies #获取的cookies,可以用keys()和values()看内容,但本身不是字典格式,以下可以打印出字典方式查看 print {c.name: c.value for c in req.cookies}
高级用法
这里主要用了session类,因为我需要把从登陆开始的cookies数据保存着一直都要用,只用单个的req然后cookies存来存去肯定不方便,用Session类就方便很多了。bd_session = requests.Session() bd_session.get(...) bd_session.post(...)
我的代码中会把登陆之后得到的cookies保存在本地,下次先尝试用cookies登陆,失败再重新登陆,所以有一个cookies保存到本地的问题。
requests库中的cookies类型,在文档中看到是RequestsCookieJar这么一个类,详细说明如下:
class requests.cookies.RequestsCookieJar(policy=None) Compatibility class; is a cookielib.CookieJar, but exposes a dict interface. This is the CookieJar we create by default for requests and sessions that don’t specify one, since some clients may expect response.cookies and session.cookies to support dict operations. Requests does not use the dict interface internally; it’s just for compatibility with external client code. All requests code should work out of the box with externally provided instances of CookieJar, e.g. LWPCookieJar and FileCookieJar. Unlike a regular CookieJar, this class is pickleable.
对于cookies格式的转化,提供了三个工具方法:
requests.utils.dict_from_cookiejar(cj)
Returns a key/value dictionary from a CookieJar. Parameters: cj – CookieJar object to extract cookies from.
requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)
Returns a CookieJar from a key/value dictionary. Parameters: cookie_dict – Dict of key/values to insert into CookieJar. cookiejar – (optional) A cookiejar to add the cookies to. overwrite – (optional) If False, will not replace cookies already in the jar with new ones.
requests.utils.add_dict_to_cookiejar(cj, cookie_dict)
Returns a CookieJar from a key/value dictionary. Parameters: cj – CookieJar to insert cookies into. cookie_dict – Dict of key/values to insert into CookieJar.
但都是cookiejar和字典格式之间的转换,并没有几种cookies格式相互的转换,所以我是以字典为中间格式进行转换的。
读取cookies
在这里我用的是LWPCookieJar保存在txt文件中#实例化一个LWPCookieJar对象 load_cookiejar = cookielib.LWPCookieJar() #从文件中加载cookies(LWP格式) load_cookiejar.load('cookies/' + self.username + '.txt', ignore_discard=True, ignore_expires=True) #工具方法转换成字典 load_cookies = requests.utils.dict_from_cookiejar(load_cookiejar) #工具方法将字典转换成RequestsCookieJar,赋值给session的cookies. self.session.cookies = requests.utils.cookiejar_from_dict(load_cookies)
存储cookies
将cookies转换成LWP格式然后保存为文本格式#实例化一个LWPcookiejar对象 new_cookie_jar = cookielib.LWPCookieJar(self.username + '.txt') #将转换成字典格式的RequestsCookieJar(这里我用字典推导手动转的)保存到LWPcookiejar中 requests.utils.cookiejar_from_dict({c.name: c.value for c in self.session.cookies}, new_cookie_jar) #保存到本地文件 new_cookie_jar.save('cookies/' + self.username + '.txt', ignore_discard=True, ignore_expires=True)
相关文章推荐
- UITabBarController来管理多个UIViewController以及导航栏的加入
- UITextField的总结
- UIView的layoutSubviews和drawRect方法何时调用
- iOS开发之自定义输入框(利用UITextField及UITextView)
- android notification及TaskStackBuilder
- ios--图片处理(修改、保存)UIGraphicsBeginImageContext
- UIView的layoutSubviews和drawRect
- Ext4.2 select 和 query 区别与联系
- UITableView-FDTemplateLayoutCell 使用
- LFS进阶版(QT)——GUI界面的实现
- iOS个人整理13-导航控制器-UINavigationController
- CharSequence类型数据跨进程传递
- iOS CUICatalog: Invalid asset name supplied:
- IOS UITextView和UITextFiled的区别
- IOS点击UITextField不弹出键盘但是可以输入粘贴。。。
- 优先队列——二项队列(binominal queue)
- Android中Builder设计模式
- TBluetoothLE.OnDisconnectDevice
- 优先队列——二项队列(binominal queue)
- continue