在互联网世界中,不同的资源通过 URL(统一资源定位符)来识别。Python 的标准库包含了 urllib 包,这个包中有处理 URL 的模块。它帮助你解析 URL、获取网页内容以及管理错误。
本教程介绍了 urllib 的基础用法来帮助你开始使用它。通过使用 urllib 提升你在网页抓取、数据获取以及 URL 管理方面的能力。
urllib 包包含以下模块用于处理 URL:
-
urllib.parse
模块用于将一个 URL 字符串解析成其各个部分。
-
urllib.request
模块包含用于打开和读取 URL 的函数。
-
urllib.error
模块定义了由 urllib.request
抛出的异常。
-
urllib.robotparser
模块解析 robots.txt 文件。
urllib.parse
模块
这个模块作为一个标准接口来从一个 URL 字符串中获取各种部分。该模块包含以下函数:
-
urlparse(urlstring)
解析一个 URL 并将其拆分为六个组件,返回一个包含六个项目的命名元组。每个元组项都是字符串,对应于以下属性:
示例
from urllib.parse import urlparse
url = "https://example.com/employees/name/?salary>=25000"
parsed_url = urlparse(url)
print(type(parsed_url))
print("Scheme:", parsed_url.scheme)
print("netloc:", parsed_url.netloc)
print("path:", parsed_url.path)
print("params:", parsed_url.params)
print("Query string:", parsed_url.query)
print("Fragment:", parsed_url.fragment)
输出:
<class 'urllib.parse.ParseResult'>
Scheme: https
netloc: example.com
path: /employees/name/
params:
Query string: salary>=25000
Fragment:
-
parse_qs(qs)
解析作为字符串参数给出的查询字符串。数据以字典形式返回,字典键是唯一的查询变量名,值是每个名称的值列表。
为了进一步从查询字符串中获取查询参数到字典中,可以使用 ParseResult
对象的 parse_qs()
函数如下:
示例
from urllib.parse import urlparse, parse_qs
url = "https://example.com/employees?name=Anand&salary=25000"
parsed_url = urlparse(url)
dct = parse_qs(parsed_url.query)
print("Query parameters:", dct)
输出:
Query parameters: {'name': ['Anand'], 'salary': ['25000']}
-
urlsplit(urlstring)
类似于 urlparse()
,但不会从 URL 中拆分参数。如果需要较新的 URL 语法允许在路径部分的每个段落应用参数,则应通常使用此方法而不是 urlparse()
。
-
urlunparse(parts)
这个函数与 urlparse()
函数相反。它从 urlparse()
返回的元组构建一个 URL。parts 参数可以是任何六项可迭代对象。这返回一个等效的 URL。
示例
from urllib.parse import urlunparse
lst = ['https', 'example.com', '/employees/name/', '', 'salary>=25000', '']
new_url = urlunparse(lst)
print("URL:", new_url)
输出:
URL: https://example.com/employees/name/?salary>=25000
-
urlunsplit(parts)
将 urlsplit()
返回的元组组合成一个完整的 URL 字符串。parts 参数可以是任何五项可迭代对象。
urllib.request
模块
这个模块提供了函数和类来处理通过 urlopen()
函数打开和读取 URL 的操作。
-
urlopen()
函数
此函数打开给定的 URL,它可以是一个字符串或一个 Request 对象。可选的超时参数指定了阻塞操作的超时时间(秒)。这实际上只对 HTTP、HTTPS 和 FTP 连接有效。
此函数总是返回一个可以用作上下文管理器的对象,并具有 url、headers 和 status 属性。对于 HTTP 和 HTTPS URL,此函数返回一个经过轻微修改的 http.client.HTTPResponse
对象。
示例
from urllib.request import urlopen
obj = urlopen("https://www.tutorialspoint.com/images/logo.png")
data = obj.read()
img = open("img.jpg", "wb")
img.write(data)
img.close()
-
Request
对象
urllib.request
模块包括 Request 类。这个类是对 URL 请求的抽象。构造器需要一个有效的 URL 字符串作为必需的参数。
示例
from urllib.request import Request
obj = Request("https://www.tutorialspoint.com/")
这个 Request 对象现在可以用作 urlopen()
方法的参数。
from urllib.request import Request, urlopen
obj = Request("https://www.tutorialspoint.com/")
resp = urlopen(obj)
调用其 read()
方法来获取给定 URL 的资源。
from urllib.request import Request, urlopen
obj = Request("https://www.tutorialspoint.com/")
resp = urlopen(obj)
data = resp.read()
print(data)
-
发送数据
如果定义了 Request 构造器的数据参数,则会向服务器发送 POST 请求。数据应该是字节表示的任何对象。
from urllib.request import Request, urlopen
from urllib.parse import urlencode
values = {'name': 'Madhu', 'location': 'India', 'language': 'Hindi'}
data = urlencode(values).encode('utf-8')
obj = Request("https://example.com", data)
-
发送头信息
Request 构造器还接受 header 参数来将头部信息推入请求中。它应该是一个字典对象。
headers = {'User-Agent': user_agent}
obj = Request("https://example.com", data, headers)
urllib.error
模块
此模块定义了以下异常:
-
URLError
当没有网络连接(无法到达指定服务器),或者指定的服务器不存在时,会引发 URLError。在这种情况下,抛出的异常将有一个 'reason' 属性。
示例
from urllib.request import Request, urlopen
import urllib.error as err
obj = Request("http://www.nosuchserver.com")
try:
urlopen(obj)
except err.URLError as e:
print(e)
输出:
HTTP Error 403: Forbidden
-
HTTPError
每次服务器发送 HTTP 响应时都会关联一个数字状态码。该代码指示服务器为什么无法完成请求。默认处理程序会为你处理某些响应。对于那些无法处理的,urlopen()
函数会抛出 HTTPError。典型的 HTTP 错误示例包括 '404'(页面未找到)、'403'(请求禁止)和 '401'(需要身份验证)。
示例
from urllib.request import Request, urlopen
import urllib.error as err
obj = Request("http://www.python.org/fish.html")
try:
urlopen(obj)
except err.HTTPError as e:
print(e.code)
输出:
404