urllib 是 Python 内置的标准库,用于处理 URL 操作、网络请求与响应处理。它提供了多个子模块,如 urllib.request、urllib.parse、urllib.error 和 urllib.robotparser,支持从互联网上获取数据、构造和解析 URL、处理异常等。
常见应用场景:
(1)发送 HTTP 请求并读取网页或 API 返回内容。
(2)设置请求头、自定义代理、处理重定向等。
(3)对 URL 编码、解析、拼接参数。
(4)捕获网络请求异常。
(5)判断网页是否允许被爬虫访问(robots.txt)。
◆ ◆ ◆
核心概念
1、urllib.request
用于发送 HTTP/HTTPS 请求,如打开网页、添加请求头、自定义请求对象等。
2、urllib.parse
提供 URL 编解码、拆解与拼接功能,是 URL 参数处理的核心模块。
3、urllib.error
定义了处理 HTTP 异常(如 404、503)或连接错误的异常类。
4、urllib.robotparser
可解析网站 robots.txt 文件,判断特定 URL 是否可被访问。
◆ ◆ ◆
应用举例
例 1:获取网页内容
from urllib import request
url = 'https://www.python.org'response = request.urlopen(url)html = response.read().decode('utf-8') # 解码为字符串print(html)
例 2:GET 请求带参数
from urllib import request, parse
params = {'q': 'mediaTEA'}query_string = parse.urlencode(params)url = f'https://www.baidu.com/search?{query_string}'response = request.urlopen(url)print(response.status)
说明:
最后打印响应的状态码:
200 表示请求成功
403 表示被禁止访问
404 表示网页未找到
503 表示服务器暂时不可用
例 3:POST 请求
from urllib import request, parse
data = parse.urlencode({'username': 'admin', 'password': '123'}).encode()req = request.Request('https://httpbin.org/post', data=data)res = request.urlopen(req)print(res.read().decode())
例 4:解析 URL 结构
from urllib.parse import urlparse
url = 'https://www.example.com/path/page.html?query=abc#section'result = urlparse(url)print(result.netloc) # 输出 www.example.comprint(result.path) # 输出 /path/page.html
例 5:robots.txt 判断访问权限
from urllib import robotparser
rp = robotparser.RobotFileParser()rp.set_url('https://www.python.org/robots.txt')rp.read()print(rp.can_fetch('*', 'https://www.python.org/downloads/'))
◆ ◆ ◆
常用函数速览
urllib.request
urlopen(url, data=None, timeout=...)
打开 URL 并返回响应对象。
参数:
url: 字符串 URL 或 Request 对象
data: 可选,发送的数据(bytes)
timeout: 超时时间(秒)
返回:HTTPResponse 对象
Request(url, data=None, headers={}, method='GET')
创建一个自定义请求对象
参数:
url: 请求地址
data: 请求数据(POST 需传入 bytes)
headers: 字典形式的请求头
method: 请求方法,如 GET、POST 等
返回:Request 对象
build_opener(*handlers)
创建自定义 opener,可用于添加代理、身份认证等
返回:OpenerDirector 对象
install_opener(opener)
将自定义 opener 设置为全局默认 opener
返回:无
urllib.parse
urlencode(query)
将字典或键值对元组转换为 URL 查询字符串
参数:query 为字典或列表
返回:字符串,如 'a=1&b=2'
urlparse(url)
将 URL 拆解为 6 个组成部分
返回:ParseResult 对象,具有 scheme、netloc、path、params、query、fragment 属性
urljoin(base, url)
拼接相对 URL 与基础 URL,返回完整 URL
返回:字符串 URL
parse_qs(query)
解析查询字符串为字典形式
返回:{'key': ['value']} 的字典
urllib.error
URLError
用于捕获连接失败、解析失败等非 HTTP 状态错误
可通过 .reason 查看错误信息
HTTPError
URLError 的子类,用于捕获 HTTP 状态错误(如 404、500)
可通过 .code 查看状态码,.read() 获取错误页面内容
urllib.robotparser
RobotFileParser.set_url(url)
设置 robots.txt 文件 URL
RobotFileParser.read()
下载并读取 robots.txt 文件
RobotFileParser.can_fetch(useragent, url)
判断特定 user-agent 是否允许访问指定 URL
返回:布尔值
◆ ◆ ◆
补充说明
1、urllib 模块适合小规模数据交互或轻量级爬虫项目。
2、对于更复杂的请求(如会话管理、Cookie、自动跳转等),推荐使用第三方库 requests。
3、urllib 默认以 utf-8 编码处理字符串,遇到乱码建议检查 response.headers 的字符集声明。
4、urlopen 默认是 GET 请求,若传入 data 参数则为 POST。
5、响应对象的 .read() 方法返回的是 bytes 类型内容,需手动 .decode()。
“点赞有美意,赞赏是鼓励”