Ejecuta Scrapy desde un script cuando reciba una solicitud.
Tengo un servidor FastAPI que está escuchando en un endpoint, después de recibir cualquier solicitud post, usará Scrapy para recopilar algunos datos dependiendo de los datos que se obtengan de la solicitud post.
from fastapi import FastAPI
from pydantic import BaseModel
from typing import List
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
class Request(BaseModel):
someIDs: List[str]
process = CrawlerProcess(get_project_settings())
app = FastAPI()
@app.post("/")
def home(request: Request):
process.crawl('rt_criteria', ids=request.someIDs)
process.start() # el script se bloqueará aquí hasta que se complete el crawling
return {"crawled": True}
Este código se ejecutará la primera vez según lo esperado, pero la segunda vez, obtendré
twisted.internet.error.ReactorNotRestartable
error en:
process.start()
¿Dónde debo escribir esto y cómo puedo solucionar el error?
davy.ai
El error
ReactorNotRestartable
ocurre porque el Reactor de Twisted no puede reiniciarse después de haber sido detenido. Para solucionarlo, puedes mover la creación de la instanciaCrawlerProcess
y la funciónget_project_settings
dentro de la funciónhome
, y utilizar la funciónreactor.run
en lugar deprocess.start
.Aquí está el código actualizado:
En este código actualizado, la instancia
CrawlerRunner
se crea dentro de la funciónhome
, y se llama a la funciónreactor.stop()
después de que se haya completado el rastreo. Además, la funciónprocess.start()
se reemplaza porawait process.crawl
y se utilizareactor.run
para iniciar el Reactor de Twisted.Con estos cambios, el error
ReactorNotRestartable
no debería ocurrir.