现在的位置: 首页 > 综合 > 正文

Python urllib模块学习

2013年01月22日 ⁄ 综合 ⁄ 共 3020字 ⁄ 字号 评论关闭

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 aRequestobject
to set the headers for a URL request,
urllibaccepts only a URL. That means, you cannot masquerade your User Agent string etc.

      urllib provides theurlencodemethod
which is used for the generation of GET query strings,
urllib2doesn't have such a function. This is one of the reasons
why
urllibis often used along with
urllib2.

 

抱歉!评论已关闭.