Scrapy使用POST方法请求报TypeError参数错误问题咨询
报错根因
scrapy.FormRequest构造方法不存在data关键字参数,参数名使用错误是触发该TypeError: __init__() got an unexpected keyword argument 'data'的直接原因。
注意:data是Python第三方requests库的POST请求传参关键字,Scrapy的请求类不使用该参数名,不要混淆两个库的接口规则。
可行修复方案
你可以根据自己的编码习惯二选一即可:
- 方案1:继续使用
scrapy.FormRequest提交表单FormRequest要求表单数据通过formdata关键字传入,且参数类型必须为字典,不能直接传入拼接好的urlencoded字符串。你可以先把现有payload字符串解析为字典再传入:- 头部新增导入:
from urllib.parse import parse_qs- 把payload字符串转为符合要求的字典格式:
form_data = {k: v[0] for k, v in parse_qs(self.payload).items()}- 修改
start_requests方法中的请求构造逻辑,FormRequest默认使用POST方法,无需手动指定method参数:
def start_requests(self): yield scrapy.FormRequest( url=self.url, formdata=form_data, headers=self.headers, callback=self.parse, ) - 方案2:直接传入已拼接好的payload字符串
如果你不想做字符串转字典的操作,直接放弃FormRequest,改用基础的scrapy.Request类,把payload作为请求体通过body参数传入即可:def start_requests(self): yield scrapy.Request( url=self.url, method='POST', body=self.payload, headers=self.headers, callback=self.parse, )
其他代码问题修正
你当前parse方法中的XPath写法有误:response.xpath('table')只会匹配响应根节点下的直接子table标签,实际网页内容都嵌套在<html>节点层级下,该表达式无法抓取到目标表格,需要改为response.xpath('//table')来匹配页面内所有表格节点。
另外你代码中导入的Request、Selector两个对象全程未使用,可以删除这两行无效导入减少代码冗余。
内容的提问来源于stack exchange,提问作者Amen Aziz
相关产品推荐
相关产品推荐

