python中用urlparse来对URL字符进行解析
urlparse方法由两个可选的参数:default_scheme和allow_fragments

default_scheme主要用来为不包含协议部分的URL指定默认协议,此参数默认值为空字符串
allow_fragments则用来指示是否可以对地址进行分片,此参数默认值为"True"
实例:

import urlparse
r=urlparse.urlparse('http://alice:secret@www.hostname.com:80/% 7Ealice/python.cgi?query=text#sample')
print r
print r.scheme
print r.netloc
print r.path
print r.params
print r.query
print r.fragment
print r.username
print r.password
print r.hostname
print r.port
print r.geturl()
r2=urlparse.urlparse("www.python.org/about","http")
print r2
URL的拼合:

当提供了URL中的绝对地址和相对地址的时候,可以使用urlparse模块中的urljoin方法将其拼合起来

import urlparse
r=urlparse.urljoin("http://www.zeroc.com","ice.html")
print r
结果:
http://www.zeroc.com/ice.html

该方法使用时如果相对URL中有协议字段,则优先使用相对URL中的协议,否则使用绝对URL中的协议字段

import urlparse
r=urlparse.urljoin("http://www.python.org","www.python.org/faq")
print r

http://www.python.org/www.python.org/faq
URL的分解:
import urlparse
r=urlparse.urlsplit("http://www.python.org:80/faq.cgi?src=fie")
print r

SplitResult(scheme='http', netloc='www.python.org:80', path='/faq.cgi', query='src=fie', fragment='')
注意:
a={'keyword1':'value1','keyword2':'value2'}
b={'keyword2':'value2','keyword1':'value1'}
print a is b    #False
print a==b		#True
虽然a,b输出的字符串是一样的,但两者所接受的字典结构数据输入的时候并不一样,这是由
字典内部的无序性造成的
urlencode方法可以接受一个可选的参数,默认为False,即当查询数据列表中的value也为列表的时候,将其整个使用quote_plus方法进行编码,并作为查询参数的值。而当其值为True的时候,对于上述的这种情况会将value列表中的每个值都和keyword组成一个查询参数值对

实例:

u2=urllib.urlencode([('keyword',('value1','value2','value3'))])
print u2  #keyword=%28%27value1%27%2C+%27value2%27%2C+%27value3%27%29

u3 = urllib.urlencode([('keyword',('value1','value2','value3'))],True)
print u3  #keyword=value1&keyword=value2&keyword=value3
爬网站初试:爬取知乎首页
# -*- coding:utf-8 -*-
import urllib
fp = urllib.urlopen("https://www.zhihu.com/")
op = open("index.html","wb")
n = 0
while True:
    s = fp.read(1024)
    if not s:
        break
    op.write(s)
    n=n+len(s)
fp.close()
op.close()
print "receive",n,"bytes from ",fp.url

一般情况下,urlopen的可选参数data为空的时候,支持多种协议,包括本地文件、HTTP协议等,当为http数据的时候,urlopen将使用get方法来获取相关的资源,但是当可选参数为非空的时候,则前面的协议字段必须为http,此时URLopen将使用post方法来获取URL资源,同时,data参数将作为post方法的数据一并传递给远端服务器,注意,这里的data需要使用urlencode编码过后的查询数据

使用代理:

设置代理:这里的代理设置指明了在使用http协议的时候将使用http://www.proxy.com:3128代理服务器

proxies = {'http':'http://www.proxy.com:3128'}
urllib.urlopen(url,proxies=proxies)

urllib模块中的urlretrieve方法,此方法和urlopen类似,最大的不同是此方法将获取的资源直接保存在文件中,而不是返回一个文件对象
urlretrieve方法中还有一个reporthook参数,此参数可以用来将urlretrieve方法执行的过程通过图形化的方法显示给用户。其值是一个函数,会在每次获取资源块的时候被调用,此函数有3个参数,分贝为文件块的个数,文件块的大小和文件的大小,当文件大小的值为-1的时候,表示此时无法获得整个文件的大小,特别是对于ftp流数据协议而言

使用reporthook参数得到获取资源时候的实时信息
import urllib
def reporthook(block_count,block_size,file_size):
    if file_size==-1:
        print "received data",block_count*block_size
    else:
        print "received data",block_count*block_size,"/",file_size

urllib.urlretrieve("http://www.baidu.com",filename="",reporthook=reporthook)
实例:结合urlretrieve方法和reporthook参数可以构成一个简单的下载器,并显示资源获取的具体进度
import urllib
def download(url,filename=""):
    def reporthook(block_count,block_size,file_size):
        if file_size==-1:
            print "Can't determine the file size,now retrieved",block_count*block_size
        else:
            percentage = int(block_count*block_size*100.0/file_size)
            if percentage>100:
                print "100%"
            else:
                print "% d% % " %(percentage)
    filehandler,m = urllib.urlretrieve(url,filename,reporthook=reporthook)
    print "Done"
    return filehandler

download("http://www.baidu.com",filename="")