重复的请求发布到scrapy FormRequest

时间:2019-08-11 18:09:40

标签: python scrapy python-requests

我正在尝试研究刮scrap的FormRequest在网站上的工作方式,我有以下刮y代码:

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)

我似乎无法得到正确的答复,我首先尝试使用字典,但是没有用,然后我按照requests进行了如下测试,两次尝试都有效。

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(或任何抓取方法)在此示例上工作,即获得与请求相同的结果。

我相信res3 = requests.post(url, data=payload)FormRequest(url,formdata=payload)相同,这就是为什么它不起作用的原因。

2 个答案:

答案 0 :(得分:1)

根据scrapy docs-允许使用dict对象。

您的代码有效 code OK

更新(由于问题不在请求正文中而不在标头中,因此并不实际)

我使用提琴手调试代理,比较不同库的请求和响应。
requests scrapy
如您所见,Scrapy和请求库使用不同的标头发出请求。如果您需要使用有效代码接收有效请求-您需要修改标头。

UPDATE_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)

答案 1 :(得分:0)

这是抓狂用户的常见陷阱。 FormRequest正在根据dict形成urlencoded有效负载,例如:

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

在您的情况下,应将常规Request类与body=json.dumps(your_dict)一起使用