Где я должен привязать соединение db / redis к scrapy? - PullRequest
0 голосов
/ 10 июля 2020

Извините за беспокойство, ребята. Это плохой вопрос, кажется, что меня действительно смутило, так это то, как ItemPipeline работает в scrapy. Закрою и начну новый вопрос.

Где я должен привязать соединение db / redis к on scrapy, Spider или Pipeline.

В документе scrapy mon go db соединение привязано к Pipeline . Но это также может быть привязано к Spider (это также то, что делает расширение scrapy-redis). Более позднее решение дает преимущество, заключающееся в том, что паук доступен в большем количестве мест, помимо конвейера, например, в промежуточном программном обеспечении.

Итак, какой способ лучше сделать это? выполняются параллельно (это говорит do c). Означает ли это, что существует несколько экземпляров MyCustomPipeline?

Кроме того, предпочтительнее использовать пул соединений redis / db?

Мне просто не хватает опыта, чтобы принять решение. Нужна ваша помощь. Заранее спасибо.

Как сказано в do c, ItemPipeline запускается параллельно. Как? Существуют ли повторяющиеся экземпляры ItemPipeline, выполняемые в потоках. (Я заметил, что FilesPipeline использует отложенный поток для сохранения файлов в s3). Или есть только один экземпляр каждого конвейера и выполняется в основном событии l oop. В последнем случае пул соединений, похоже, не помогает. Причина, когда вы используете соединение Redis, оно заблокировано. Одновременно можно использовать только одно соединение.

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Понимание того, насколько важна здесь архитектура scrapy. Посмотрите на диаграмму ниже

enter image description here

Spiders

Spiders are custom classes written by Scrapy users to parse responses and extract items (aka scraped items) from them or additional URLs (requests) to follow. Each spider is able to handle a specific domain (or group of domains).

Item Pipeline

The Item Pipeline is responsible for processing the items once they have been extracted (or scraped) by the spiders. Typical tasks include cleansing, validation and persistence (like storing the item in a database).

When you understand the above architecture diagram, Scraper classes are used to scrape the website and item pipeline classes are used to process the items (scraped requests).

There are 2 scenarios here:

  1. When you get the urls from any database

Here, in order to scrape websites, you need urls of the website. If those urls are stored in any database then it's better to bind the database connection objects to the scraper classes so that those can be fetched dynamically.

  1. Если вы хотите обработать очищенные элементы - Сохраните данные и т. Д. c ..

Здесь вы в основном привязать объект подключения к базе данных к Item Pipeline, чтобы мы могли напрямую хранить очищенные данные в базе данных.

Как привязка подключений к базе данных к классу Scraper, так и к классу Pipeline является правильной в зависимости от сценария. 1012 * Вопрос 2:

Пул подключений redis / db является предпочтительным?

Да, пул подключений к любой базе данных всегда предпочтительнее.

пул соединений поддерживает обычно устойчивую коллекцию допустимых / открытых соединений, предположим 10. Когда приложению необходимо выполнить запрос или выполнить обновление, оно «заимствует» соединение из пула, «открывая» соединение. Когда это будет сделано, он «закрывает» соединение, которое возвращает его в пул для использования в следующем запросе. Поскольку соединение уже было открыто, никаких накладных расходов на получение соединения не требуется.

Источник: https://qr.ae/pNs8jA

1 голос
/ 11 июля 2020

Лучшей практикой было бы привязать соединение в конвейерах, чтобы следовать принципу разделения задач .

Scrapy использует ту же инфраструктуру параллелизма для выполнения запросов и обработки items, по мере того как ваш паук выдает предметы, scrapy вызовет метод process_item из экземпляра конвейера. Отметьте здесь .

Отдельный экземпляр каждого конвейера создается во время создания экземпляра паука.

Кроме того, предпочтительнее использовать пул соединений redis / db?

Извините, не думаю, что могу помочь с этим.

...