python提供了对访问网页的简单形式。使用urllib2一个函数即可。
import urllib2 response = urllib2.urlopen('http://python.org/') html = response.read() print html
这是简单的方法。在urllib2中,还有一些更复杂的功能可以使用。
HTTP协议基于请求和回应(requests &responses )。
客户端制造请求服务器返回回应。Request对象反映了客户端的请求。建立一个Request对象来明确指明我们想要获取的url。
调用urlopen函 数对请求的url返回一个response对象。这个response是一个像file的对象,这意味着你能用.read()函数操作这个response对象:
import urllib2 req = urllib2.Request('http://www.baidu.com') response = urllib2.urlopen(req) html = response.read() print html
注意:
urlib2利用了同样的Request接口来处理所有的url协议。例如,你可以像这样请求一个ftpRequest:
req = urllib2.Request('ftp://example.com/')
不仅可以是ftp文件,也可以是本地文件。
# -*- coding: cp936 -*- import urllib2 req = urllib2.Request('file:C:/Users/naughty/Desktop/a.py') response = urllib2.urlopen(req) data = response.read() f=open('d:/a.txt','wb') f.write(data) f.close()
--------------------------
对于HTTP,Request对象允许你做两件额外的事:
第一,你可以向服务器发送数据。
第二,你可以向服务器发送额外的信息(metadata),这些信息可以是关于数据本身的,或者是关于这个请求本身的–这些信息被当作HTTP头发送。
有时你想向一个URL发送数据(通常这些数据是代表一些CGI脚本或者其他的web应用)。
对于HTTP,这通常叫做一个Post。当你发送一个你 在网上填的form(表单)时,这通常是你的浏览器所做的。
并不是所有的Post请求都来自HTML表单,这些数据需要被以标准的方式encode,然后 作为一个数据参数传送给Request对象。
Encoding是在urlib中完成的,而不是在urlib2中完成的。
import urllib import urllib2 url = 'http://www.someserver.com/cgi-bin/register.cgi' values = {'name' : 'Michael Foord', 'location' : 'Northampton', 'language' : 'Python' } data = urllib.urlencode(values) req = urllib2.Request(url, data) response = urllib2.urlopen(req) the_page = response.read()
------------------------------------------------------------
api讲解
urllib2的urlopen函数,
创建一个表示远程url的类文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据。参数url表示远程数据的路径,一般是网址;参数data表示以post方式提交到url的数据(玩过web的人应该知道提交数据的两种方式:post与get。如果你不清楚,也不必太在意,一般情况下很少用到这个参数);参数proxies用于设置代理(这里不详细讲怎么使用代理,感兴趣的看客可以去翻阅Python手册urllib模块)。urlopen返回 一个类文件对象,他提供了如下方法:
* read() , readline() , readlines() , fileno() , close() :这些方法的使用方式与文件对象完全一样;
* info():返回一个httplib.HTTPMessage 对象,表示远程服务器返回的头信息;
* getcode():返回Http状态码。如果是http请求,200表示请求成功完成;404表示网址未找到;
* geturl():返回请求的url;
# -*- coding: cp936 -*- import urllib2 req = urllib2.Request('http://www.baidu.com') response = urllib2.urlopen(req) data = response.read() print response.geturl() print response.getcode() f=open('d:/a.txt','wb') f.write(data) f.close()
上面的代码访问了百度网页并保存。同时打印出了状态码和当前访问的url。
urllib的urlretrieve函数
urlretrieve方法直接将远程数据下载到本地。参数filename指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);参数reporthook是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调【下面例子显示下载进度的就是使用过来这个性质,相应数据块下载完毕的时候就会触发这callback函数,打印出来当前的进度】。我们可以利用这个回调函数来显示当前的下载进度。
# -*- coding: cp936 -*- import urllib def cbk(a,b,c): ''' a:已经下载的数据块数量 b:数据块大小 c:远程文件的大小 ''' per=100.0*a*b/c if per>100: per=100 print '%.2f%%' % per url="http://www.sina.com.cn" local="d:/baidu.html" urllib.urlretrieve(url,local,cbk)
callback函数会调用多次。
------------------------------
看到这里有点晕了。urllib和urllib2有什么区别呢?
urllib 和urllib2都是接受URL请求的相关模块,但是提供了不同的功能。两个最显著的不同如下:
urllib2 can accept aRequest
object to set the headers for a URL request,urllib
accepts only a URL. That means, you cannot masquerade your User Agent string etc.
urllib provides theurlencode
method which is used for the generation of GET query strings,urllib2
doesn't have such a function. This is one of the reasons whyurllib
is often used along with urllib2
.