如何使用Python Mechanize直接向指定URL发送POST请求?
如何使用Python Mechanize直接向指定URL发送POST请求?
嘿,我完全懂你现在的困扰——想用Python Mechanize搞定这个POST请求,结果碰上个400错误,换成Requests虽然能成,但又不想手动去管cookie、referrer这些会话细节,对吧?
咱们先聊聊问题出在哪:你直接用br.open(url, data=json.dumps(j))的时候,Mechanize默认会把传入的data当成表单数据来处理,自动给请求加上application/x-www-form-urlencoded的Content-Type头,可服务器需要的是JSON格式的数据,这就导致服务器识别不了你的请求,直接返回400错误了。
别担心,咱们只需要手动构造一个Request对象,指定正确的请求头和编码方式,就能让Mechanize按我们的要求发送JSON格式的POST请求,同时还能让它自动帮你管理会话信息,不用手动处理那些麻烦事。
给你个具体的代码示例:
import mechanize import json # 初始化browser实例 br = mechanize.Browser() # 构造你的JSON数据(假设j是已经准备好的字典) j = {"key1": "value1", "key2": "value2"} # 替换成你的实际数据 # 手动创建Request对象,指定URL、编码后的JSON数据和正确的请求头 req = mechanize.Request( url='https://major-retailer.com/api/client/experience/v1/load', data=json.dumps(j).encode('utf-8'), # 必须把JSON字符串编码成字节 headers={'Content-Type': 'application/json'} # 告诉服务器我们发的是JSON ) # 发送请求 r = br.open(req) # 后续可以正常处理响应,比如读取内容 response_content = r.read() print(response_content)
解释一下关键步骤:
- 我们把JSON字符串用
encode('utf-8')转换成字节流,因为Mechanize的Request需要字节类型的数据 - 通过
headers参数指定Content-Type: application/json,让服务器知道这是JSON格式的请求体 - 用
br.open(req)发送这个自定义的Request,Mechanize会自动处理会话相关的cookie、referrer这些,和你平时用它浏览网页一样
这样改完之后,应该就能成功发送符合要求的POST请求,不会再碰到400错误了,而且还能继续用Mechanize的会话管理能力,不用切换到Requests去手动维护那些细节~
备注:内容来源于stack exchange,提问作者John O
相关产品推荐
相关产品推荐

