Python爬虫POST请求日文参数编码问题求助
解决POST请求中日文参数的Shift_JIS编码问题
看起来你踩了一个常见的编码坑——直接把Shift_JIS编码后的字节传给requests的data参数,并没有达到服务器期望的格式。服务器需要的是经过URL百分号编码的Shift_JIS字节,而不是 raw 的字节流,这就是为什么你的请求不符合预期。
正确的处理流程
核心思路是两步走:先把日文字符串转成Shift_JIS编码的字节,再对这些字节做URL百分号编码(将每个字节转为%XX格式),最后组装成标准的表单格式发送。
方案一:简洁版(利用urllib.parse.urlencode自动处理)
urlencode支持指定编码格式,它会自动帮你完成「字符串转Shift_JIS字节 → URL百分号编码」的流程:
import requests from urllib.parse import urlencode # 假设你的参数是字典形式 params = {"area": "東京都"} # 用Shift_JIS编码并自动完成URL百分号编码 encoded_data = urlencode(params, encoding="Shift_JIS") # 必须在请求头指定字符集,让服务器知道用Shift_JIS解析 headers = { "Content-Type": "application/x-www-form-urlencoded; charset=Shift_JIS", # 这里添加你需要的其他请求头,比如User-Agent等 } # 发送POST请求 response = requests.post(self.url, data=encoded_data, headers=headers)
方案二:手动控制每一步(适合需要自定义处理的场景)
如果你想更清晰地控制编码过程,可以拆分步骤:
import requests from urllib.parse import quote_from_bytes def encode_shiftjis_param(value): # 第一步:把日文字符串转成Shift_JIS字节 shiftjis_bytes = value.encode("Shift_JIS") # 第二步:对字节做URL百分号编码 return quote_from_bytes(shiftjis_bytes) # 处理参数 params = {"area": "千代田区"} encoded_params = {k: encode_shiftjis_param(v) for k, v in params.items()} # 组装成表单字符串 encoded_data = "&".join([f"{k}={v}" for k, v in encoded_params.items()]) # 同样需要指定Content-Type charset headers = { "Content-Type": "application/x-www-form-urlencoded; charset=Shift_JIS", # 其他请求头... } response = requests.post(self.url, data=encoded_data, headers=headers)
为什么你的原方法不对?
你之前的代码data=self.param.encode(encoding='Shift_JIS')存在两个问题:
- 如果
self.param是字符串,直接编码后得到的是Shift_JIS字节流,但服务器期望的是key=value的表单格式,且value是经过URL编码的,raw字节流无法被正确解析。 - 如果
self.param是字典,字典本身没有encode方法,会直接报错——推测你可能是把参数拼接成字符串后再编码,但这样依然缺少URL百分号编码的步骤,导致服务器收到的参数格式错误。
用上面的方案测试,输入「東京都」会得到area=%93%8C%8B%9E%93s,输入「千代田区」会得到area=%90%E7%91%E3%93c%8B%E6,完全符合你给出的正确示例。
内容的提问来源于stack exchange,提问作者Vũ Minh Vương
相关产品推荐
相关产品推荐

