urllib
urllib 是标准库中的 URL 与 HTTP 工具集合,主要包括 parse、request、error 和 robotparser。复杂 HTTP 客户端通常选择第三方库,但基础请求无需额外依赖。
解析与构造 URL
from urllib.parse import urlparse, parse_qs, urlencode, urlunparse
url = "https://example.com:443/search?q=Python&q=stdlib#top"
parts = urlparse(url)
print(parts.scheme, parts.hostname, parts.path)
print(parse_qs(parts.query)) # {'q': ['Python', 'stdlib']}
query = urlencode({"q": "Python 教程", "page": 1})
print(urlunparse(("https", "example.com", "/search", "", query, "")))
quote()/quote_plus() 对路径或查询值编码,urljoin(base, target) 合并相对 URL。处理用户输入时校验 scheme 和 host,避免把不可信 URL 直接交给内部网络请求。
发起 HTTP 请求
from urllib.request import Request, urlopen
request = Request("https://example.com", headers={"User-Agent": "study-client/1.0"})
try:
with urlopen(request, timeout=10) as response:
body = response.read()
print(response.status, response.headers.get_content_type())
except Exception as error:
print(f"请求失败:{error}")
始终设置超时,按需读取响应大小并检查状态码和内容类型。urlopen 遇到 HTTP 错误会抛出 HTTPError,网络问题通常是 URLError;生产代码应分别处理、记录和重试可重试错误。
发送表单数据:
data = urlencode({"name": "小林"}).encode()
request = Request("https://example.com/form", data=data, method="POST")
不要手写拼接查询字符串;不要把密码、令牌写入 URL(会进入日志和历史记录)。