You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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字符串解析为字典再传入:
    1. 头部新增导入:
    from urllib.parse import parse_qs
    
    1. 把payload字符串转为符合要求的字典格式:
    form_data = {k: v[0] for k, v in parse_qs(self.payload).items()}
    
    1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 16:09:20