Невозможно интегрировать asyncio и ScrapyPython

Программы на Python
Ответить
Anonymous
 Невозможно интегрировать asyncio и Scrapy

Сообщение Anonymous »

У меня есть приложение FastAPI + TaskIQ + Scrapy.
Когда я вызываю определенную конечную точку, вызывается задача, которая запускает паука. Я использую Motor в качестве движка БД, поэтому хочу, чтобы Scrapy был совместим с asyncio. Я в точности следовал документации по Scrapy.
Когда мой паук запускается, мой Scrappy.settings.TWISTED_REACTOR имеет вид 'twisted.internet.asyncioreactor.AsyncioSelectorReactor' > и сам витой реактор принадлежит к тому же классу.
Мои приложения FastAPI и TaskIQ инициализируются следующим образом:
from fastapi import FastAPI
from scrapy.utils.reactor import install_reactor

from myproject.broker import broker

...
@asynccontextmanager
async def lifespan(_):
if not broker.is_worker_process:
await broker.startup()
else:
install_reactor('twisted.internet.asyncioreactor.AsyncioSelectorReactor')
yield
if not broker.is_worker_process:
await broker.shutdown()
...

Вы можете видеть, что только рабочий устанавливает реактор, и что это делается при загрузке.
Моя конечная точка просто публикует сообщение брокер, который затем обрабатывается TaskiQ
@broker.task
async def run_spider() -> None:
await maybe_deferred_to_future(crawler_runner.crawl(DummySpider))

Мой паук
import logging

from scrapy import Spider, Request, settings

from myproject.scrapers import settings
from myproject.scrapers.items.generic import GenericItem

LOGGER = logging.getLogger("uvicorn")

class DummySpider(Spider):
name = 'DummySpider'

def start_requests(self) -> Request:
LOGGER.info("!!!!!!!!!!!!!!!!!!!!!!!!!! run start_requests")
from twisted.internet import reactor
LOGGER.info(f'reactor_class: {reactor.__class__}')
LOGGER.info(f'scrapy_twisted_reactor: {settings.TWISTED_REACTOR}')

yield Request('https://google.com', dont_filter=True)

async def parse(self, _, **kwargs) -> GenericItem:
LOGGER.info("!!!!!!!!!!!!!!!!!!!!!!!!!! run parse")
item = GenericItem()
item['id'] = 42
yield item

С этого момента вся ветка Taskiq зависает. В журналах написано:
2024-12-02T17:05:30.959738317Z [2024-12-02 17:05:30,959][scrapy.core.engine][INFO ][worker-0] Spider opened
2024-12-02T17:05:30.962073516Z [2024-12-02 17:05:30,961][scrapy.extensions.logstats][INFO ][worker-0] Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2024-12-02T17:05:30.962425736Z [2024-12-02 17:05:30,962][scrapy.extensions.telnet][INFO ][worker-0] Telnet console listening on 127.0.0.1:6023
2024-12-02T17:05:30.962433949Z [2024-12-02 17:05:30,962][uvicorn][INFO ][worker-0] !!!!!!!!!!!!!!!!!!!!!!!!!! run start_requests
2024-12-02T17:05:30.962436121Z [2024-12-02 17:05:30,962][uvicorn][INFO ][worker-0] reactor_class:
2024-12-02T17:05:30.962501235Z [2024-12-02 17:05:30,962][uvicorn][INFO ][worker-0] scrapy_twisted_reactor: twisted.internet.asyncioreactor.AsyncioSelectorReactor
2024-12-02T17:06:30.963036521Z [2024-12-02 17:06:30,962][scrapy.extensions.logstats][INFO ][worker-0] Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)

Если отправляется сигнал перезапуска, он фиксируется tasiq, но сброс никогда не происходит, поскольку задача зависает:
[2024-12-02 17:08:46,612][taskiq.process-manager][INFO ][MainProcess] Scheduled workers reload.
2024-12-02T17:08:47.402671790Z [2024-12-02 17:08:47,402][taskiq.receiver.receiver][INFO ][worker-0] Stoping prefetching messages...
2024-12-02T17:08:47.402696006Z [2024-12-02 17:08:47,402][taskiq.receiver.receiver][INFO ][worker-0] Waiting for 1 running tasks to complete...

Я не вижу, что не так с моей конфигурацией, я совершенно не могу заставить это работать
scrapy.__version__
'2.12.0'
twisted.__version__
'24.11.0'


Подробнее здесь: https://stackoverflow.com/questions/792 ... and-scrapy
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»