Scrapy FormRequest 无法将复杂的字典作为 formdata 处理

Cho*_*uri 1 python form-data scrapy web-scraping scrapy-shell

我正在尝试向 scrapy.FormRequest 对象提供表单数据。formdata 是以下结构的字典:

{
  "param1": [
    {
      "paramA": "valueA",
      "paramB": "valueB"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

通过相当于以下代码,在scrapy shell中运行:

from scrapy import FormRequest

url = 'www.example.com'
method_post = 'POST'
formdata = <the above dict>

fr = FormRequest(url=url, method=method_post, formdata=formdata)

fetch(fr)
Run Code Online (Sandbox Code Playgroud)

作为回应,我收到以下错误:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Users/chhk/.local/share/virtualenvs/project/lib/python3.6/site-packages/scrapy/http/request/form.py", line 31, in __init__
    querystr = _urlencode(items, self.encoding)
  File "/Users/chhk/.local/share/virtualenvs/project/lib/python3.6/site-packages/scrapy/http/request/form.py", line 66, in _urlencode
    for k, vs in seq
  File "/Users/chhk/.local/share/virtualenvs/project/lib/python3.6/site-packages/scrapy/http/request/form.py", line 67, in <listcomp>
    for v in (vs if is_listlike(vs) else [vs])]
  File "/Users/chhk/.local/share/virtualenvs/project/lib/python3.6/site-packages/scrapy/utils/python.py", line 119, in to_bytes
    'object, got %s' % type(text).__name__)
TypeError: to_bytes must receive a unicode, str or bytes object, got dict
Run Code Online (Sandbox Code Playgroud)

我尝试了各种解决方案,包括整个字符串,带有各种转义字符,以及 dict 的变体以使其更令人愉快,但是消除此错误的解决方案都不适用于请求(我得到 400回复)。

我知道 formdata 和我正在做的其他一切都是正确的,因为我已经在 curl 中成功复制了它(formdata 是通过 提供的-d formdata.txt)。

有没有办法解决 FormRequest 无法处理复杂的 dict 结构的问题?或者我错过了什么?

vez*_*hik 6

formdata您可以尝试使用body参数代替。例子:

FormRequest(url=url, method=method_post, body=json.dumps(formdata))
Run Code Online (Sandbox Code Playgroud)