urllib与urllib2的学习
urllib的基本使用
urllib提供了通过万维网获取数据的高级别接口。特别的是,urlopen()与open()相似,但是接受统一资源标识符(URL)而不是文件名。此外,urllib有一些限制,只能进行读取,不能进行其他操作。
常用方法
urlopen
函数原型:
urllib.urlopen(url[, data[, proxies[, context]]])
- url:访问的目标URL
- data:进行POST的数据,形式符合application/x-www-form-urlencoded format,可以使用urllib.urlencode()函数
- proxies:设置代理
- context:HTTPS相关
返回对象有多种方法,常用如下:
- read():获取返回对象的全部内容
- readline():获取返回对象内容的第一行
- readlines():获取返回对象全部内容,并且按行组成list
- info():HTTP返回响应头信息
- getcode():返回HTTP的状态吗
- geturl():资源所在的URL,主要用于判断重定向
PS:read()、readline()、readlines()不能同时使用,下面代码经过人工修改。
>>> import urllib
>>> url = "http://127.0.0.1/hello.txt"
>>> page = urllib.urlopen(url)
>>> print page.read()
welcome
hello
大家好
>>> print page.readline()
welcome
>>> print page.readlines()
['welcome\r\n', 'hello\r\n', '\xb4\xf3\xbc\xd2\xba\xc3']
>>> print page.info()
Date: Sun, 23 Aug 2015 13:46:28 GMT
Server: Apache/2.2.21 (Win32) PHP/5.3.10
Last-Modified: Sun, 23 Aug 2015 13:32:57 GMT
ETag: "12000000002146-16-51dfa8a00c1be"
Accept-Ranges: bytes
Content-Length: 22
Connection: close
Content-Type: text/plain
>>> print page.getcode()
200
>>> print page.geturl()
http://127.0.0.1/hello.txt
urlretrieve
拷贝远程文件到本地。如果URL指向本地文件,或者是一个有效的已经存在的缓存对象,将不会进行拷贝。返回值为tuple(filename,headers),filename指本地文件。headers是响应头。(与urlopen()中info()一样)
函数原型:
urllib.urlretrieve(*url[, filename[, reporthook[, data]]])
- url:目标URL
- filename:保存到本地的文件名
- reporthook:回调函数,每一次连接传输完成后,都会出发该回调函数。回调函数提供三个参数,第一个已经传输的数据块个数,第二个是传输的数据块大小(单位B),第三个是文件的完整大小。根据这三个参数,可以计算当前下载进度。
- data:需要POST的数据
>>> import urllib
>>> def callbackfunc(blocknum, blocksize, totalsize):
... '''回调函数
... @blocknum: 已经下载的数据块
... @blocksize: 数据块的大小
... @totalsize: 远程文件的大小
... '''
... percent = 100.0 * blocknum * blocksize / totalsize
... if percent > 100:
... percent = 100
... print "%.2f%%" % percent
...
>>> url = 'http://www.zzti.edu.cn'
>>> local = 'd:\\zzti.html'
>>> page = urllib.urlretrieve(url, local, callbackfunc)
0.00%
9.27%
18.53%
27.80%
37.07%
46.33%
55.60%
64.86%
74.13%
83.40%
92.66%
100.00%
>>> print page[0]
d:\zzti.html
>>> print page[1]
Date: Mon, 24 Aug 2015 02:32:53 GMT
Server: VWebServer
Last-Modified: Sat, 22 Aug 2015 08:44:19 GMT
ETag: "15956-51de263e01ec0"
Accept-Ranges: bytes
Content-Length: 88406
Cache-Control: max-age=600
Expires: Mon, 24 Aug 2015 02:42:53 GMT
Vary: Accept-Encoding
Connection: close
Content-Type: text/html
Content-Language: zh-CN
urlencode
URL格式化,对POST数据格式化特别好用。
函数原型:
urllib.urlencode(query)
>>> import urllib
>>> data = {"username":"peter","password":"123456"}
>>> print urllib.urlencode(data)
username=peter&password=123456
urllib2的基本使用
urllib2定义了许多关于处理URL方面(更多的是HTTP)的函数、类,同时提供支持基本的功能外,还包括认证、重定向、cookie等等实用功能。
常用方法
urlopen
函数原型:
urllib2.urlopen(url,[, data[, timeout[, capath[, cadefault[, context]]]]])
- url是必选参数,其形式可以是字符串,也可以是Request对象。
- 可选参数data,是发送给服务器的数据,其形式需要满足application/x-www-form-urlencoded format,可以使用urllib.urlencode()函数。同时,当指定data时,HTTP请求的类型会变成POST类型。
- 可选参数timeout,打开URL时的时间延迟,单位为秒(s)。如果未指定,将使用全局默认的timeout设置。
- 可选参数context、cafile、context用于HTTPS协议,此处暂时省略。
- 函数返回值有三个额外的方法:
- geturl() 返回资源所在的url,通常用来判断是否存在重定向
- info() 返回网页的meta-information,通常是响应头
- getcode() 返回HTTP状态码
>>> import urllib2
>>> page = urllib2.urlopen("http://www.zut.edu.cn",timeout=5)
>>> print page.geturl()
http://www.zut.edu.cn
>>> print page.info()
Date: Sun, 23 Aug 2015 04:21:19 GMT
Server: VWebServer
Last-Modified: Sat, 22 Aug 2015 08:44:19 GMT
ETag: "15956-51de263e01ec0"
Accept-Ranges: bytes
Content-Length: 88406
Cache-Control: max-age=600
Expires: Sun, 23 Aug 2015 04:31:19 GMT
Vary: Accept-Encoding
Connection: close
Content-Type: text/html
Content-Language: zh-CN
>>> print page.getcode()
200
Request
Request类原型:
urllib2.Request(url,[, data][, headers][, origin_req_host][, unverifiable])
- url:必选。有效的URL字符串
- data:可选。同urlopen()的data参数
- headers:可选。自定义HTTP请求头,类型为dictionary。例如:{“User-Agent”:”Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36”,”Refer”:”..”…}
- 最后两个参数是用来处理第三方Cookie,不做介绍。
Requet对象的常用的方法如下:
- add_data(data):设置Request的data。
- get_method():返回HTTP请求的类型
- has_data():返回布尔值,是否有data
- get-data():返回data
- add_header(key, val):添加header,注意header名字不能重复,否在后者会覆盖前者。
- has_header(header):返回参数header信息
- get_full_url():返回完整的URL
- get_type():返回URL类型
- get_host():返回连接主机
|
|
运行结果如下:
上面例子中,测试了常用的request对象的方法。包括POST方法、自定义请求header等,其中POST数据需要使用urllib.urlencode()函数进行格式化,因为在urllib2中没有这样的方法。此外对headers中的默认值进行说明。在Python2.7.9中,Accept-Encoding默认为identity,User-Agent默认为Python-urllib/2.7。在大多数情况下,我们需要修改默认值。
build_opener
函数原型:
urllib2.build_opener([handler,…])
返回OpenerDirector实例,handler可以是HTTPHandler, HTTPDefaultErrorHandler,HTTPCookieProcessor等等。
引入OpenerDirector的好处是可以更加灵活的操纵HTTP,比如HTTPCookieProcessor可以自动保存产生的Cookie,并在请求时附带进去。同样,还有很多类,功能繁多,此处不进行介绍。
urllib和urllib2的比较
urllib和urllib2都是处理URL方面的模块,其中urllib模块对用户控制方面缺乏支持,只提供了简单访问、读取功能。urllib2在用户控制方面比较出色,可以方便的进行相关操作,比如UA、Cookie、Refer等等都可以进行修改。
此外,由于urllib2没有urllib.urlencode()和urllib.urlretrieve()这样的函数,两个模块各有所长,urllib擅长对远程文件的操作,urllib2擅长HTTP请求的自定义。
Modify Time:2015/8/24 10:45:25