0

我想使用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?我以为我可以将它插入到产品类中,但我不能包含发送方法......

4

2 回答 2

2

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

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

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

于 2019-08-10T02:18:39.563 回答
1

@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实际上比这更容易使用......

于 2019-08-10T05:51:38.193 回答