
2.3 处理URL数据

URL是Uniform Resoure Locator的缩写,中文含义是统一资源定位器,也就是WWW网址。本节将详细讲解使用Python语言处理URL数据的知识。
2.3.1 使用urllib包
在Python程序中,可以使用urllib包处理URL请求。urllib包中主要包括如下所示的模块。
● urllib.request:用于打开指定的URL网址。
● urllib.error:用于处理URL访问异常。
● urllib.parse:用于解析指定的URL。
● urllib.robotparser:用于解析robots.txt文件。robots是Web网站跟爬虫之间的协议,可以用txt格式的文本方式告诉对应爬虫被允许的权限。
1.使用urllib.request模块
在urllib.request模块中定义了打开指定URL的方法和类,甚至可以实现身份验证、URL重定向和Cookies存储等功能。在下面的实例文件url.py中,演示了使用方法urlopen()在百度搜索关键词中得到第一页链接的过程。
源码路径:daima\2\2-3\url.py

在上述实例代码中,使用方法urlencode()对搜索的关键字“www.toppr.net”进行URL编码,在拼接到百度的网址后,使用urlopen()方法发出访问请求并取得结果,最后通过将结果进行解码和正则搜索与字符串处理后输出。如果将程序中的注释去除并把其后一句注释掉,就可以在运行时自主输入搜索的关键词,执行效果如图2-4所示。

图2-4 执行效果
注意:urllib.response模块是urllib使用的响应类,定义了与urllib.request模块类似的接口、方法和类,包括read()和readline()。
2.使用urllib.parse模块
在Python程序中,urllib.parse模块提供了一些用于处理URL字符串的功能。这些功能主要是通过如下所示的方法实现。
(1)方法urlpasrse.urlparse()
方法urlparse()的功能是,将URL字符串拆分成前面描述的一些主要组件,其语法结构如下。

方法urlparse()将urlstr解析成一个6元组(prot_sch, net_loc, path, params, query, frag)。如果在urlstr中没有提供默认的网络协议或下载方案,defProtSch会指定一个默认的网络协议。allowFrag用于标识一个URL是否允许使用片段。下面是一个给定URL经urlparse()后的输出。

(2)方法urlparse.urlunparse()
方法urlunparse()的功能与方法urlpase()完全相反,能够将经urlparse()处理的URL生成urltup 6元组(prot_sch, net_loc, path, params, query, frag),拼接成URL并返回。可以用如下所示的方式表示其等价性。

下面是使用urlunpase()的语法。

(3)方法urlparse.urljoin()
在处理多个相关URL时需要使用urljoin()的方法功能,例如在一个Web页中可能会产生一系列页面的URL。方法urljoin()的语法格式如下所示。

方法urljoin()能够取得根域名,并将其根路径(net_loc及其前面的完整路径,但不包括末端文件)与newurl连接起来。例如下面的演示过程。

假设有一个身份验证(登录名和密码)的Web站点,通过验证的最简单方法是在URL中使用登录信息进行访问,如http://username:passwd@www.python.org。但这种方法的问题是它不具有可编程性。但通过使用urllib可以很好地解决这个问题,假设合法的登录信息是:

此时便可以通过下面的实例文件pa.py来实现使用urllib进行HTTP身份验证的过程。
源码路径:daima\2\2-3\pa.py


①~②实现普通的初始化功能,设置合法的登录验证信息。
③~④定义函数handler_version(),添加验证信息后建立一个URL开启器,安装该开启器以便所有已打开的URL都能用到这些验证信息。
⑤~⑥定义函数request_version()创建一个Request对象,并在HTTP请求中添加简单的基于64编码的验证头信息。在for循环里调用urlopen()时,该请求用来替换其中的URL字符串。
⑦~⑧分别打开给定的URL,通过验证后会显示服务器返回的HTML页面的第一行(转储了其他行)。如果验证信息无效会返回一个HTTP错误,并且不会有HTML。
2.3.2 使用库furl处理数据
在Python应用中,库furl是一个快速处理URL应用的小型Python库,可以方便开发者以更加优雅的方式操作URL地址。可使用如下命令安装furl。

在下面的实例文件url02.py中,演示了使用库furl处理URL参数的过程。
源码路径:daima\2\2-3\url02.py

执行后会输出:

2.3.3 使用库purl处理数据
库purl是一个简单的、不可变的URL类,提供了简洁的API来处理URL。在库purl中,URL对象是不可变的,所有的修改器方法都会返回一个新的实例。我们可使用如下命令安装purl。

在下面的实例文件purl01.py中,演示了使用库purl处理三种构造类型URL的过程。
源码路径:daima\2\2-3\purl01.py

执行后会输出:

在下面的实例文件purl02.py中,演示了使用库purl返回各个URL对象值的过程。
源码路径:daima\2\2-3\purl02.py

执行后会输出:

2.3.4 使用库webargs处理数据
在Python程序中,可以使用库webargs解析HTTP请求参数。库webargs提供了当前主流的Web框架,如Flask、Django、Bottle、Tornado、Pyramid、Falcon等。可以使用如下命令安装webargs。

在下面的实例文件webargs01.py中,演示了在Flask程序中使用库webargs处理URL参数的过程。
源码路径:daima\2\2-3\webargs01.py

在浏览器中输入“http://127.0.0.1:5000/?name='World'”后会显示执行效果,如图2-5所示。

图2-5 执行效果