urllib 是 Python 的一个内置库,用于处理 URL。它提供了一系列模块来帮助开发者更轻松地处理网络请求。这个模块包含以下子模块:
urllib.request:用于打开和读取 URL。urllib.parse:用于解析 URL。urllib.error:包含由urllib.request抛出的异常类。urllib.robotparser:用于解析 robots.txt 文件。
urllib.request 模块
使用 urlopen 打开 URL
urllib.request.urlopen() 函数用于打开一个指定的 URL,并返回一个类似文件的对象。如果成功打开 URL,则返回一个对象,该对象具有 read()、readline()、readlines()、close() 和 fileno() 方法。
import urllib.request
response = urllib.request.urlopen('https://www.example.com/')
print(response.read().decode('utf-8'))自定义请求头
有时需要发送带有自定义头部信息的请求。可以通过构造 Request 对象来实现这一点。
// www.javascriptcn.com code example
import urllib.request
url = 'https://www.example.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
req = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(req)
print(response.read().decode('utf-8'))处理 HTTP 错误
当访问的 URL 返回错误代码时,urlopen() 将抛出一个 HTTPError 异常。可以捕获这些异常并进行相应的处理。
// www.javascriptcn.com code example
import urllib.request
import urllib.error
try:
response = urllib.request.urlopen('https://www.example.com/', timeout=10)
except urllib.error.HTTPError as e:
print(e.code, e.reason)
except urllib.error.URLError as e:
print(e.reason)
else:
print(response.status)设置超时时间
为了防止请求挂起,可以设置一个超时时间。超时时间单位为秒。
import urllib.request
try:
response = urllib.request.urlopen('https://www.example.com/', timeout=10)
print(response.status)
except urllib.error.URLError as e:
print(e.reason)urllib.parse 模块
解析 URL
urllib.parse.urlparse() 函数用于将 URL 字符串解析为一个 ParseResult 对象,该对象包含多个部分,如 scheme、netloc、path、params、query 和 fragment。
// www.javascriptcn.com code example from urllib.parse import urlparse url = 'https://www.example.com/path?param1=value1¶m2=value2#fragment' parsed_url = urlparse(url) print(parsed_url.scheme) # 输出: https print(parsed_url.netloc) # 输出: www.example.com print(parsed_url.path) # 输出: /path print(parsed_url.query) # 输出: param1=value1¶m2=value2 print(parsed_url.fragment) # 输出: fragment
构造 URL
urllib.parse.urlunparse() 函数用于将 ParseResult 对象重新组合成 URL 字符串。
from urllib.parse import ParseResult, urlunparse
result = ParseResult(scheme='https', netloc='www.example.com', path='/path',
params='', query='param1=value1¶m2=value2', fragment='fragment')
url = urlunparse(result)
print(url) # 输出: https://www.example.com/path?param1=value1¶m2=value2#fragmentURL 编码和解码
urllib.parse.quote() 和 urllib.parse.unquote() 分别用于对 URL 中的特殊字符进行编码和解码。
from urllib.parse import quote, unquote
encoded_url = quote('https://www.example.com/path?param1=value1¶m2=value2#fragment')
print(encoded_url)
decoded_url = unquote(encoded_url)
print(decoded_url)urllib.error 模块
异常处理
urllib.error 模块包含了由 urllib.request 抛出的异常类。最常用的两个异常是 URLError 和 HTTPError。
// www.javascriptcn.com code example
import urllib.request
import urllib.error
try:
response = urllib.request.urlopen('https://www.example.com/', timeout=10)
except urllib.error.HTTPError as e:
print(e.code, e.reason)
except urllib.error.URLError as e:
print(e.reason)URLError
URLError 是一个基类,用于表示 URL 请求失败的各种原因。它通常会附带一个错误原因字符串。
import urllib.request
import urllib.error
try:
response = urllib.request.urlopen('https://www.example.com/', timeout=10)
except urllib.error.URLError as e:
print(e.reason)HTTPError
HTTPError 是 URLError 的子类,专门用于处理 HTTP 请求返回的错误代码。除了继承 URLError 的属性外,它还具有 code、reason 和 headers 属性。
import urllib.request
import urllib.error
try:
response = urllib.request.urlopen('https://www.example.com/', timeout=10)
except urllib.error.HTTPError as e:
print(e.code, e.reason)
print(e.headers)以上就是 Python3 urllib 模块的基本使用方法。通过这些示例,您可以开始使用 urllib 来处理网络请求了。希望本章内容能帮助您更好地理解和运用 urllib 模块。