Scrapy FormRequest не может обрабатывать сложные диктовки как данные формы

Я пытаюсь предоставить данные формы объекту scrapy.FormRequest. Formdata представляет собой dict следующей структуры:

{
  "param1": [
    {
      "paramA": "valueA",
      "paramB": "valueB"
    }
  ]
}

через эквивалент следующего кода, запустите в оболочке scrapy:

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)

а в ответ получаю следующую ошибку:

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

Я пробовал множество решений, в том числе все это в виде строки с различными escape-символами и вариациями в словаре, чтобы сделать его более приемлемым, но ни одно из решений, устраняющих эту ошибку, не работает для запроса (я получаю 400 отклик).

Я знаю, что данные формы и все остальное, что я делаю, правильно, поскольку я успешно воспроизвел их в curl (данные формы были предоставлены через -d formdata.txt).

Есть ли способ обойти неспособность FormRequest работать со сложными структурами dict? Или я что-то упускаю?


person Chor Hatara Hud'u Keturi    schedule 09.04.2019    source источник


Ответы (1)


Вместо formdata можно попробовать использовать параметр body. Пример:

FormRequest(url=url, method=method_post, body=json.dumps(formdata))
person vezunchik    schedule 09.04.2019
comment
Ты гений и сделал мой день намного лучше. Кроме того, как я могу узнать больше о размещении данных формы в теле? Я никогда не слышал об этом. - person Chor Hatara Hud'u Keturi; 09.04.2019
comment
FormRequest наследуется от Request (https://github.com/scrapy/scrapy/blob/master/scrapy/http/request/form.py#L20), поэтому он может использовать те же поля, что и родительский: docs.scrapy.org/en/latest/topics/ - person vezunchik; 09.04.2019
comment
Спасибо. Я посмотрю на это. - person Chor Hatara Hud'u Keturi; 10.04.2019