原因是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等方法。
大概流程就是这样。 - from the5fire.com
----EOF-----
微信公众号:Python程序员杂谈
微信公众号:Python程序员杂谈