2013年(23)
分类: Python/Ruby
2013-03-07 11:13:50
用python越久,感觉python的封装的模块很多,也很实用。
最近尝试用python脚本去获取url页面信息,网上可以查到的基本都是用urllib / urllib2 模块,
只是简单对比了两种模块,感觉urllib2的功能更全面,实用性更强,决定用urllib2来实现,
urllib2是python的一个获取url的组件,以urlopen函数的形式提供了一套接口,具有利用不同协议获取url的能力
若简单的访问网页,例如:
import urllib2
response = urllib2.urlopen('')
html = response.read()
HTTP是基于请求和应答机制的,即客户端提出请求,服务端提供应答。urllib2用一个Request对象来映射所发出的HTTP请求
例如根据请求的url地址创建一个Request对象,通过调用urlopen并传入Request对象, 例如:
import urllib2
req = urllib2.Request('')
response = urllib2.urlopen(req)
html = response.read()
在HTTP请求时,允许做额外的两件事,首先是发送data表单数据,其次是能够传送额外的关于数据或发送本身的信息到服务器,此数据作为HTTP的‘headers’来发送
对于表单数据,在HTTP中,经常使用POST请求发送,通常HTML表单由浏览器来提交,一般在HTML表单中,data需要编码成标准形式,然后作为data参数传到Request对象。(Encoding是在urllib中完结的,而不是正在urllib2中)
例如:
import urllib2
url = ''
values = {'name' : 'Michael Foord', 'location' : 'Northampton', 'language' : 'Python'}
data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
html = response.read()
另外,有些站点不喜欢被程序访问,或者发送不同版本的内容到不同的浏览器,默认的urllib2把自己作为'Python-urllib/x.y’,这个身份可能会让站点迷惑,当创建一个请求对象时,可以嵌入一个包含头数据的字典headers, 例如将请求模拟成Internet Explorer:
import urllib
import urllib2
url = ''
user_agent = 'Mozilla/4.0 (compatibl; MSIE 5.5; Windows NT)'
values = {'name' : 'Michael Foord', 'location' : 'Northampton', 'language' : 'Python'}
headers = {'User-Agent' : user_agent}
data = urllib.urlencode(values)
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req)
html = response.read()
urlopen返回的应答对象response有几个很有用的方法info() ,geturl(),getcode()
geturl() 用于返回获取的真实url,因为urlopen或许存在重定向,获取的url或许跟请求url不同
info() 返回对象的字典对象,描述当前获取的页面信息,通常是服务器发送的特定头headers
getcode() 返回HTTP response中的状态码
当页面访问发生错误时,该如何进行异常处理,当urlopen不能处理一个response时,产生urlError。
通常URLError在没有网络连接或者服务器不存在的情况下产生,这种情况下,异常同样带有‘Reason’的属性。
import urllib2
req = urllib2.Request('')
try: urllib2.urlopen(req)
except URLError, e:
print e.reason
服务器上每一个HTTP应答对象response包含一个数字‘状态码’。有时状态码指出服务器无法完成请求,默认urllib2会处理这部分应答 (例如:response是一个重定向,需要客户端从别的地址获取文档),其他不能处理的,urlopen会产生一个 HTTPError(HTTPError是urlError的子类)。典型的错误包含‘404’(页面无法找到),‘403’(请求禁止),‘401’ (待验证请求)。所有HTTP错误码参见RFC 2616。
HTTPError实例产生后会有一个整型‘code’属性,记录服务器发送的相关错误号。当一个错误码产生 后,服务器返回一个HTTP错误号及一个错误页面,可以使用HTTPError实例作为页面返回的应答对象responsse。这表示和错误属性一样,其 同样包含了read,geturl,info方法。例如:
import urllib2
req = urllib2.Request('')
try: urllib2.urlopen(req)
except HTTPError, e:
print e.code
print e.read()
需注意的时,except URLError将同样接受到HTTPError异常