HTTP,超文本传输协议,是TCP/IP的上层协议。TCP/IP协议负责发送或者传递消息这些交流工作,HTTP协议负责通过发送、接受HTTP消息来处理客户端的请求。
HTTP是无状态协议。
URL,统一资源定位符
URI,多种统一资源标识符
一个URL是一个简单的URI,我们现在很少用URI了。
URL由6个部分组成:
prot_sch 网络协议或下载方案
net_loc 服务器所在地(也许含有用户消息)
path 使用斜杠(/)分割的文件或CGI应用的路径
params 可选参数
query 连接符(&)分割的一系列键值对
frag 指定文档内特定锚的部分
其中,net_loc可以再细分为4部分:
user:passwd@host:port
user 用户名或登录
passwd 用户密码
host 运行Web服务器的计算机名称或地址(必需的)
port 端口号(如果不是默认的80)
urllib.parse.urlparse(urlstr,defProtSch=None,allowFrag=None)方法将urlstr解析成一个6元组(prot_sch,net_loc,path,params,query,frag)。如果urlstr中没有提供的默认的网络协议或下载方案,defProtSch会指定一个默认的网络协议。allowFrag标识一个URL是否允许使用片段。
urllib.parse.urlunparse(urltup)方法将一个6元组(prot_sch,net_loc,path,params,query,frag)拼接成一个字符串。
urllib.parse.urljoin(baseurl,newurl,allowFrag=None)方法,我没搞懂。下面有个例子:
from urllib import parse
#相对路径
parse.urljoin('http://www.baidu.com/doc/article.html','excel/1')
# result: http://www.baidu.com/doc/excel/1
parse.urljoin('http://www.baidu.com/doc/article.html','../excel/1')
# result: http://www.baidu.com/excel/1
#绝对路径
parse.urljoin('http://www.baidu.com/doc/abc/article.html','/excel/1')
#result: http://www.baidu.com/excel/1
urllib.request.urlopen(urlstr,postQueryData=None)打开urlstr,当postQueryData为None,请求方式为GET,当postQueryData为编码过的请求的字符串(一般我们用urllib.parse.urlencode()方法编码),请求方式为POST。
urlopen()对象的方法:
f.read([bytes])从f中读出所有或bytes个字节
f.readline()从f中读取一行
f.readlines()从f中读出所有行,作为列表返回
f.close() 关闭f的URL连接
f.fileno()返回f的文件句柄
f.info()获得f的MIME头文件
f.geturl()返回f的真正URL
urllib.request.urlretrieve(url,filename=None,reporthook=None,data=None)方法用于下载完整的HTML,把它存为文件。
按照标准, URL 只允许一部分 ASCII 字符(数字字母和部分符号),其他的字符(如汉字)是不符合 URL 标准的。所以我们可以用urllib.parse.quote(string,safe=’/’,encoding=None,errors=None)方法或者是urllib.parse.quote_plus(string,safe=”,encoding=None,errors=None)方法将其他字符进行 URL 编码。举例:
>>> from urllib import parse
>>> parse.quote('a&b/c') #未编码斜线
'a%26b/c'
>>> parse.quote_plus('a&b/c') #编码了斜线
'a%26b%2Fc'
然后我们可以通过urllib.parse.unquote(string,encoding=’utf-8’,errors=’replace’)方法和urllib.parse.unquote_plus(string,encoding=’utf-8’,errors=’replace’)方法对已编码的url ASCII码值解码为字符串。
urllib.parse.urlencode(dict)将dict的键值对通过quote_plus()编译成有效的CGI查询字符串,用quote_plus()对这个字符串进行编码。