Python urllib发送GET请求的两种实现是否等效?具体差异有哪些?
两种urllib请求实现的差异说明
首先明确结论:二者完全不等效,核心差异是请求方法和参数传递位置完全不同,具体区别如下:
1. 核心请求逻辑差异
- 第一种实现是标准GET请求
你把参数直接拼接在URL的查询字符串(?后面的部分)里,调用urlopen时没有传入data参数,urllib默认使用GET方法发送请求,参数会完全暴露在请求URL中,服务端需要从URL query字段里读取参数。
对应运行时的请求特征:- 请求方法:
GET - 参数位置:URL末尾的查询字符串
- 请求方法:
- 第二种实现实际是POST请求
你在构造urllib.request.Request对象时传入了非空的data参数,urllib会自动将请求方法修改为POST,你传入的参数会被放在HTTP请求体中传输,不会出现在URL里。如果服务端的login-index接口只支持GET方式接收参数,这个请求会直接报错,服务端无法读取到a/b/c三个参数。
对应运行时的请求特征:- 请求方法:
POST - 参数位置:HTTP请求体
- 请求方法:
2. 其他功能差异
- 第一种实现灵活性低,无法自定义请求头(比如UA、Cookie、Referer等常见头字段),只能发送最基础的GET请求。
- 第二种如果调整为正确的GET写法(移除
data参数,把编码后的参数拼到URL上),可以通过req.add_header()方法自定义任意请求头,适配更多反爬、鉴权场景。
补充:如果要使用Request对象实现和第一种完全一致的GET请求,正确写法如下
import urllib.request from urllib.parse import urlencode loginurl = "https://myloginserver.com/login-index" # 用字典存参数,urlencode自动处理编码,避免中文/特殊字符乱码 params = {"a":"a", "b":"b", "c":"c"} # 拼接完整URL full_loginurl = f"{loginurl}?{urlencode(params)}" # 构造Request对象时不传data参数,默认是GET请求 req = urllib.request.Request(full_loginurl) # 可以自由加请求头,比如: # req.add_header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36") resp = urllib.request.urlopen(req, context=ctx) xmlprelogin = resp.read()
内容的提问来源于stack exchange,提问作者Zohar81
相关产品推荐
相关产品推荐

