Во-первых, вот что я пытаюсь сделать:Как получить доступ к трубопроводной пула базы данных в Scrapy паук
У меня есть XMLFeedSpider, который проходит через список продуктов (в узлах) в файле XML и создает элементы которые сохраняются в моей базе данных в конвейере. В первый раз, когда я вижу продукт, мне нужно создавать запросы, чтобы сделать некоторые выскабливания в поле URL-адреса продукта для получения изображений и т. Д. При последующих чтениях фида, если я вижу один и тот же продукт, я не хочу тратить время/ресурсы делают это и просто хотят пропустить эти дополнительные запросы. Чтобы узнать, какие продукты пропустить, мне нужно получить доступ к моей базе данных, чтобы узнать, существует ли продукт.
Вот несколько способов я мог думать, чтобы сделать это:
- Просто создайте запрос БД для каждого продукта в паука. Это кажется плохой идеей.
- В конвейере хранилища я уже создаю пул базы данных следующим образом:
dbpool = adbapi.ConnectionPool('psycopg2', cp_max=2, cp_min=1, **dbargs)
и было бы более эффективно использовать это, чтобы я не постоянно создавал новые подключения к базе данных. Я не знаю, как получить доступ к конкретизированному классу конвейера, хотя в моем паук (это, вероятно, более общий вопрос python).
Примечание: этот парень в основном задает этот же вопрос, но на самом деле не получил ответ, который искал. How to get the pipeline object in Scrapy spider - Возможно, перед запуском сканировать все URL-адреса продукта в память, чтобы я мог сравнивать их при обработке продуктов? Где было бы хорошим местом для этого?
- Другое предложение?
Update: это мой трубопровод с дб бассейном
class PostgresStorePipeline(object):
"""A pipeline to store the item in a MySQL database.
This implementation uses Twisted's asynchronous database API.
"""
def __init__(self, dbpool):
print "Opening connection pool..."
dispatcher.connect(self.spider_closed, signals.spider_closed)
self.dbpool = dbpool
@classmethod
def from_settings(cls, settings):
dbargs = dict(
host=settings['MYSQL_HOST'],
database=settings['MYSQL_DBNAME'],
user=settings['MYSQL_USER'],
password=settings['MYSQL_PASSWD'],
#charset='utf8',
#use_unicode=True,
)
dbpool = adbapi.ConnectionPool('psycopg2', cp_max=2, cp_min=1, **dbargs)
return cls(dbpool)
для предметов, которые вы имеете в виду подписи? – eLRuLL
не URL-адреса, я думаю, правильная терминология будет «узлами» xml. я вижу, как говорящие вещи сбивают с толку. есть один xml-файл и в нем много узлов, каждый из которых я сохраняю как элемент. Я обновлю вопрос, чтобы сделать это более ясным: – jeffjv
да, но вы хотите избежать ссылок на эти узлы правильно? делать несколько запросов на один и тот же URL-адрес для будущих заданий. – eLRuLL