Python爬虫中Request Payload与Form Data的区别及处理
本文解析Python爬虫中Request Payload与Form Data在Content-Type上的核心差异,指出Scrapy的FormRequest仅支持Form Data。针对Request Payload场景,提供通过Jsoup发送JSON字符串或Map参数的具体代码实现,并强调动态获取变化参数的重要性,帮助开发者解决POST请求参数传递问题。
Request Payload与Form Data的核心区别
在Web请求中,Request Payload与Form Data的主要区别体现在请求头部的Content-Type字段上。
Content-Type Form Data
Post表单请求
代码示例与Scrapy限制
代码示例
headers = {
"Content-Type": "application/x-www-form-urlencoded"
}
requests.post(url, data=data, headers=headers)
Request Payload
传递json数据
headers = {
"Content-Type": "application/json"
}
requests.post(url, data=json.dumps(data), headers=headers)
Scrapy的FormRequest组件仅支持Form Data形式的表单提交,其源码中Content-Type被固定为application/x-www-form-urlencoded。
Request Payload数据的传递方法
补充知识:如何传递Request PayLoad(请求负载)中的数据?
在进行爬虫开发时,分析网络请求可能会遇到如下类型的参数格式:
其底层原理尚不明确,待进一步研究后补充。此处仅记录实际应用方法。
用法:
根据上述图片,由于是POST请求,参数通常以key-value形式的JSON字符串传递,或者将参数放入Map结构中。我们可以观察到多个name字段,这些name即为key,其下方的数据为value。提取所有key和value,组成JSON字符串或Map进行传递即可。
例如,上述数据可提取为如下格式:
{"view:id1:txtSearch":"","$$viewid":"!f9fpyhcv2t!","$$xspsubmitid":"view:_id1:_id2:pager1_Group_lnk_2","$$xspexecid":"view:_id1:_id2:parent","$$xspsubmitvalue":"","$$xspsubmitscroll":"0|0","view:_id1":"view:_id1"}
或者:
Map<String,String> m = new HashMap<String,String>();
m.put("view:id1:txtSearch", "");
m.put("$$viewid", "!f9fpyhcv2t!");
m.put("$$xspsubmitid", "view:_id1:_id2:pager1_Group_lnk_2");
m.put("$$xspexecid", "view:_id1:_id2:parent");
m.put("$$xspsubmitvalue", "");
m.put("$$xspsubmitscroll", "0|0");
m.put("view:_id1", "view:_id1");
由于我使用Jsoup发起请求,因此可以通过以下方式传递参数:
Jsoup.connect("").data(m).cookies(null).method(Method.POST);
或者:
Connection conn = Jsoup.connect("");
String requestJson = "{\"view:id1:txtSearch\":\"\",\"$$viewid\":\"!f9fpyhcv2t!\",\"$$xspsubmitid\":\"view:_id1:_id2:pager1_Group_lnk_2\",\"$$xspexecid\":\"view:_id1:_id2:parent\",\"$$xspsubmitvalue\":\"\",\"$$xspsubmitscroll\":\"0|0\",\"view:_id1\":\"view:_id1\"}";
conn.requestBody(requestJson);
conn.cookies(null).method(Method.POST);
conn.execute();
具体参数需根据实际请求情况进行填写。
操作是否非常简单。
需注意一点,请求负载中的value值未必是固定的。若每次请求该值都会变化,则必须分析该值的来源,动态获取后发送请求,否则请求可能无法正确执行。
以上关于Python爬虫中Request Payload与Form Data区别及处理方法的说明即为全部内容,希望能对读者有所帮助,也欢迎大家继续支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













