Python HTTP客户端自定义Cookie实现实例


Posted in Python onApril 28, 2017

Python HTTP客户端自定义Cookie实现实例

几乎所有脚本语言都提供了方便的 HTTP 客户端处理的功能,Python 也不例外,使用 urllib 和 urllib2 可以很方便地进行 HTTP GET 和 POST 等各种操作。并且还允许以类似于插件的形式加入一些 handler ,来定制 request 和 response ,比如代理的支持和 cookie 的支持都是这样添加进来的。具体来说,通过如下方式构造一个 opener :

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())

然后这个 opener 就可以处理 cookie 了,相当方便,并且可定制性也……好吧,总之,现在我希望能在客户端手动插入一些 cookie 值,但是不管是 HTTPCookieProcessor 还是 cookielib 里的 CookieJar 都没有提供类似的方法可以来实现。

看起来,也并不是我一个人有这样的需求,因为我在查找解决方案的时候,还找到了有人给 Python 提交的这个 Patch,就是添加这个功能。不过看起来好像还没有被 accept 的样子,这样对标准库做暴力 patch 的方式可移植性似乎也不好。所以我还是另外找了解决方案,其实也很简单:看了 HTTPCookieProcessor 的实现代码之后,发现我可以做类似的事情,也就是在写一个 handler ,把我想要的 cookie 值强制放到 request 对象的 header 中去。

于是我查了 Python 的文档,对于 handler 的接口好像几乎没有描述,于是我就照着 HTTPCookieProcessor 来写了。这个 handler 应该放在正常的 cookie 处理 handler 的后面,然后检查已经存在的 cookie header ,再进行合并一下。不过比较诡异的是在 Python 的文档里并没有找到 Request 对象有 get_header 之类的方法可以得到已经存在的 header 项的值,觉得很诡异,于是直接查了源代码,才找到了,确实有这个方法。之前有听人说过 Ruby 的文档做得如何如何的烂,Python 的文档做得如何如何的好,我虽然没觉得 Ruby 的文档很烂,但是也觉得 Python 的文档确实不错,我最喜欢它末尾的 Examples 。两个文档系统倒是走的不同的路,Ruby 的文档是从代码中抽取(特定格式的)注释来自动生成的,类似于 javadoc ;而 Python 现在用的是独立于源代码的文档系统,人工写的,不过到头来居然连函数都漏掉了,可见人工维护文档的弊端还是很明显的。其实我见过的文档系统,最好用的应该还是属于 Emacs/Elisp 了吧。 不过,废话少讲,handler 如下:

class SimpleCookieHandler(urllib2.BaseHandler):
 def http_request(self, req):
  simple_cookie = 'cc98Simple=1'
  if not req.has_header('Cookie'):
   req.add_unredirected_header('Cookie', simple_cookie)
  else:
   cookie = req.get_header('Cookie')
   req.add_unredirected_header('Cookie', simple_cookie + '; ' + cookie)
  return req

然后,构造 opener 的时候加上这个 handler 就可以了:

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(), 
SimpleCookieHandler())

但总归是一个 workaround ,期待那个 patch 被加入到标准库中吧。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
简单了解什么是神经网络
Dec 23 Python
解决pandas无法在pycharm中使用plot()方法显示图像的问题
May 24 Python
Pandas 数据处理,数据清洗详解
Jul 10 Python
Python+OpenCV目标跟踪实现基本的运动检测
Jul 10 Python
python读写csv文件实例代码
Jul 05 Python
使用Python实现文字转语音并生成wav文件的例子
Aug 08 Python
在Python中使用filter去除列表中值为假及空字符串的例子
Nov 18 Python
利用keras加载训练好的.H5文件,并实现预测图片
Jan 24 Python
Python实现EM算法实例代码
Oct 04 Python
Jupyter安装链接aconda实现过程图解
Nov 02 Python
matplotlib交互式数据光标mpldatacursor的实现
Feb 03 Python
教你漂亮打印Pandas DataFrames和Series
May 29 Python
Python 通过pip安装Django详细介绍
Apr 28 #Python
python 使用get_argument获取url query参数
Apr 28 #Python
Python、PyCharm安装及使用方法(Mac版)详解
Apr 28 #Python
详谈Python2.6和Python3.0中对除法操作的异同
Apr 28 #Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
Apr 28 #Python
用pickle存储Python的原生对象方法
Apr 28 #Python
Python标准库之collections包的使用教程
Apr 27 #Python
You might like
php函数之子字符串替换 str_replace
2011/03/23 PHP
JS获取scrollHeight问题想到的标准问题
2007/05/27 Javascript
jQuery的三种$()
2009/12/30 Javascript
JavaScript 学习笔记(十二) dom
2010/01/21 Javascript
Extjs 几个方法的讨论
2010/01/28 Javascript
JavaScript 弹出窗体点击按钮返回选择数据的实现
2010/04/01 Javascript
js的表单操作 简单计算器
2011/12/29 Javascript
一个页面放2段图片滚动代码出现冲突的问题如何解决
2012/12/21 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
2013/08/12 Javascript
jquery中常用的SET和GET$(”#msg”).html循环介绍
2013/10/09 Javascript
javascript实现图片跟随鼠标移动效果的方法
2015/05/13 Javascript
jquery实现加载进度条提示效果
2015/11/23 Javascript
js如何改变文章的字体大小
2016/01/08 Javascript
jQuery 调用WebService 实例讲解
2016/06/28 Javascript
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
2016/07/18 Javascript
浅谈JS之iframe中的窗口
2016/09/13 Javascript
Node.js利用Net模块实现多人命令行聊天室的方法
2016/12/23 Javascript
Ext JS 实现建议词模糊动态搜索功能
2017/05/13 Javascript
详解AngularJS用Interceptors来统一处理HTTP请求和响应
2017/06/08 Javascript
五分钟搞懂Vuex实用知识(小结)
2019/08/12 Javascript
Node配合WebSocket做多文件下载以及进度回传
2019/11/07 Javascript
JavaScript eval()函数定义及使用方法详解
2020/07/07 Javascript
[00:32]2018DOTA2亚洲邀请赛Newbee出场
2018/04/03 DOTA
[43:24]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.12
2020/12/17 DOTA
浅谈Python 集合(set)类型的操作——并交差
2016/06/30 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
2018/04/19 Python
python获取代理IP的实例分享
2018/05/07 Python
python读取和保存图片5种方法对比
2018/09/12 Python
python numpy 按行归一化的实例
2019/01/21 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
2020/03/06 Python
鲜果饮品店创业计划书
2014/01/21 职场文书
高考励志标语
2014/06/05 职场文书
群众路线教育实践活动学习笔记
2014/11/05 职场文书
解除劳动合同通知书范本
2015/04/16 职场文书
初任公务员培训心得体会
2016/01/08 职场文书
Java 超详细讲解hashCode方法
2022/04/07 Java/Android