Scrapy FormRequest 发送 JSON

Posted

技术标签:

【中文标题】Scrapy FormRequest 发送 JSON【英文标题】:Scrapy FormRequest sending JSON 【发布时间】:2012-06-29 12:00:31 【问题描述】:

我正在尝试创建一个可以发送 content-type:application/json 的 FormRequest。

这是我的尝试:

yield FormRequest("abc.someurl.com", formdata=json.dumps("referenceId":123,"referenceType":456), headers='content-type':'application/json', callback=self.parseResult2)

如果我使用json.dumps()处理formdata=中的表单数据,我得到的错误是

"exceptions.ValueError: 需要超过 1 个值才能解压"

我不能只使用列表中的

formdata="referenceId":123,"referenceType":456 

FormRequest 有效,但未被服务器接受。

import requests
import json
result = requests.post(url, json.dumps("referenceId":123,"referenceType":456), headers='content-type':'application/json')

它可以在上面的 python 命令提示符下工作。

有什么想法吗?

-公里

【问题讨论】:

什么是整个堆栈跟踪(错误)? 【参考方案1】:
from scrapy.http import JsonRequest

class TestSpider(scrapy.Spider):
    def start_requests(self):
        data = 
            'name1': 'value1',
            'name2': 'value2',
        
        yield JsonRequest(url='http://www.example.com/post/action', data=data)

查看更多:docs.scrapy.org#jsonrequest

【讨论】:

但是调用JsonRequest后如何得到响应? 尝试使用return JsonRequest【参考方案2】:

你可以使用下面的 sn-p 来获得响应:

res =requests.post(url, json=data) 打印(res.text)

【讨论】:

Requests 是另一个模块,OP 正在为 Scrapy 寻求解决方案。【参考方案3】:

FormRequest 用于模拟 html 表单(例如 application/x-www-form-urlencoded)。听起来你只是想用你的请求发布数据。由于您提到了“应用程序/json”的内容类型,您可能想要执行以下操作:

request = Request( url, method='POST', 
                   body=json.dumps(my_data), 
                   headers='Content-Type':'application/json' )

【讨论】:

以上是关于Scrapy FormRequest 发送 JSON的主要内容,如果未能解决你的问题,请参考以下文章

python爬虫scrapy入门8:发送POST请求

python爬虫scrapy入门8:发送POST请求

Scrapy和Requests的post请求详解

FormRequest和FormRequest.from_response的区别

scrapy formRequest 表单提交

Scrapy:FormRequest 不会自动填充 ASP.net 隐藏字段