HTTP基于请求和回应(requests &responses )-客户端制造请求服务器返回回应。urlib2用代表了你正在请求的HTTP request的Request对象反映了这些。调用urlopen函数对请求的url返回一个respons对象。这个respons是一个像file的对象,这意味着你能用.read()函数操作这个respon对象:
req = urllib2.Request(’http://www.voidspace.org.uk’)
response = urllib2.urlopen(req)
the_page = response.read()
url = ‘http://www.someserver.com/cgi-bin/register.cgi’
user_agent = ‘Mozilla/4.0 (compatible; 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)
the_page = response.read()
当一个错误( HTTPError)被抛出的时候,服务器返回一个HTTP错误代码和一个错误页。你可以使用返回的HTTP错误示例。这意味着它不但具有code属性,而且同时具有read,geturl,和info,methods属性。>>> req = urllib2.Request(’http://www.python.org/fish.html’)>>> try:>>> urllib2.urlopen(req)>>> except URLError, e:>>> print e.code>>> print e.read()>>>404…… etc
from urllib2 import Request, urlopen, URLError
req = Request(someurl)
try:
response = urlopen(req)
except URLError, e: 同时也会涵括HTTPError
if hasattr(e, ‘reason’):
print ‘We failed to reach a server.’
print ‘Reason: ‘, e.reason
elif hasattr(e, ‘code’):
print ‘The server couldn\’t fulfill the request.’
print ‘Error code: ‘, e.code
else:
# everything is fine
urlopen返回的response(或者HTTP错误实例)有两个有用的方法:info和geturl。
geturl–它返回被获取网页的真正的url。
info–它返回一个像字典的对象来描述获取的网页,尤其是服务器发送的头。它现在一般是httplib.HTTPMessage的一个实例。
Openers 和Handlers
当你获取一个URL时,你使用一个opener(一个可能以一个比较迷糊名字命名的实例–urllib2.OpenerDirector)。正常情况下
我们一直使用默认的opener,通过urlopen,但你也可以创建自定义的openers。opener使用操作器(handlers)。所有的重活都交给这些handlers来做。每一个handler知道
怎么打开url以一种独特的url协议(http,ftp等等),或者怎么处理打开url的某些方面,如,HTTP重定向,或者HTTP cookie。
你将会创建openers如果你想要用安装特别的handlers获取url,例如,获取一个处理cookie的opener,或者一个不处理重定向的opener。
枚举一个OpenerDirector,然后多次调用.add_handler(some_handler_instance)来创建一个opener。
或者,你可以用build_opener,这是一个很方便的创建opener对象的函数,它只有一个函数调用。build_opener默认会加入许多
handlers,但是提供了一个快速的方法添加更多东西和/或使默认的handler失效。
其他你想要的handlers能够处理代理,authentication和其他平常但是又有些特殊的情况。
install_opener能被用于创建一个opener对象,(全局)默认的opener。这意味着调用urlopen将会用到你刚安装的opener。
opener对象有一个open方法,它可以被直接调用来获取url以一种和urlopen函数同样的方式:没有必要调用install_opener,除非是为了方便。
默认opener有对普通情况的操作器 (handlers)- ProxyHandler, UnknownHandler, HTTPHandler, HTTPDefaultErrorHandler, HTTPRedirectHandler, FTPHandler, FileHandler, HTTPErrorProcessor.
import ClientCookie
cookies = ClientCookie.CookieJar()
opener = ClientCookie.build_opener(ClientCookie.HTTPCookieProcessor(cookies))
opener.addheaders = [("User-agent", "Mozilla/5.0 (compatible; MyProgram/0.1)"),
("From", "responsible.person@example.com")]
ClientCookie.install_opener(opener)
r = ClientCookie.urlopen(”http://acme.com/”)
import ClientCookie
cj = ClientCookie.LWPCookieJar()
opener = ClientCookie.build_opener(ClientCookie.HTTPCookieProcessor(cj))
ClientCookie.install_opener(opener)
r = ClientCookie.urlopen(”http://foobar.com/”)
cj.save(”/some/file”, ignore_discard=True, ignore_expires=True)
import os, ClientCookie
cookies = ClientCookie.MozillaCookieJar()
cookies.load(os.path.join(os.environ["HOME"], “/.netscape/cookies.txt”))
# see also the save and revert methods
import ClientCookie
cj = ClientCookie.MSIECookieJar(delayload=True)
cj.load_from_registry() # finds cookie index file from registry
RSS feed for comments on this post · TrackBack URI
Leave a reply