the5fire的技术博客

关注python、vim、linux、web开发和互联网--life is short, we need python.


urllib2源码解读一(开篇)[更新2012-11-28]

作者:the5fire | 标签:   | 发布:2012-11-19 9:54 p.m. | 阅读量: 4145, 4110
开始有读urllib2源码的这个想法是在某个午饭后的时光,刷了会微博发现:与其无聊的刷微博,不如找点源码读,想了想,就找到urllib2。



原因是urllib2这个模块是从一开始写python到很久以后都会用到的东西,我想大多数人都会有这样的感觉,因为它很好用,而且python也会经常用来写爬虫。使用频率这么高的东西,自然要把它彻底掌握才好。



这段时间有空就会看看urllib2的源码,里面可以学习的东西还真不少,也有些值的借鉴的思想,比如关于一系列handler处理的操作。另外里面还用了个设计模式,应该是command模式。这些东西以后慢慢分析。



首先说下这里面个需要关注的几个对象:

1、build_opener:

用来构建处理器(handlers),建造一些默认的或者通过参数传递进来的handler到openerdirector中待用。

2、 openerdirector:

在其中,建立process_request和process_response两个字典,根据添加时handler中的方法来将handler分别放入两个字典中,其中的key是handler的协议(如HTTPHandler,就是http),调用openerdirctor的open方法时会首先调用process_request字典中对应协议的handler进行处理,然后处理之后的结果在通过processs_response字典中的handler进行处理,最终返回数据。

3、request对象:

​在调用openerdirector中的open方法时会先根据传入的url构建request对象。这个对象的内容主要是这个url的协议(http或者https),还有会对url进行分解,参数处理,域名处理等等一系列的动作。



上面三个是在后面的分析中都会用到的,这里就先大概有个印象,下篇开始到代码内部穿梭。


[补充]
觉得篇文章没有起到给大家一个整体概念的作用,这里再补充下。

大体的一个流程就是,在使用urllib2.urlopen(url)的时候,首先就是由build_opener来构建一个OpenerDirector实例,构建的过程其实就是将一些列handler处理器放入到OpenerDirector的属性中,然后调用OpenerDirector的open方法,这个方法首先会根据你的url以及data参数生成一个Request对象,Request根据是否有data这个数据来确定是发送get请求还是post请求。

有了Request之后,就会经过之前被添加到OpenerDirector的属性中的那些handler来处理,最后处理成一个response对象。这个response类似于文件对象,有read、readline、readlines等方法。

大概流程就是这样。
----EOF-----

扫码关注,或者搜索微信公众号:码农悟凡


其他分类: