Python 重复请求发送到scrapy FormRequest

Python 重复请求发送到scrapy FormRequest,python,scrapy,python-requests,Python,Scrapy,Python Requests,我正在努力学习scrapyFormRequest如何在网站上工作,我有以下scrapy代码: import scrapy import json from scrapy.utils.response import open_in_browser class Test(scrapy.Spider): name = 'go2' def start_requests(self): url = 'http://www.webscrapingfordatascience.

我正在努力学习scrapy
FormRequest
如何在网站上工作,我有以下scrapy代码:

import scrapy
import json
from scrapy.utils.response import open_in_browser

class Test(scrapy.Spider):
    name = 'go2'
    def start_requests(self):
        url = 'http://www.webscrapingfordatascience.com/jsonajax/results2.php'
        payload = {'api_code': 'C123456'}
        yield scrapy.FormRequest(url,formdata=json.dumps(payload),headers={'Content-Type': 'application/json'})
        #yield scrapy.FormRequest(url,formdata=payload) #dict opbject not allowed ?
    def parse(self,response):
        #print(response.text)
        open_in_browser(response)
我似乎无法得到正确的响应,我首先尝试使用dictionary,但它不起作用,然后我使用
请求进行测试,如下所示,我的两次尝试都有效

import requests
url = 'http://www.webscrapingfordatascience.com/jsonajax/results2.php'
payload={'api_code': 'C123456'}
res = requests.post(url, json=payload)
res2 = requests.post(url, data=json.dumps(payload))
#res3 = requests.post(url, data=payload) doesn't work
FormRequest
接受键,而不是字符串,这就是为什么
json.dumps()
抛出错误的原因。我的问题是如何让FormRequest(或任何scrapy方法)处理这个示例,即获得与请求相同的结果

我相信
res3=requests.post(url,data=payload)
FormRequest(url,formdata=payload)
是一样的,这就是它不工作的原因。

根据-dict对象是允许的

你的代码能正常工作吗

更新(不是实际的,因为问题在请求正文而不是标题中)

我使用fiddler调试代理并比较不同库发出的请求和响应

正如您所看到的,Scrapy和requests库使用不同的头发出请求。如果您需要在剪贴代码中接收有效的请求,您需要修改您的标题

更新_2

class Test(scrapy.Spider):
    name = 'go2'
    def start_requests(self):

        url = 'http://www.webscrapingfordatascience.com/jsonajax/results2.php'
        payload = {'api_code': 'C123456'}
        yield scrapy.FormRequest(url,body=json.dumps(payload))

    def parse(self,response):
        print(response.text)
        #open_in_browser(response)

这是一个常见的陷阱,为刮毛用户
FormRequest
正在从dict生成urlencoded有效负载,例如:

a = {'key1': 'value1', 'key2': 'value2'}
urlencode(a)
#Result: 'key2=value2&key1=value1'

在您的情况下,您应该使用常规的
请求
类和
body=json.dumps(您的命令)

谢谢您的尝试,但这不是正确的响应。尝试requests方法,您将看到我看到的正确方法。Scrapy an requests以不同的标题发送请求您能否提供有效的代码,以便我可以接受答案
formdata
-Scrapy将formdata负载解析为键值数据,而您的网站只需要json对象作为请求主体-它们不是我现在理解的相同代码,因为我们不使用formdata,一个简单的请求也可以这样做是的,因为没有提供formdata也不需要FormRequest