![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=1739346793-xyyivuNAdz8szS9EEqBn6JT3hAtY9su1-0-78a1016c5bb64f416d0d5b67556ff166)
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=1739346793-ubbWuCIiL5MzFgS3YF73mpQFVO1zvMbG-0-f11d924f6c8da4c6fec5809d0285ea51)
在上述实例代码中,使用方法urlencode()对搜索的关键字“www.toppr.net”进行URL编码,在拼接到百度的网址后,使用urlopen()方法发出访问请求并取得结果,最后通过将结果进行解码和正则搜索与字符串处理后输出。如果将程序中的注释去除并把其后一句注释掉,就可以在运行时自主输入搜索的关键词,执行效果如图2-4所示。
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/56_02.jpg?sign=1739346793-InRswoC1yRuMf8KjymDPTgRypABh7s39-0-83a885e423acadbc279743a0da1db6af)
图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=1739346793-8JCz5x3GgdmxyT2sb2DwUxnHjjsLS2Im-0-a2aa281104a59c197541b401ae593c21)
方法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=1739346793-GMBSG9Upc9wqQuVEfca4tgEJwOkV201q-0-3b8ae499fb306dbc9fc0583a3eda72c4)
(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=1739346793-F7ksSpduY1AxuhKkcDhXbhhEhcRgXo3F-0-0e21ad9aaede5468603695aa5e4cc008)
下面是使用urlunpase()的语法。
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/57_03.jpg?sign=1739346793-zUTJvtiYObSJWU76CxcvHoNT18unNZcK-0-872c574e112e9c220c1d1620f9a074a8)
(3)方法urlparse.urljoin()
在处理多个相关URL时需要使用urljoin()的方法功能,例如在一个Web页中可能会产生一系列页面的URL。方法urljoin()的语法格式如下所示。
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/57_04.jpg?sign=1739346793-uiykA8HwgA1hPdAfqy2EU4IXu7Fq0ZAv-0-14c3098a7ba61dd30a5c5ee7b0bbdb74)
方法urljoin()能够取得根域名,并将其根路径(net_loc及其前面的完整路径,但不包括末端文件)与newurl连接起来。例如下面的演示过程。
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/57_05.jpg?sign=1739346793-vdlVgnl4HAFZ7n3niC7emdMBKbyWX7ru-0-442477eb823f40319e1a994cbc9b0319)
假设有一个身份验证(登录名和密码)的Web站点,通过验证的最简单方法是在URL中使用登录信息进行访问,如http://username:passwd@www.python.org。但这种方法的问题是它不具有可编程性。但通过使用urllib可以很好地解决这个问题,假设合法的登录信息是:
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/57_06.jpg?sign=1739346793-Qn4k1iy1ASKH2R9FvyklP6fBybJx4RTD-0-cf0d984780258c96f2d91b94eccde1f3)
此时便可以通过下面的实例文件pa.py来实现使用urllib进行HTTP身份验证的过程。
源码路径:daima\2\2-3\pa.py
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/57_07.jpg?sign=1739346793-L0IoyMBorqcQR6jQCawORoNyP4jUEeLh-0-e91041b55407e073b075d7fcd445ae65)
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/58_01.jpg?sign=1739346793-mZii79cmk0WBYYTujcCKoJGVAQyUam8h-0-0133a3065dcb88facb025b3ee0869930)
①~②实现普通的初始化功能,设置合法的登录验证信息。
③~④定义函数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=1739346793-3xMedNsto1Qy9LuQLIYOUH9wEkuwukOn-0-5bc07df610637296a810b9dff28a5bdf)
在下面的实例文件url02.py中,演示了使用库furl处理URL参数的过程。
源码路径:daima\2\2-3\url02.py
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/59_01.jpg?sign=1739346793-7QslJa37aH67vpqD9mBMvpBY2WQOpGJ6-0-45c7d2b6fecfad6ee8a205b407c4a589)
执行后会输出:
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/59_02.jpg?sign=1739346793-GddmbUHlbA5stGsNoXLcQhbBXqjO2wpI-0-59c8f10f9a3a31975ce61a22b969b0fc)
2.3.3 使用库purl处理数据
库purl是一个简单的、不可变的URL类,提供了简洁的API来处理URL。在库purl中,URL对象是不可变的,所有的修改器方法都会返回一个新的实例。我们可使用如下命令安装purl。
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/59_03.jpg?sign=1739346793-3pBo91jXASnpc0bT1o3O1LhBo7T8SLrh-0-4a7d6f3712232dc8611d4bd8a40fd9fd)
在下面的实例文件purl01.py中,演示了使用库purl处理三种构造类型URL的过程。
源码路径:daima\2\2-3\purl01.py
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/59_04.jpg?sign=1739346793-cBpVanck4WUNNqrI6zvYV2woSW32NMwh-0-a5962b7bad6b22df3cd1ac49b08a45d1)
执行后会输出:
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/60_01.jpg?sign=1739346793-47MxfmjZQzbbk2XndKgcQtclbuHe2M1f-0-4b96655f72fe8dfc4f152c0cceabad53)
在下面的实例文件purl02.py中,演示了使用库purl返回各个URL对象值的过程。
源码路径:daima\2\2-3\purl02.py
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/60_02.jpg?sign=1739346793-7ySRcfDLRtPno352OL9w79atIM80l3H9-0-2a6379f8ba0131a25669fc5774f6883b)
执行后会输出:
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/60_03.jpg?sign=1739346793-Os02z7Zj3AZJT4Z5UuUtg18EUeJLQaSX-0-9a7c0a2901a5d34df529b5cd6e5f28e4)
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=1739346793-ySt1RYhRIi01wG34IU2aRgruIhGTGpfv-0-b8bd3438923521b3d0913b63ef1df8bf)
在下面的实例文件webargs01.py中,演示了在Flask程序中使用库webargs处理URL参数的过程。
源码路径:daima\2\2-3\webargs01.py
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/61_02.jpg?sign=1739346793-nRCNOaOGO9Wdtoncgu8BRyugJC6QqUN9-0-fa52635b772edd409eeb2de54f5877ff)
在浏览器中输入“http://127.0.0.1:5000/?name='World'”后会显示执行效果,如图2-5所示。
![](https://epubservercos.yuewen.com/3F131D/17977545801605906/epubprivate/OEBPS/Images/61_03.jpg?sign=1739346793-XdfK0EjJxLNtoX9jdme2csRR9FEolZm4-0-d84a8013aded45527f0a2c2fe1249629)
图2-5 执行效果