目录
一、urllib 模块的安装与引入
二、urllib.request 基础
1. 发送 GET 请求
2. 发送 POST 请求
3. 设置自定义请求头
4. 使用代理发送请求
三、urllib.parse:解析与构造 URL
1. 将 URL 分解为组件
2. 构造 URL
3. 解码查询字符串
四、urllib.error: 捕获异常
五、urllib.robotparser: 解析 robots.txt
六、进阶技巧
1. 超时设置
2. 使用 HTTPS 安全连接
七、总结
urllib 是 Python 内置的用于处理 URL(Uniform Resource Locator)的模块,也是实现网络请求的基础库之一。该模块功能强大,但它的使用和管理相对于一些第三方库(如 requests)稍显繁复。本文将从基础到进阶,详细介绍 urllib 的使用方法,并给出丰富的代码示例和实际应用案例。
urllib 模块在 Python 3 中被拆分为多个子模块,主要包括:
urllib.request:用于发送 HTTP 请求、处理 URL。
urllib.parse:用于解析和构造 URL。
urllib.error:用于处理请求中的错误。
urllib.robotparser:用于解析网站 robots.txt 文件的规则。
一、urllib 模块的安装与引入
urllib 是 Python 的标准库,无需额外安装。不过,你必须确保自己的 Python 环境是 3.x 版本(Python 2.x 已经被官方废弃,其 urllib 使用与 3.x 有较大区别)。
Python
import urllib
在 Pyhton 3.x 中,可以引入模块子组件,例如:
Python
from urllib import request, parse, error, robotparser
二、urllib.request 基础
urllib.request 是核心模块,用于处理 HTTP 请求和响应。以下是最常见的操作:
1. 发送 GET 请求
GET 请求是最常见的 HTTP 请求,用于向服务器获取数据。
Python
from urllib import request
# 目标 URL
url = "https://jsonplaceholder.typicode.com/posts"
# 发送 GET 请求
response = request.urlopen(url)
# 读取响应内容(字节流)
data = response.read()
# 解码为字符串
text = data.decode('utf-8')
# 打印内容
print("响应内容:", text)
# 打印 HTTP 状态码
print("状态码:", response.status)
# 打印响应头
print("响应头:", response.getheaders())
输出:
Code
状态码: 200
响应头: [('Content-Type', 'application/json; charset=utf-8'), ('Server', 'cloudflare')]
响应内容: [JSON 数据]
2. 发送 POST 请求
POST 请求通常用于提交数据到服务器,例如提交表单数据。
Python
from urllib import request, parse
# 目标 URL
url = "https://jsonplaceholder.typicode.com/posts"
# 准备 POST 数据
post_data = {
"title": "foo",
"body": "bar",
"userId": 1
}
# 将字典编码为 `application/x-www-form-urlencoded` 格式
post_data = parse.urlencode(post_data).encode('utf-8')
# 发起 POST 请求
req = request.Request(url, data=post_data, method="POST")
response = request.urlopen(req)
# 读取响应
data = response.read().decode('utf-8')
print("响应内容:", data)
3. 设置自定义请求头
在发送请求时,通常需要设置一些自定义的 HTTP 头,例如 User-Agent、Cookie 等。
Python
from urllib import request
# 目标 URL
url = "https://httpbin.org/headers"
# 自定义请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36',
'Authorization': 'Bearer my_token'
}
# 创建请求对象
req = request.Request(url, headers=headers)
# 发起 GET 请求
response = request.urlopen(req)
data = response.read().decode('utf-8')
print("响应内容:", data)
4. 使用代理发送请求
有时候需要使用代理服务器访问目标网站,可以通过 urllib 实现。
Python
from urllib import request
# 目标 URL
url = "http://httpbin.org/ip"
# 设置代理
proxy = {"http": "http://103.21.163.81:6666", "https": "https://103.21.163.81:6666"}
proxy_handler = request.ProxyHandler(proxy)
# 创建一个 opener 对象
opener = request.build_opener(proxy_handler)
# 使用 opener 发送请求
response = opener.open(url)
data = response.read().decode('utf-8')
print("响应内容:", data)
三、urllib.parse:解析与构造 URL
urllib.parse 提供了一些用于解析、构造和处理 URL 的工具,非常适合用来管理复杂的 URL。
1. 将 URL 分解为组件
可以利用 urlparse 将一个 URL 分解为多个组成部分。
Python
from urllib.parse import urlparse
url = "https://example.com:8080/path/to/file?query=value#section"
# 分解 URL
result = urlparse(url)
print("协议:", result.scheme)
print("域名:", result.netloc)
print("路径:", result.path)
print("查询参数:", result.query)
print("片段:", result.fragment)
输出:
Code
协议: https
域名: example.com:8080
路径: /path/to/file
查询参数: query=value
片段: section
2. 构造 URL
使用 urlencode 构造查询字符串,并拼接到 URL。
Python
from urllib.parse import urlencode
# 基础 URL
base_url = "https://example.com/api?"
# 查询参数
params = {
"search": "Python urllib",
"page": 1,
"count": 10
}
# 构造完整 URL
full_url = base_url + urlencode(params)
print("完整 URL:", full_url)
输出:
Code
完整 URL: https://example.com/api?search=Python+urllib&page=1&count=10
3. 解码查询字符串
使用 parse_qs 或 parse_qsl 将查询字符串解析为字典或元组列表。
Python
from urllib.parse import parse_qs
query = "search=Python+urllib&page=1&count=10"
# 将查询字符串解析为字典
params = parse_qs(query)
print("参数字典:", params)
四、urllib.error: 捕获异常
网络请求由于超时、DNS 错误等原因可能会导致异常,可以通过 urllib.error 捕���并处理。
Python
from urllib import request, error
url = "http://thisurldoesnotexist.xyz"
try:
response = request.urlopen(url)
except error.URLError as e:
print("请求失败:", e.reason)
五、urllib.robotparser: 解析 robots.txt
urllib.robotparser 用于解析网站的 robots.txt 文件,检查爬虫是否有权限抓取指定页面。
Python
from urllib.robotparser import RobotFileParser
# 创建解析器
rp = RobotFileParser()
# 设置 robots.txt URL
rp.set_url("https://www.example.com/robots.txt")
rp.read()
# 检查是否允许爬取指定页面
url = "https://www.example.com/some-page"
print(f"允许访问 {url}:", rp.can_fetch("*", url))
六、进阶技巧
1. 超时设置
在调用 urlopen 方法时,可以使用 timeout 参数来设置超时时间。
Python
from urllib import request
url = "https://google.com"
try:
response = request.urlopen(url, timeout=5)
except Exception as e:
print("请求超时!")
2. 使用 HTTPS 安全连接
urllib 默认支持 HTTPS 请求,并能够通过 ssl 模块进行控制。
Python
from urllib import request
import ssl
# 禁用 SSL 证书验证(谨慎使用)
ssl._create_default_https_context = ssl._create_unverified_context
url = "https://self-signed.badssl.com/"
response = request.urlopen(url)
print(response.read().decode('utf-8'))
七、总结
urllib 是 Python 的内置网络模块,功能丰富但稍显复杂。尽管在简单场景使用它可能不如第三方库 requests 友好,但它作为基础工具,足够应对大部分基本的 HTTP 请求和 URL 操作需求。
在生产环境中,推荐结合 urllib 和第三方工具构建更灵活的网络模块。

















暂无评论内容