scrapy json将所有项目输出在一行上

2024-02-25

我试图让我的输出看起来像下面的 json 格式。

{"loser": "De Schepper K." ,"winner": "Herbert P.", "url":
"https://www.sofascore.com/tennis/2018-02-07"}

但我目前正在为每个失败者项目和获胜者项目获取单独的行。我希望获胜者和失败者都与网址位于同一行。

{"loser": "De Schepper K.", "url": 
"https://www.sofascore.com/tennis/2018-02-07"}
{"winner": "Herbert P.", "url": 
"https://www.sofascore.com/tennis/2018-02-07"}
{"loser": "Sugita Y.", "url": 
 "https://www.sofascore.com/tennis/2018-02-07"}

我不确定是否是我的选择器导致了这种行为,但我想知道如何自定义管道,以便失败者、获胜者和日期都在同一 json 行上

我以前从未提取过 json 格式,所以它对我来说是新的。 如何使用自定义管道指定每行上的 json 键和值?

我还尝试使用 csv 项目导出器来执行此操作,并且也出现了奇怪的行为。参考Scrapy 输出每列显示空行 https://stackoverflow.com/questions/48797819/scrapy-output-is-showing-empty-rows-per-column

这是我的蜘蛛.py

import scrapy
from scrapy_splash import SplashRequest
from scrapejs.items import SofascoreItemLoader
from scrapy import Spider

import json
from scrapy.http import Request, FormRequest

    class MySpider(scrapy.Spider):
    name = "jsscraper"

    start_urls = ["https://www.sofascore.com/tennis/2018-02-07"]


    def start_requests(self):
        for url in self.start_urls:
            yield SplashRequest(url=url,
                            callback=self.parse,
                            endpoint='render.html',
                            args={'wait': 1.5})



    def parse(self, response):
            for row in response.css('.event-team'):
                    il = SofascoreItemLoader(selector=row)
                    il.add_css('winner' , '.event-team:nth-
                      child(2)::text')
                    il.add_css('loser' , '.event-team:nth-
                    child(1)::text')
                    il.add_value('url', response.url)

                    yield il.load_item()

items.py

import scrapy

from scrapy.loader import ItemLoader
from scrapy.loader.processors import TakeFirst, MapCompose
from operator import methodcaller
from scrapy import Spider, Request, Selector

class SofascoreItem(scrapy.Item):
    loser = scrapy.Field()
    winner = scrapy.Field()
    url = scrapy.Field()



class SofascoreItemLoader(ItemLoader):
    default_item_class = SofascoreItem
    default_input_processor = MapCompose(methodcaller('strip'))
    default_output_processor = TakeFirst()

管道.py

import json
import codecs
from collections import OrderedDict

class JsonPipeline(object):

    def __init__(self):
        self.file = codecs.open('data_utf8.json' , 'w' , 
        encoding='utf-8')

    def process_item(self , item , spider):
        line = json.dumps(OrderedDict(item) , ensure_ascii=False , 
        sort_keys=False) + "\n"
        self.file.write(line)
        return item

    def close_spider(self , spider):
        self.file.close()

这里的问题是你正在循环.event-team元素。
这些元素中的一个只能是赢家或输家,因此您会为每个元素获得一个项目。

你应该做的是循环包含两个 (.list-event似乎是一个不错的候选人),并从中提取赢家和输家。

这样,每个事件就有一个循环,因此每个事件只有一个项目。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

scrapy json将所有项目输出在一行上 的相关文章

随机推荐