下面继续学习python的web模块 --- urllib2,一个源于urllib又高于urllib的模块。html
1 urllib2 简介python
urllib2是python自带的一个访问网页及本地文件的库。web
与urllib相比,显著区别之处在于:浏览器
1) urllib2能够接受一个Request类的实例来设置URL请求的headers,urllib仅能够接受URL。这意味着,用urllib时不能够假装User Agent字符串等。服务器
2) urllib提供urlencode方法用来encode发送的data,而urllib2没有。这是为什么urllib常和urllib2一块儿使用的缘由。网络
2 urllib2 经常使用方法app
2.1 urllib2.urlopenide
urlopen()是最简单的请求方式,它打开url并返回类文件对象,而且使用该对象能够读取返回的内容post
urllib2.urlopen(url[, data][, timeout]) 参数: url: 能够是包含url的字符串,也能够是urllib2.request类的实例。 data: 是通过编码的post数据(通常使用urllib.urlencode()来编码)。 没有data参数时为GET请求,设置data参数时为POST请求 timeout: 是可选的超时期(以秒为单位),设置请求阻塞的超时时间,若是没有设置的话,会使用全局默认timeout参数,该参数只对HTTP、HTTPS、FTP生效
假设urlopen()返回的文件对象u,它支持下面的这些经常使用的方法:学习
u.read([nbytes]) 以字节字符串形式读取nbytes个数据
u.readline() 以字节字符串形式读取单行文本
u.readlines() 读取全部输入行而后返回一个列表
u.close() 关闭连接
u.getcode() 返回整数形式的HTTP响应代码,好比成功返回200,未找到文件时返回404
u.geturl() 返回所返回的数据的实际url,可是会考虑发生的重定向问题
u.info() 返回映射对象,该对象带有与url关联的信息,对HTTP来讲,返回的服务器响应包含HTTP包头。对于FTP来讲,返回的报头包含'content-length'。对于本地文件,返回的报头包含‘content-length’和'content-type'字段。
注意:
类文件对象u以二进制模式操做。若是须要以文本形式处理响应数据,则须要使用codecs模块或相似方式解码数据。
附代码:
>>> import urllib2 >>> res=urllib2.urlopen('http://www.51cto.com') >>>res.read() 。。。。。。(一堆源代码) >>>res.readline() '<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r\n' >>>res.readlines() 。。。(list形式的一堆源码) >>>res.info() <httplib.HTTPMessage instance at0x1a02638> >>>res.getcode() 200 >>>res.geturl() 'http://www.51cto.com' #最后关闭链接 >>> res.close()
2.2 urllib2.request
新建Request实例
Request (url [data,headers[,origin_req_host ,[unverifiable]]]]) 说明: 对于比较简单的请求,urlopen()的参数url就是一个表明url的,但若是须要执行更复杂的操做,如修改HTTP报头,能够建立Request实例并将其做为url参数 参数: url: 为url字符串, data: 是伴随url提交的数据(好比要post的数据)。不过要注意,提供data参数时,它会将HTTP请求从'GET'改成‘POST’。 headers: 是一个字典,包含了可表示HTTP报头的键值映射(即要提交的header中包含的内容)。 origin_req_host: 一般是发出请求的主机的名称,若是请求的是没法验证的url(一般是指不是用户直接输入的url,好比加载图像的页面中镶入的url),则后一个参数unverifiable设为TRUE
假设Request实例r,其比较重要的方法有下面几个:
r.add_data(data) 向请求添加数据。若是请求是HTTP请求,则方法改成‘POST’。data是向指定url提交的数据,要注意该方法不会将data追教导以前已经设置的任何数据上,而是使用如今的data替换以前的。
r.add_header(key, val) 向请求添加header信息,key是报头名,val是报头值,两个参数都是字符串。
r.addunredirectedheader(key,val) 做用基本同上,但不会添加到重定向请求中。
r.set_proxy(host, type) 准备请求到服务器。使用host替换原来的主机,使用type替换原来的请求类型。
附代码:
1 向网页提交数据:
>>> import urllib >>> import urllib2 >>> url='http://www.51cto.com' >>> info={'name':"51cto",'location':'51cto'} #info须要被编码为urllib2能理解的格式,这里用到的是urllib >>> data=urllib.urlencode(info) >>> data 'name=51cto&location=51cto' >>> request=urllib2.Request(url,data) >>> response=urllib2.urlopen(request) >>> the_page=response.read()
2 修改网页头信息:
有时会碰到,程序也对,可是服务器拒绝你的访问。这是为何呢?问题出在请求中的头信息(header)。 有的服务端有洁癖,不喜欢程序来触摸它。这个时候你须要将你的程序假装成浏览器来发出请求。请求的方式就包含在header中。
在使用 REST 接口时,Server 会检查Content-Type字段,用来肯定 HTTP Body 中的内容该怎样解析。
>>> import urllib >>> import urllib2 >>> url='http://www.51cto.com' # 将user_agent写入头信息 >>> user_agent='Mozilla/4.0 (compatible; MSIE 5.5; WindowsNT)' >>>values={'name':'51cto','location':"51cto",'language':'Python'} >>> headers={'User-Agent':user_agent} >>> data=urllib.urlencode(values) >>> req=urllib2.Request(url,data,headers) >>> response=urllib2.urlopen(req) >>> the_page=response.read()
2.3 异常处理
不能处理一个respons时,urlopen抛出一个urlerror
urllib2.URLError: urllib2.HTTPError:
HTTPerror是HTTP URL在特别的状况下被抛出的URLError的一个子类。
urlerror:
一般,urlerror被抛出是由于没有网络 链接(没有至特定服务器的链接)或者特定的服务器不存在。在这种状况下,含有reason属性的异常将被抛出,以一种包含错误代码 和文本错误信息的tuple形式。
#!/usr/bin/env python # -*- coding: utf-8 -*- import urllib2 #多写了一个 m (comm) req = urllib2.Request('http://www.51cto.comm') try: urllib2.urlopen(req) except urllib2.URLError,e: print e print e.reason
结果:
<urlopen error [Errno 11004] getaddrinfo failed> [Errno 11004] getaddrinfo failed
以上是 urllib2的简单用法,若是要深刻:
http://www.cnblogs.com/yuxc/archive/2011/08/01/2123995.html
urllib和urllib2之间的区别: