scrapy 从多个网站丰富零碎项目

cgyqldqp  于 2023-01-02  发布在  其他
关注(0)|答案(1)|浏览(185)

我用python scrapy framework实现了以下场景:

class MyCustomSpider(scrapy.Spider):
    def __init__(self, name=None, **kwargs):
        super().__init__(name, **kwargs)
        self.days = getattr(self, 'days', None)

    def start_requests(self):
        start_url = f'https://some.url?days={self.days}&format=json'
        yield scrapy.Request(url=start_url, callback=self.parse)

    def parse(self, response):
        json_data = response.json() if response and response.status == 200 else None
        if json_data:
            for entry in json_data['entries']:
            yield self.parse_json_entry(entry)
        
            if 'next' in json_data and json_data['next'] != "":
                yield response.follow(f"https://some.url?days={self.days}&time={self.time}&format=json", self.parse)

    def parse_json_entry(self, entry):
        ...
        item = loader.load_item()
        return item

我在一个管道中将解析过的项upsert到数据库中。我想添加以下功能:
1.在upserting项目我想读取它的当前形状从数据库
1.如果该条目不存在于数据库中,或者它存在,但有一些字段为空,我需要调用另一个网站(准确的网址是根据条目的内容建立的),废弃它的内容,丰富我的条目的基础上,这额外的阅读,然后才保存到数据库中的项目。我希望有这个调用也涵盖了scrappy框架,以缓存和其他便利
1.如果项目确实存在于数据库中,并且已填充了适当的字段,则只需根据当前读取的数据更新项目的状态
如何以类似scrapy的方式实现第2点?现在我在废弃项目后,只在一个管道中执行对另一个网站的调用,但这样我就不会使用scrapy来做这件事了。有没有什么聪明的方法来做这件事(可能使用管道),或者更确切地说,我应该把所有的代码放在一个蜘蛛中,所有的数据库读取/检查和回调都在那里?
最好的问候!

3vpjnl9f

3vpjnl9f1#

我想最好的办法是在一个spider/pipeline中插入部分数据,用某个标志说明它仍然需要调整,然后在另一个spider中加载数据,并打开标志,执行额外的读取。

相关问题