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设置。
  • 可选参数contextcafilecontext用于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():返回连接主机
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import urllib2
import urllib
url = "http://www.zut.edu.cn"
data = {"username": 'peter'}
data = urllib.urlencode(data)
useragent = ("Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/44.0.2403.155 Safari/537.36")
refer = "www.123456.com"
headers = {"User-Agent": useragent,"Refer": refer}
request = urllib2.Request(url, data=data, headers=headers)
print "request.get_method():%s" % request.get_method()
print "request.get_header(\"Refer\"):%s" % request.get_header("Refer")
print "request.has_data():%s" % request.has_data()
print "request.get_data():%s" % request.get_data()
print "request.get_full_url():%s" % request.get_full_url()
print "request.get_type():%s" % request.get_type()
print "request.get_host():%s" % request.get_host()
page = urllib2.urlopen(request)
print "page.getcode():%s" % page.getcode()

运行结果如下:

1
2
3
4
5
6
7
8
request.get_method():POST
request.get_header("Refer"):www.123456.com
request.has_data():True
request.get_data():username=peter
request.get_full_url():http://www.zut.edu.cn
request.get_type():http
request.get_host():www.zut.edu.cn
page.getcode():200

上面例子中,测试了常用的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