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 相关文章推荐
Python访问MySQL封装的常用类实例
Nov 11 Python
Python里disconnect UDP套接字的方法
Apr 23 Python
Python输出9*9乘法表的方法
May 25 Python
Python工程师面试必备25条知识点
Jan 17 Python
对python数据切割归并算法的实例讲解
Dec 12 Python
python实现Flappy Bird源码
Dec 24 Python
python 画三维图像 曲面图和散点图的示例
Dec 29 Python
python多进程并行代码实例
Sep 30 Python
Python Pandas 对列/行进行选择,增加,删除操作
May 17 Python
python 在sql语句中使用%s,%d,%f说明
Jun 06 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
Oct 15 Python
Python机器学习工具scikit-learn的使用笔记
Jan 28 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
抓取YAHOO股票报价的类
2009/05/15 PHP
php目录拷贝实现方法
2015/07/10 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
laravel 操作数据库常用函数的返回值方法
2019/10/11 PHP
PHP与SQL语句写一句话木马总结
2019/10/11 PHP
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
2006/12/22 Javascript
javascript 动态添加事件代码
2008/11/30 Javascript
JavaScript对IE操作的经典代码(推荐)
2014/03/10 Javascript
moment.js轻松实现获取当前日期是当年的第几周
2015/02/05 Javascript
JavaScript中的getMilliseconds()方法使用详解
2015/06/10 Javascript
基于replaceChild制作简单的吞噬特效
2015/09/21 Javascript
开启Javascript中apply、call、bind的用法之旅模式
2015/10/28 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
2016/06/17 Javascript
javascript和jQuery实现网页实时聊天的ajax长轮询
2016/07/20 Javascript
js 转义字符及URI编码详解
2017/02/28 Javascript
详解JS中遍历语法的比较
2017/04/07 Javascript
ionic实现下拉刷新载入数据功能
2017/05/11 Javascript
微信小程序 跳转传递数据的实例
2017/07/06 Javascript
详解Vue 事件修饰符capture 的使用
2017/12/29 Javascript
JS面向对象编程基础篇(一) 对象和构造函数实例详解
2020/03/03 Javascript
[09:13]2014DOTA2国际邀请赛 中国区预选赛coser表演
2014/05/23 DOTA
Python socket.error: [Errno 98] Address already in use的原因和解决方法
2014/08/25 Python
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
2017/03/20 Python
python画出三角形外接圆和内切圆的方法
2018/01/25 Python
Python实现的读取电脑硬件信息功能示例
2018/05/30 Python
Django框架中序列化和反序列化的例子
2019/08/06 Python
pycharm创建scrapy项目教程及遇到的坑解析
2019/08/15 Python
python模拟点击网页按钮实现方法
2020/02/25 Python
python批量修改文件名的示例
2020/09/27 Python
八皇后问题,输出了所有情况,不过有些结果只是旋转了90度
2016/08/15 面试题
别名指示符是什么
2012/10/08 面试题
小学教师的个人自我鉴定
2013/10/24 职场文书
出纳岗位职责范本
2013/12/01 职场文书
我的老师教学反思
2014/05/01 职场文书
2014院党委领导班子及其成员群众路线对照检查材料思想汇报
2014/10/04 职场文书
利用Python第三方库实现预测NBA比赛结果
2021/06/21 Python