Python urllib 库入门:请求发起与参数处理详解

Leo
Leo
发布时间:2026-10-12 | 2人浏览过
原创

Python 内置的 urllib 库提供了处理 URL 和发送 HTTP 请求的标准能力。本文系统讲解 request、parse 与 error 三大核心模块,通过完整代码演示基础 GET/POST 请求发起、自定义 Header 突破简单反爬、URL 特殊字符编码、远程文件直存以及网络异常安全捕获等高频场景,助力开发者高效编写轻量级网络脚本。

urllib 库核心模块概览

urllib 是 Python 标准库的一部分,无需额外安装即可直接使用,主要用于构建和处理 Web 请求与解析 URL。它主要包含四个模块:

  • request:请求模块,负责模拟浏览器向服务器发送 HTTP 请求并获取响应。
  • parse:工具模块,提供 URL 拆分、解析、合并及参数编码解码功能。
  • error:异常处理模块,用于捕获网络断开、连接拒绝或 HTTP 状态码错误,防止程序意外中断。
  • robotparser:规则识别模块,用于解析目标网站的 robots.txt 协议,判断访问权限(实际业务中较少手动调用)。

request 模块:发起请求与下载资源

第1步:使用 urlopen 获取网页源码

urlopen() 是最基础的请求函数,默认执行 GET 请求。需要注意,该函数返回的是二进制字节流,需根据网页声明的编码格式进行解码转换。

import urllib.request

# 定义目标地址
url = 'https://www.baidu.com'

# 发送请求并获取响应对象
response = urllib.request.urlopen(url)

# 读取完整页面源码(返回 bytes 类型)
raw_bytes = response.read()

# 按 utf-8 编码解码为字符串
page_text = raw_bytes.decode('utf-8')
print(page_text[:200]) # 预览前200个字符

第2步:通过 Request 对象注入自定义 Headers

许多网站会对缺少请求头(如 User-Agent)的请求返回空内容或拦截。使用 Request 类可以封装请求参数、Headers 和数据体,实现更贴近真实浏览器的交互。

import urllib.request

url = 'https://www.baidu.com'

# 构造包含请求头的字典
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Accept-Language': 'zh-CN,zh;q=0.9'
}

# 创建 Request 对象(注意位置参数要求)
req = urllib.request.Request(url=url, headers=headers)

# 携带 Headers 发送请求
response = urllib.request.urlopen(req)
text = response.read().decode('utf-8')
print('请求成功,获取长度:', len(text))

第3步:使用 urlretrieve 一键保存文件

当需要下载网页、图片或音频等资源时,urlretrieve() 可将远程数据直接写入本地磁盘,免去手动循环读取的繁琐步骤。

import urllib.request

# 示例:下载百度首页 HTML
url = 'https://www.baidu.com'
dst_path = './baidu_home.html'
urllib.request.urlretrieve(url, dst_path)
print(f'已保存至 {dst_path}')

# 示例:下载网络图片(需确保链接为直链)
img_url = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic.win4000.com%2Fwallpaper%2Ftest.jpg&refer=http%3A%2F%2Fpic.win4000.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1670904201&t=sample'
utllib.request.urlretrieve(img_url, 'download_test.jpg')

parse 模块:URL 参数编码技巧

在拼接查询参数时,中文、空格或特殊符号会导致 ASCII 解析失败。必须使用 parse 模块进行标准化转义。

第4步:使用 quote 处理单字符编码

quote() 专门针对单一字符串或参数值进行 URL 编码,适用于手动拼接 GET 请求的场景。

import urllib.request
import urllib.parse

base_url = 'https://www.baidu.com/s?wd='
keyword = 'Python 基础教程'

# 将单个参数转为 unicode 编码格式
safe_keyword = urllib.parse.quote(keyword)
full_url = base_url + safe_keyword

# 构造请求并访问
req = urllib.request.Request(full_url, headers={'User-Agent': 'Mozilla/5.0'})
response = urllib.request.urlopen(req)
print('编码后链接:', full_url)

第5步:使用 urlencode 组装 GET/POST 参数

当参数较多时,推荐使用 urlencode() 自动处理字典到查询字符串的转换。对于 POST 请求,参数必须以字节流形式附加到 data 字段。

import urllib.request
import urllib.parse

# POST 接口示例
post_url = 'https://fanyi.baidu.com/sug'
params_dict = {'kw': '测试单词'}

# 将字典转换为编码后的查询串
encoded_str = urllib.parse.urlencode(params_dict)

# POST 请求必须将参数字符串转为 bytes,并指定 utf-8 编码
post_data = encoded_str.encode('utf-8')

req = urllib.request.Request(post_url, data=post_data, headers={'User-Agent': 'Mozilla/5.0'}, method='POST')
response = urllib.request.urlopen(req)
data = response.read().decode('utf-8')
print('POST 响应原始数据:', data[:50])

error 模块:请求异常的安全捕获

网络环境不稳定时,请求极易抛出异常。HTTPError 继承自 URLError,因此在捕获时应遵循子类在前,父类在后的原则,避免漏捕特定状态码错误。

import urllib.request
import urllib.error

test_urls = ['https://www.baidu.com', 'https://httpbin.org/status/404', 'http://invalid-domain.test']

for target in test_urls:
    try:
        req = urllib.request.Request(target, headers={'User-Agent': 'Mozilla/5.0'})
        response = urllib.request.urlopen(req)
        print(f'{target} 请求成功,状态码: {response.getcode()}')
    except urllib.error.HTTPError as e:
        # 优先捕获 HTTP 状态码错误(如 404, 500)
        print(f'HTTP 错误: {target} -> 状态码 {e.code}, 原因: {e.reason}')
    except urllib.error.URLError as e:
        # 捕获 DNS 解析失败、连接超时等底层网络错误
        print(f'网络错误: {target} -> 原因: {e.reason}')
    except Exception as e:
        print(f'未知异常: {e}

总结

掌握 urllib 的模块化组合,能够覆盖绝大多数轻量级数据采集与接口联调需求。配合正确的编码策略与异常重试机制,可显著提升脚本的稳定性。以上就是 Python urllib 库入门的详细教程,更多关于 Python 网络请求与数据抓取的实战技巧请持续关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表