Я сканирую все новости с первой страницы более 50 новостных сайтов ежедневно и храню их в базе данных MongoDB. Я использую новостной URL как _id
в качестве уникального идентификатора. Некоторые сайты сканируют значительно больше времени, чем другие. Чтобы ускорить процесс сканирования, мне нужно сначала пройти через базу данных go, а затем сканировать только что извлеченные URL.
Я не хочу использовать persistent support
, поскольку это не совсем то, что я ищу , Кроме того, как показано ниже, я написал дублирующий фильтр, но он помогает только в одном сеансе сканирования, и данные исчезают после каждого завершения процесса.
Вот как выглядит мой pipeline.py
:
class DuplicatesPipeline:
def __init__(self):
self.urls_seen = set()
def process_item(self, item, spider):
if item['_id'] in self.urls_seen:
raise DropItem("Duplicate item found: %s" % item)
else:
self.urls_seen.add(item['_id'])
return item
class MongoDBPipeline:
def __init__(self, mongo_uri, mongo_db):
self.mongo_uri = mongo_uri
self.mongo_db = mongo_db
@classmethod
def from_crawler(cls, crawler):
return cls(
mongo_uri=crawler.settings.get('MONGO_URI'),
mongo_db=crawler.settings.get('MONGO_DATABASE')
)
def open_spider(self, spider):
self.client = pymongo.MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db]
def close_spider(self, spider):
self.client.close()
def process_item(self, item, spider):
self.db[spider.name].insert_one(dict(item))
logging.debug("Article added to MongoDB")
return item
Сначала мне нужно извлечь URL. Затем go через базу данных _id
s, чтобы увидеть, существуют ли уже извлеченные URL-адреса, и только после этого я могу начать сканирование.
Есть ли более простой способ сделать это? Если нет, то как я могу это реализовать?