Python 无法使用scrapy从json解析不同的ID,而我使用请求获得了成功

Python 无法使用scrapy从json解析不同的ID,而我使用请求获得了成功,python,json,python-3.x,web-scraping,scrapy,Python,Json,Python 3.x,Web Scraping,Scrapy,我试图使用scrapy解析来自某个json响应的不同ID,但我无法做到这一点,因为我使用requests模块获得了成功。我正在尝试获取与此不同的ID。ID看起来像是1397099,539728e.t.c,请求版本可以完美地获取 使用请求(已成功): 使用scrapy(失败): 当我运行scrapy代码时,我得到一些不是json的响应,这就是为什么我得到这个错误json.decoder.JSONDecodeError 如何使用scrapy解析json中的ID?标题似乎有问题 我通过浏览器打开,看到

我试图使用scrapy解析来自某个json响应的不同ID,但我无法做到这一点,因为我使用requests模块获得了成功。我正在尝试获取与此不同的ID。ID看起来像是
1397099
539728
e.t.c,请求版本可以完美地获取

使用请求(已成功):

使用scrapy(失败):

当我运行scrapy代码时,我得到一些不是json的响应,这就是为什么我得到这个错误
json.decoder.JSONDecodeError


如何使用scrapy解析json中的ID?

标题似乎有问题

我通过浏览器打开,看到xml正在被返回

我修改了spider的头,以便它请求json,并按预期工作:

    headers = {
        'Accept': 'application/json, text/javascript, */*; q=0.01',
    }


    def start_requests(self):
        first_req = f'{self.start_link}{urlencode(self.payload)}'
        yield scrapy.Request(first_req, callback=self.parse, headers=self.headers)
完整代码:

import scrapy
import json
from urllib.parse import urlencode
from scrapy.crawler import CrawlerProcess


class SiemensSpider(scrapy.Spider):
    name = 'siemens'

    start_link = "https://support.industry.siemens.com/webbackend/api/ProductSupport/ProductSearch?"

    payload = {
        'language': 'en',
        'region': 'ww',
        'networks': 'Internet',
        'productNodePath': '/13204/',
        '$top': '20'
    }

    headers = {
        'Accept': 'application/json, text/javascript, */*; q=0.01',
    }


    def start_requests(self):
        first_req = f'{self.start_link}{urlencode(self.payload)}'
        yield scrapy.Request(first_req, callback=self.parse, headers=self.headers)

    def parse(self, response):
        for item in json.loads(response.text)['Products']:
            print(item['Id'])


if __name__ == "__main__":
    c = CrawlerProcess({
        'USER_AGENT': 'Mozilla/5.0 (Windows NT 6.1; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
    })
    c.crawl(SiemensSpider)
    c.start()

我设想
请求
库在默认情况下必须请求json。

我尝试过复制请求,它;有点奇怪的是,请求选择了正确的json,而scrapy没有。我没有权限访问请求的目录,即标题/cookies,但也值得尝试传递它们。尽可能多地复制rquests。
    headers = {
        'Accept': 'application/json, text/javascript, */*; q=0.01',
    }


    def start_requests(self):
        first_req = f'{self.start_link}{urlencode(self.payload)}'
        yield scrapy.Request(first_req, callback=self.parse, headers=self.headers)
import scrapy
import json
from urllib.parse import urlencode
from scrapy.crawler import CrawlerProcess


class SiemensSpider(scrapy.Spider):
    name = 'siemens'

    start_link = "https://support.industry.siemens.com/webbackend/api/ProductSupport/ProductSearch?"

    payload = {
        'language': 'en',
        'region': 'ww',
        'networks': 'Internet',
        'productNodePath': '/13204/',
        '$top': '20'
    }

    headers = {
        'Accept': 'application/json, text/javascript, */*; q=0.01',
    }


    def start_requests(self):
        first_req = f'{self.start_link}{urlencode(self.payload)}'
        yield scrapy.Request(first_req, callback=self.parse, headers=self.headers)

    def parse(self, response):
        for item in json.loads(response.text)['Products']:
            print(item['Id'])


if __name__ == "__main__":
    c = CrawlerProcess({
        'USER_AGENT': 'Mozilla/5.0 (Windows NT 6.1; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
    })
    c.crawl(SiemensSpider)
    c.start()