urllib2
与urllib的区别:![](https://images2015.cnblogs.com/blog/801928/201608/801928-20160808162302762-627996889.jpg)
![](https://images2015.cnblogs.com/blog/801928/201608/801928-20160808162303262-1957595018.jpg)
![](https://images2015.cnblogs.com/blog/801928/201608/801928-20160808162304074-744148834.jpg)
![](https://images2015.cnblogs.com/blog/801928/201608/801928-20160808162304309-287436157.jpg)
![](https://images2015.cnblogs.com/blog/801928/201608/801928-20160808162304762-127321420.jpg)
![](https://images2015.cnblogs.com/blog/801928/201608/801928-20160808162305152-1212180774.jpg)
![](https://images2015.cnblogs.com/blog/801928/201608/801928-20160808162305574-2006416698.jpg)
![](https://images2015.cnblogs.com/blog/801928/201608/801928-20160808162306090-377176432.jpg)
![](https://images2015.cnblogs.com/blog/801928/201608/801928-20160808162306668-1038596270.jpg)
![](https://images2015.cnblogs.com/blog/801928/201608/801928-20160808162307106-62368396.jpg)
![](https://images2015.cnblogs.com/blog/801928/201608/801928-20160808162307481-122599037.jpg)
![](https://images2015.cnblogs.com/blog/801928/201608/801928-20160808162307809-1799706562.jpg)
![](https://images2015.cnblogs.com/blog/801928/201608/801928-20160808162302762-627996889.jpg)
urllib2提供了Request,可以更好的表达请求,可以定制url的头,提供更强大的功能,可以处理cookie, 鉴权,可定制化,头信息的格式为字典
urllib2不能完全替代urllib:urllib.urlencode()这个方法在urllib2没有所以一般urllib和urllib2混用
urllib2.urlopen() 超时时间,时间内链接不到远程服务器就会直接报错
还可以捕获HTTPError错误
![](https://images2015.cnblogs.com/blog/801928/201608/801928-20160808162303262-1957595018.jpg)
![](https://images2015.cnblogs.com/blog/801928/201608/801928-20160808162304074-744148834.jpg)
urllib2.Request()
![](https://images2015.cnblogs.com/blog/801928/201608/801928-20160808162304309-287436157.jpg)
urlopen不仅可以接受一个url作为参数,还可以接受一个Request对象作为参数
![](https://images2015.cnblogs.com/blog/801928/201608/801928-20160808162304762-127321420.jpg)
还提供了比较重要的接口
build_opener 可以让我们定制Http行为,它有一个open方法和urlopen同样效果
![](https://images2015.cnblogs.com/blog/801928/201608/801928-20160808162305152-1212180774.jpg)
参数Handler列表:
当Http请求应答回来的时候会像管道一样依次执行HTTPHandler,HTTPSHander,HTTPCookieProcessor
返回openerDirector里面有open()方法处理原来链接里面的数据
BaseHandler为
![](https://images2015.cnblogs.com/blog/801928/201608/801928-20160808162305574-2006416698.jpg)
使用什么代理
不知道什么协议
处理HTTP请求
处理错误请求
处理跳转
支持FTP协议
支持本地文件打开
处理HTTP错误
处理ssl
当调用urllib2.urlopen()的时候会调用系统默认创建的Handler链
urllib2.HTTPHandler(debuglevel=1)
会把HTTP请求跟服务器交互信息都打印出来
![](https://images2015.cnblogs.com/blog/801928/201608/801928-20160808162306090-377176432.jpg)
等于说是在Request把头信息包括data信息都设置好,然后在build_opener下面的open打开,而build_opener可以定制HTTPHandler等信息,如这个例子显示跟服务器交互的信息,
opener保存为全局使用
![](https://images2015.cnblogs.com/blog/801928/201608/801928-20160808162306668-1038596270.jpg)
![](https://images2015.cnblogs.com/blog/801928/201608/801928-20160808162307106-62368396.jpg)
所以我认为bulid_opener就是对urlopen的封装,可以使用它的install_opener对全局的opener进行同样处理
cookies处理
cookie是网页交互过程中很重要的隐式数据,有服务器生成保存在客户端,客户端请求时把cookie返回给服务器,服务器再进行解析。
比如说登录的之后,服务器生成cookie,客户端通过cookie告诉服务端已经登录上去了
![](https://images2015.cnblogs.com/blog/801928/201608/801928-20160808162307481-122599037.jpg)
HTTPCookieProcessor是Basehandler的子类
cookie的加法跟request 的加法不同,只需要加载头信息就可以了
![](https://images2015.cnblogs.com/blog/801928/201608/801928-20160808162307809-1799706562.jpg)
cookie在handler当中加载
这里的open是带有cookie的信息的,第一次是open是返回到客户端,随后在用open的时候
会将cookie自动上传到服务器,所以只需要在开始open一次,想登录验证一次就可以一直出于登录的状态了,cookie就相当于是登录凭证