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的常见命令注入威胁
Feb 18 Python
python实现批量改文件名称的方法
May 25 Python
详解python单例模式与metaclass
Jan 15 Python
Python中的os.path路径模块中的操作方法总结
Jul 07 Python
用Python抢火车票的简单小程序实现解析
Aug 14 Python
Python爬虫:将headers请求头字符串转为字典的方法
Aug 21 Python
Django 导出项目依赖库到 requirements.txt过程解析
Aug 23 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
Jan 06 Python
python:解析requests返回的response(json格式)说明
Apr 30 Python
Python读取yaml文件的详细教程
Jul 21 Python
python 爬取B站原视频的实例代码
Sep 09 Python
利于python脚本编写可视化nmap和masscan的方法
Dec 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
索尼SONY SRF-S83/84电路分析和打磨
2021/03/02 无线电
Thinkphp模板中使用自定义函数的方法
2012/09/23 PHP
WordPress中is_singular()函数简介
2015/02/05 PHP
Linux系统递归生成目录中文件的md5的方法
2015/06/29 PHP
Symfony2在Nginx下的配置方法图文教程
2016/02/04 PHP
php注册和登录界面的实现案例(推荐)
2016/10/24 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
PHP实现与java 通信的插件使用教程
2019/08/11 PHP
PHP 裁剪图片
2021/03/09 PHP
JavaScript 设计模式 富有表现力的Javascript(一)
2010/05/26 Javascript
Javascript中定义方法的另类写法(批量定义js对象的方法)
2011/02/25 Javascript
jquery选择器的选择使用及性能介绍
2013/01/16 Javascript
javascript 3d 逐侦产品展示(核心精简)
2014/03/26 Javascript
jquery队列函数用法实例
2014/12/16 Javascript
JavaScript设计模式之外观模式介绍
2014/12/28 Javascript
js实现文字垂直滚动和鼠标悬停效果
2015/12/31 Javascript
jQuery调用WebMethod(PageMethod) NET2.0的方法
2016/04/15 Javascript
详解webpack异步加载业务模块
2017/06/23 Javascript
微信小程序组件之srcoll-view的详解
2017/10/19 Javascript
angularJs中跳转到指定的锚点实例($anchorScroll)
2018/08/31 Javascript
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
2019/09/17 Javascript
Vue替代marquee标签超出宽度文字横向滚动效果
2019/12/09 Javascript
Angular封装表单控件及思想总结
2019/12/11 Javascript
Python实现的ini文件操作类分享
2014/11/20 Python
Python高级特性切片(Slice)操作详解
2018/09/27 Python
python调用staf自动化框架的方法
2018/12/26 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
2020/01/04 Python
PyCharm第一次安装及使用教程
2020/01/08 Python
在tensorflow中设置保存checkpoint的最大数量实例
2020/01/21 Python
Python编程快速上手——strip()函数的正则表达式实现方法分析
2020/02/29 Python
CSS实现定位元素居中的方法
2015/06/23 HTML / CSS
CSS3实现可关闭的下拉手风琴菜单效果
2015/08/31 HTML / CSS
html5使用canvas绘制一张图片
2014/12/15 HTML / CSS
学生会竞选自荐信
2013/10/12 职场文书
2019暑假学生安全口号
2019/06/27 职场文书
CSS3常见动画的实现方式
2021/04/14 HTML / CSS