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
或用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)