我用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来做这件事了。有没有什么聪明的方法来做这件事(可能使用管道),或者更确切地说,我应该把所有的代码放在一个蜘蛛中,所有的数据库读取/检查和回调都在那里?
最好的问候!
1条答案
按热度按时间3vpjnl9f1#
我想最好的办法是在一个spider/pipeline中插入部分数据,用某个标志说明它仍然需要调整,然后在另一个spider中加载数据,并打开标志,执行额外的读取。