python [3.2] urllib的使用

urllib是python的一个获取url(Uniform Resource Locators,统一资源定址器)的模块。它用urlopen函数的形式提供了一个非常简洁的接口。这使得用各种各样的协议获取url成为可能。它同时 也提供了一个稍微复杂的接口来处理常见的状况-如基本的认证,cookies,代理,等等。这些都是由叫做opener和handler的对象来处理的。

一:基本使用方法+异常处理

from urllib.error import URLError,HTTPError
import urllib.request
import urllib.parse
url='http://www.baidu.com/s'
values={'wd':'python',
        'opt-webpage':'on',
        'ie':'gbk'}
url_values=urllib.parse.urlencode(values)
#print(url_values)

url_values=url_values.encode(encoding='UTF8')
full_url=urllib.request.Request(url,url_values)
#or ony one sentense:full_url=url+'?'+url_values

try:
    response=urllib.request.urlopen(full_url)   #open=urlopen
except HTTPError as e:
    print('Error code:',e.code) 
except URLError as e:
    print('Reason',e.reason)
the_page=response.read()
print(the_page)


调用urlopen函数对请求的url返回一个response对象。这个response是一个file-like的对象,这意味着你能用.read()函数操作这个response对象

注意:urllib.request.Request(url,data) data参数是要进行任意编码(utf8...)的,否则会报POST data should be bytes or an iterable of bytes. It cannot be str.错误.

           或者用url+'?'+url_values来合成full_url ,只用一条语句,代码更简洁


二:add headers to HTTP request

user_agent='Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
....
headers={'User-Agent':user_agent}
....
full_url=urllib.request.Request(url,url_values,headers)


三:Openers 和Handlers


当你获取一个URL时,你使用一个opener(一个可能以一个比较迷糊名字命名的实例–urllib2.OpenerDirector)。正常情况下
我们一直使用默认的opener,但你也可以创建自定义的openers。opener使用操作器(handlers)。所有的重活都交给这些handlers来做。
每一个handler知道以哪种url协议(http,ftp等等)打开url,或者怎么处理打开url时的某些方面,如,HTTP重定向,或者HTTP cookie。
你将会创建openers如果你想要用安装特别的handlers获取url,例如,获取一个处理cookie的opener,或者一个不处理重定向的opener。

默认opener有对普通情况的操作器 (handlers)- ProxyHandler, UnknownHandler, HTTPHandler, HTTPDefaultErrorHandler, HTTPRedirectHandler, FTPHandler, FileHandler, HTTPErrorProcessor.

创建Openers:
枚举一个OpenerDirector,然后多次调用.add_handler(some_handler_instance)来创建一个opener。

或用build_opener,这是一个很方便的创建opener对象的函数,它只有一个函数调用。build_opener默认会加入许多handlers

import urllib.request
proxy_support = urllib.request.ProxyHandler({})
opener = urllib.request.build_opener(proxy_support)
urllib.request.install_opener(opener)




你可能感兴趣的:(Python)