![Python数据分析从入门到精通](https://wfqqreader-1252317822.image.myqcloud.com/cover/705/33643705/b_33643705.jpg)
2.3 处理URL数据
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/55_02.jpg?sign=1739342701-KplHDarlXJ4vgGnxmWmCnDEyUVgsUrne-0-0d55bd72d0820b2bc175781321034493)
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
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/56_01.jpg?sign=1739342701-4uZ079eeXoqrWaMyh3VYq64kXiSvOX5S-0-298fca6a4bc7fc549acacdb596b3713b)
在上述实例代码中,使用方法urlencode()对搜索的关键字“www.toppr.net”进行URL编码,在拼接到百度的网址后,使用urlopen()方法发出访问请求并取得结果,最后通过将结果进行解码和正则搜索与字符串处理后输出。如果将程序中的注释去除并把其后一句注释掉,就可以在运行时自主输入搜索的关键词,执行效果如图2-4所示。
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/56_02.jpg?sign=1739342701-C0U4ereiDgvmk0NXoa9e3izZUU9IFMcd-0-53451a33414fd86f08aa2f4531f9913a)
图2-4 执行效果
注意:urllib.response模块是urllib使用的响应类,定义了与urllib.request模块类似的接口、方法和类,包括read()和readline()。
2.使用urllib.parse模块
在Python程序中,urllib.parse模块提供了一些用于处理URL字符串的功能。这些功能主要是通过如下所示的方法实现。
(1)方法urlpasrse.urlparse()
方法urlparse()的功能是,将URL字符串拆分成前面描述的一些主要组件,其语法结构如下。
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/56_04.jpg?sign=1739342701-1NyL8vdedSS9p3H71jYS3Gs2LzZxKUx2-0-4c17cf9a0a4936f4cfbd996c230b188b)
方法urlparse()将urlstr解析成一个6元组(prot_sch, net_loc, path, params, query, frag)。如果在urlstr中没有提供默认的网络协议或下载方案,defProtSch会指定一个默认的网络协议。allowFrag用于标识一个URL是否允许使用片段。下面是一个给定URL经urlparse()后的输出。
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/57_01.jpg?sign=1739342701-os86i57dW98RZk8C5wJ0pVzSgu2jh9uQ-0-68e52e3325b9963a31dd8a815dd04fd0)
(2)方法urlparse.urlunparse()
方法urlunparse()的功能与方法urlpase()完全相反,能够将经urlparse()处理的URL生成urltup 6元组(prot_sch, net_loc, path, params, query, frag),拼接成URL并返回。可以用如下所示的方式表示其等价性。
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/57_02.jpg?sign=1739342701-oa2UOCViQ6JTj3OyBYyAuS4TS2dFpsBk-0-c2371465a07ba51c4a39158cf1a4783d)
下面是使用urlunpase()的语法。
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/57_03.jpg?sign=1739342701-OZMQO1fauk2YsDWaPcWs0gTN8xpKqpIf-0-6226e26729ded7c1181a6e6960dd8bfe)
(3)方法urlparse.urljoin()
在处理多个相关URL时需要使用urljoin()的方法功能,例如在一个Web页中可能会产生一系列页面的URL。方法urljoin()的语法格式如下所示。
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/57_04.jpg?sign=1739342701-nZU44AjMxCcU5Ci1eElfbLA2HI0IIczO-0-bef117e90be9fbb2999e9c822da67c9a)
方法urljoin()能够取得根域名,并将其根路径(net_loc及其前面的完整路径,但不包括末端文件)与newurl连接起来。例如下面的演示过程。
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/57_05.jpg?sign=1739342701-51V0lXrplrFpSoDS1PNU4iFnTyizG7M5-0-1dda5005c8698561c393658bde68fbda)
假设有一个身份验证(登录名和密码)的Web站点,通过验证的最简单方法是在URL中使用登录信息进行访问,如http://username:passwd@www.python.org。但这种方法的问题是它不具有可编程性。但通过使用urllib可以很好地解决这个问题,假设合法的登录信息是:
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/57_06.jpg?sign=1739342701-I7z1LSE4DDWTSakP5i6r7ggyL75P9Hv6-0-4a21907e70fadaa1673af2449bd94ff4)
此时便可以通过下面的实例文件pa.py来实现使用urllib进行HTTP身份验证的过程。
源码路径:daima\2\2-3\pa.py
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/57_07.jpg?sign=1739342701-dhOIje1kNjbFj1162tj1L6VQMNseXD1h-0-7f9e2dbb98f05de1e69dd36efd639a06)
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/58_01.jpg?sign=1739342701-i7AwGjMOLJAa7Qp7WObh5gL0vCIXgIyW-0-edc14a680cf70f31d3657a3d9d8de4e5)
①~②实现普通的初始化功能,设置合法的登录验证信息。
③~④定义函数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。
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/58_02.jpg?sign=1739342701-QiNpg8rxgwj9NOkJjdi7A3UWg8opVQED-0-5295faf9176d8c979b75b19c4bfd7949)
在下面的实例文件url02.py中,演示了使用库furl处理URL参数的过程。
源码路径:daima\2\2-3\url02.py
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/59_01.jpg?sign=1739342701-NGqqwL4ltBQaHHOA2tWbqBaDJPFlbrar-0-3364b319beca297912cfaaec54b1ffb7)
执行后会输出:
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/59_02.jpg?sign=1739342701-zRdUMlaxUGSfyecUQLCGjV52AEdxepu5-0-a24cef140b5ea304d4e3950ef08af79b)
2.3.3 使用库purl处理数据
库purl是一个简单的、不可变的URL类,提供了简洁的API来处理URL。在库purl中,URL对象是不可变的,所有的修改器方法都会返回一个新的实例。我们可使用如下命令安装purl。
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/59_03.jpg?sign=1739342701-QQj5XTpirfKbJz4diaLBwPhEaCrVYxEZ-0-af9c05c5da766f86bd3f4e0e54432edf)
在下面的实例文件purl01.py中,演示了使用库purl处理三种构造类型URL的过程。
源码路径:daima\2\2-3\purl01.py
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/59_04.jpg?sign=1739342701-ZdyaKyKKQkwuDN4hq3n1K6pL5R6nDBBN-0-756b3edb2006f2e5c6bb1e8905d08c45)
执行后会输出:
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/60_01.jpg?sign=1739342701-XIzRMzz9B8LMZDPe6T0LkkmiHILsAMNA-0-2dd1c8f93b84de2865f29227d2aae3cd)
在下面的实例文件purl02.py中,演示了使用库purl返回各个URL对象值的过程。
源码路径:daima\2\2-3\purl02.py
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/60_02.jpg?sign=1739342701-ohEwSmczPmMEerpBnuYVOn0S12wNGCZF-0-cccf3f38fe02b8f1b986bec7c79bb831)
执行后会输出:
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/60_03.jpg?sign=1739342701-e5BG5gbyGtqTxUBg1jyfNKwh15s1HSwk-0-7dc91905f028131b803234c47e09a05f)
2.3.4 使用库webargs处理数据
在Python程序中,可以使用库webargs解析HTTP请求参数。库webargs提供了当前主流的Web框架,如Flask、Django、Bottle、Tornado、Pyramid、Falcon等。可以使用如下命令安装webargs。
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/61_01.jpg?sign=1739342701-B7pWcgbJouWMoEZdytvbmCIbLRzsq1Uv-0-d45d14a8b66225c8c7af741c347cf9b6)
在下面的实例文件webargs01.py中,演示了在Flask程序中使用库webargs处理URL参数的过程。
源码路径:daima\2\2-3\webargs01.py
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/61_02.jpg?sign=1739342701-2mVlzF97YMcGhWrxsSRyrKA48s4hz3j9-0-feb05cb9e59b0d17ad7c0a81504130d4)
在浏览器中输入“http://127.0.0.1:5000/?name='World'”后会显示执行效果,如图2-5所示。
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/61_03.jpg?sign=1739342701-iXFD1PXIiqCbtKBIqGgiKyyb6bCGw4RJ-0-77ad7e74f01a29c30db28a066c8fa92c)
图2-5 执行效果