Где я должен привязать соединение db/redis к scrapy?

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


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

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

Итак, как лучше это сделать?

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

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

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

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


person Simba    schedule 10.07.2020    source источник
comment
Всегда для подключения к любой сети предпочтение отдается сетевому пулу или пулу соединений, поскольку вы можете использовать несколько соединений одновременно.   -  person bigbounty    schedule 13.07.2020


Ответы (2)


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

введите здесь описание изображения

Пауки

Пауки — это настраиваемые классы, написанные пользователями Scrapy для анализа ответов и извлечения из них элементов (также известных как очищенные элементы) или дополнительных URL-адресов (запросов), которым нужно следовать. Каждый паук может обрабатывать определенный домен (или группу доменов).

Конвейер элементов

Конвейер элементов отвечает за обработку элементов после их извлечения (или очистки) пауками. Типичные задачи включают очистку, проверку и сохранение (например, сохранение элемента в базе данных).

Когда вы понимаете приведенную выше архитектурную диаграмму, классы Scraper используются для очистки веб-сайта, а классы конвейера элементов используются для обработки элементов (вычищенных запросов).

Здесь есть 2 сценария:

  1. Когда вы получаете URL-адреса из любой базы данных

Здесь, чтобы парсить веб-сайты, вам нужны URL-адреса веб-сайта. Если эти URL-адреса хранятся в какой-либо базе данных, лучше связать объекты подключения к базе данных с классами парсера, чтобы их можно было извлекать динамически.

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

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

Обе привязки соединений к базе данных с классом Scraper и классом Pipeline верны в зависимости от сценария.

Вопрос 2:

Пул соединений redis/db предпочтительнее?

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

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

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

person bigbounty    schedule 14.07.2020
comment
Спасибо за помощь. Но я уже прочитал весь документ по скраппингу, и ответ не объясняет, как скрап работает асинхронно. Как говорится в документе, ItemPipeline запускается параллельно. Как? Существуют ли повторяющиеся экземпляры ItemPipeline, работающие в потоках. (Я заметил, что FilesPipeline использует отложенный поток для сохранения файлов в s3). Или есть только один экземпляр каждого конвейера, и он выполняется в основном цикле событий. Если это более поздний случай, пул соединений, похоже, не помогает. Потому что, когда вы используете соединение Redis, оно блокируется. - person Simba; 14.07.2020
comment
@Simba Как я понимаю, ваш вопрос состоял из 3 вопросов. Куда привязать БД? Работают ли itemPipelines параллельно? пул соединений redis/db предпочтительнее? кажется я ответил на 2 вопроса - person bigbounty; 14.07.2020
comment
Извините, что испортил слишком много вопросов. Я думаю, что я действительно хочу знать, как асинхронно работает скрап, а точнее, как работает часть ItemPipeline. Судя по заголовку вопроса, вы правильно на него ответили. Я приму ответ и начну новый вопрос о том, что такое конвейер. - person Simba; 14.07.2020

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

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

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

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

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

person renatodvc    schedule 11.07.2020
comment
Спасибо за вашу помощь. Я думаю, что меня действительно смутило, так это то, как ItemPipelines работают параллельно, как говорится в документе. Он все еще работает в цикле событий или запускается в потоке? Кроме того, я видел, как RedisSpider класс из пакета scrapy-redis привязывал Redis Conn к пауку. Если паук и itempipeline запускаются в одном и том же цикле событий, а itempipeline инициализируется один раз, я не думаю, что пул соединений чем-то поможет. Потому что, когда вы используете Redis, процесс блокируется. - person Simba; 14.07.2020