Хорошо, я использую Scrapy & SQLAlchemy, чтобы очистить данные и сохранить их в БД SQLite. Теперь все работает нормально, но что-то меня беспокоит, и я не могу найти ответ.
Итак, в функции process_item внутри конвейеров, каков оптимальный способ фиксации в БД. Большинство людей, кажется, делают что-то вроде этого:
def process_item(self, item, spider):
"""
session = self.Session()
#Do some stuff
try:
session.add(ItemClass)
session.commit()
except:
session.rollback()
raise
finally:
session.close()
return item
И я тоже видел это:
def close_spider(self, spider):
# We commit and save all items to DB when spider finished scraping.
try:
self.session.commit()
except:
self.session.rollback()
raise
finally:
self.session.close()
Мой основной запрос вращается вокруг метода 1. Кажется неэффективным получать сеанс каждый раз, фиксировать отдельный элемент в БД, а затем закрывать сеанс для каждого отдельного элемента. Теперь второй метод вызывает у меня и то, что он ожидает завершения процесса очистки, чтобы зафиксировать его в БД, что может вызвать проблемы в случае сбоя паука и потери всего очищенного.
Есть ли промежуточное значение, могу ли я зафиксировать каждые n элементов? Или это не имеет значения, поскольку современные БД настолько мощные, что им не нужны множественные коммиты за короткое время. В основном речь идет об оптимизации процесса фиксации, возможно, я обдумываю это.