requests 比 urllib.request 更好用,因其自动封装了编码推断、会话复用、json解析、参数拼接等80%重复逻辑;urllib需手动处理urlencode、header设置、decode、cookiejar等,代码冗长易错。

requests 比 urllib.request 更好用,不是因为功能更“强”,而是它把开发者本该手动处理的 80% 重复逻辑全封装好了——比如编码自动推断、会话复用、JSON 自动解析、参数自动拼接。如果你写自动化脚本,urllib.request 会让你反复写 urllib.parse.urlencode、req.add_header、response.read().decode(),而 requests 一行 requests.get(url, params=..., headers=...) 就跑通。
发送带参数的 GET 请求时,params vs urlencode + Request
你得手动拼 URL?不,requests 的 params 参数直接接收字典,自动做 URL 编码和 ? 拼接;urllib.request 必须先调用 urllib.parse.urlencode,再手动拼到 URL 后面,稍有疏忽就出错(比如没处理中文、空格、特殊符号)。
-
requests.get("https://httpbin.org/get", params={"q": "爬虫", "page": 1})→ 自动变成https://httpbin.org/get?q=%E7%88%AC%E8%99%AB&page=1 -
urllib.request需要:url = "https://httpbin.org/get?" + urllib.parse.urlencode({"q": "爬虫", "page": 1}),再构造Request对象,漏一步就 400 或乱码 - 如果参数值是
None,requests会自动跳过;urllib.parse.urlencode会报TypeError: not a valid non-string sequence or mapping object
处理响应内容时,.text / .json() vs .read().decode() + json.loads()
requests.Response 对象自带编码推测和类型方法,urllib 返回的是原始 http.client.HTTPResponse,没有文本解码或 JSON 解析能力。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
-
r = requests.get(...); r.text直接返回 Unicode 字符串(默认按Content-Type或 BOM 推断编码) -
r.json()等价于json.loads(r.content),失败时抛JSONDecodeError,清晰可控 -
urllib.request.urlopen(...).read().decode("utf-8")—— 你得自己猜编码,utf-8错了就UnicodeDecodeError;想支持 GBK/GB2312?还得加 try/except 和 fallback 逻辑 - 遇到 gzip 响应,
requests默认自动解压;urllib需手动检查Content-Encoding并用gzip.decompress()
保持登录态和 Cookie 复用,Session vs 手动管理 http.cookiejar
自动化登录、表单提交、多步操作,本质是状态维持。requests.Session 是开箱即用的会话对象;urllib 要配 HTTPCookieProcessor + cookiejar,代码量翻倍且易出错。
-
s = requests.Session(); s.post(login_url, data=creds); s.get(profile_url)—— Cookie 自动携带 -
urllib写法:先cj = http.cookiejar.CookieJar(),再opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj)),最后所有请求都得走opener.open(req),漏一个就掉登录态 -
Session还支持连接池复用、默认 headers 继承、钩子(hooks),urllib全靠自己 patch
错误处理与调试体验,r.raise_for_status() vs 手动检查 response.status
自动化脚本最怕静默失败。requests 提供明确的异常语义;urllib 把所有 HTTP 错误都当成功响应返回,你得自己判断状态码。
-
r = requests.get(url); r.raise_for_status()—— 4xx/5xx 直接抛HTTPError,带完整错误信息 -
urllib.request.urlopen(url)即使返回 404 或 500,也不会报错,response.status得你主动读、主动 if 判断,否则脚本照常往下跑,结果错得离谱 -
requests的response对象有.request属性,能回溯原始请求(含 headers、body),调试时直接打印r.request.headers就行;urllib没这个概念
requests 把这些当作默认行为,urllib 当作可选配置——而自动化脚本恰恰最不能容忍“每次都要手动配”。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










