Python 无法使用scrapy从json解析不同的ID,而我使用请求获得了成功
我试图使用scrapy解析来自某个json响应的不同ID,但我无法做到这一点,因为我使用requests模块获得了成功。我正在尝试获取与此不同的ID。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?标题似乎有问题 我通过浏览器打开,看到
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()