#python #web-scraping #scrapy #form-data #scrapy-shell
#python #соскабливание полотна #шершавый #форма-данные #scrapy-shell #веб-очистка #scrapy
Вопрос:
Я пытаюсь предоставить formdata объекту scrapy.FormRequest. Formdata — это диктант следующей структуры:
{
"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-символами и вариациями dict, чтобы сделать его более удобным, но ни одно из решений, которые устраняют эту ошибку, не работает для запроса (я получаю ответ 400).
Я знаю, что formdata и что все остальное, что я делаю, является правильным, поскольку я успешно воспроизвел его в curl (formdata был предоставлен через -d formdata.txt
).
Есть ли способ обойти неспособность FormRequest работать со сложными структурами dict? Или я что-то упускаю?
Ответ №1:
Вместо formdata
вы можете попробовать использовать body
параметр. Пример:
FormRequest(url=url, method=method_post, body=json.dumps(formdata))
Комментарии:
1. Ты гений и сделал мой день намного лучше. Кроме того, как я могу узнать больше о размещении formdata в теле? Я никогда не слышал об этом.
2.
FormRequest
наследуется отRequest
( github.com/scrapy/scrapy/blob/master/scrapy/http/request /… ), поэтому он может использовать те же поля, что и parent: docs.scrapy.org/en/latest/topics /…3. Спасибо. Я посмотрю на это.