Chinaunix首页 | 论坛 | 博客
  • 博客访问: 46824
  • 博文数量: 23
  • 博客积分: 425
  • 博客等级: 下士
  • 技术积分: 237
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-10 09:57
文章分类

全部博文(23)

文章存档

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异常

阅读(853) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~