【问题标题】:Scrapy use item and save data in a json fileScrapy使用项目并将数据保存在json文件中
【发布时间】:2019-05-06 12:53:16
【问题描述】:

我想使用scrapy项目并操作数据并将所有内容保存在json文件中(使用像db这样的json文件)。

# Spider Class

class Spider(scrapy.Spider):
    name = 'productpage'
    start_urls = ['https://www.productpage.com']

    def parse(self, response):
        for product in response.css('article'):

            link = product.css('a::attr(href)').get()
            id = link.split('/')[-1]
            title = product.css('a > span::attr(content)').get()
            product = Product(self.name, id, title, price,'', link)
            yield scrapy.Request('{}.json'.format(link), callback=self.parse_product, meta={'product': product})

        yield scrapy.Request(url=response.url, callback=self.parse, dont_filter=True)

    def parse_product(self, response):
        product = response.meta['product']
        for size in json.loads(response.body_as_unicode()):
            product.size.append(size['name'])

        if self.storage.update(product.__dict__):
            product.send('url')


# STORAGE CLASS

class Storage:

    def __init__(self, name):
        self.name = name
        self.path = '{}.json'.format(self.name)
        self.load()  """Load json database"""

    def update(self, new_item):
        # .... do things and update data ...
        return True

# Product Class

class Product:

    def __init__(self, name, id, title, size, link):
        self.name = name
        self.id = id
        self.title = title
        self.size = []
        self.link = link

    def send(self, url):
        return  # send notify...


Spider 类在start_url 的主页中搜索产品,然后解析产品页面以捕获尺寸。 最后它会搜索self.storage.update(product.__dict__) 是否有更新,如果是真的发送通知。

如何在我的代码中实现 Item?我以为我可以将它插入到产品类中,但我不能包含发送方法...

【问题讨论】:

  • 你真的需要Item 吗?或者可能将 send() 移动到 Storage ?你只在storage.update() 之后使用send(),所以也许你应该在storage.update() 中使用send()

标签: python python-3.x web-scraping scrapy scrapy-item


【解决方案1】:

你应该定义你想要的项目。和yield解析后。

最后,运行命令: scrapy crawl [spider] -o xx.json

PS: 默认scrapy支持导出json文件。

【讨论】:

  • 赞成,因为这解决了输出到 json 的问题,但他们想使用 JSON 作为数据库,所以我推荐了 mongo,他们实际上将逻辑划分并使用项目管道删除项目进入 mongo。
【解决方案2】:

@Jadian 的答案将为您提供一个包含 JSON 的文件,但不像 db 那样访问它。为了从设计的角度正确地做到这一点,我将遵循以下说明。您不必使用 mongo,也有很多其他可用的使用 JSON 的 nosql 数据库。

在这种情况下,我建议您使用 scrapy.Item() 类正确构建项目。然后你可以使用 json.dumps 进入 mongoDB。您需要为每个项目分配一个 PK,但 mongo 基本上是一个非关系 json 存储。因此,您要做的是创建一个项目管道,该管道检查项目的 PK,如果找到它并且没有更改任何细节,则引发 DropItem() 否则将新数据更新/存储到 mongodb 中。如果您愿意,您甚至可以通过管道进入 json 导出器,但我认为将 python 对象转储到 json 到 mongo 是可行的方法,然后 mongo 会为您提供 json 以在前端使用。

我希望您理解这个答案,但我认为从设计角度来看,这将是一个更简单的解决方案,因为 mongo 基本上是一个基于 JSON 的非关系数据存储,并且您会将您的项目管道逻辑划分为自己的区域而不是用它来弄乱你的蜘蛛。

我会提供一个代码示例,但我的大多数人都使用 ORM for SQL db。 Mongo其实比这个好用……

【讨论】:

    猜你喜欢
    • 2014-02-28
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 2015-10-04
    • 2018-08-13
    相关资源
    最近更新 更多