spider scraping library example crawler python scrapy

python - scraping - ¿Cuándo y cómo se deben usar múltiples arañas en un proyecto Scrapy?



scrapy spider (3)

¡Buen trabajo! No encontré una mejor manera de administrar múltiples arañas en la documentación.

No sé sobre scrapyd. Pero cuando se ejecuta desde la línea de comandos, debe establecer la variable de entorno SCRAPY_PROJECT en el proyecto de destino.

ver scrapy/utils/project.py

ENVVAR = ''SCRAPY_SETTINGS_MODULE'' ... def get_project_settings(): if ENVVAR not in os.environ: project = os.environ.get(''SCRAPY_PROJECT'', ''default'') init_env(project)

Estoy usando Scrapy , es genial! tan rápido para construir un rastreador. A medida que aumenta el número de sitios web, es necesario crear nuevas arañas, pero estos sitios web son del mismo tipo, todas estas arañas utilizan los mismos elementos, tuberías y procesos de análisis.

Los contenidos del directorio del proyecto:

test/ ├── scrapy.cfg └── test ├── __init__.py ├── items.py ├── mybasespider.py ├── pipelines.py ├── settings.py ├── spider1_settings.py ├── spider2_settings.py └── spiders ├── __init__.py ├── spider1.py └── spider2.py

Para reducir la redundancia del código fuente, mybasespider.py tiene una araña base MyBaseSpider , el 95% del código fuente está en ella, todas las demás arañas heredadas de ella, si una araña tiene algunas cosas especiales, anula algunos class methods , normalmente solo es necesario agregar varias líneas código fuente para crear una nueva araña

Coloque todas las configuraciones comunes en settings.py , las configuraciones especiales de una araña están en [spider name]_settings.py , como:

la configuración especial de spider1 en spider1_settings.py :

from settings import * LOG_FILE = ''spider1.log'' LOG_LEVEL = ''INFO'' JOBDIR = ''spider1-job'' START_URLS = [ ''http://test1.com/'', ]

la configuración especial de spider2 en spider2_settings.py :

from settings import * LOG_FILE = ''spider2.log'' LOG_LEVEL = ''DEBUG'' JOBDIR = ''spider2-job'' START_URLS = [ ''http://test2.com/'', ]

Scrapy usa LOG_FILE , LOG_LEVEL , JOBDIR antes de lanzar una araña;

Todas las direcciones URL en START_URLS se rellenan en MyBaseSpider.start_urls , diferentes arañas tienen diferentes contenidos, pero el nombre START_URLS utilizado en la araña base MyBaseSpider no ha cambiado.

El contenido del scrapy.cfg :

[settings] default = test.settings spider1 = spider1.settings spider2 = spider2.settings [deploy] url = http://localhost:6800/ project = test

Para ejecutar una araña, como spider1 :

  1. export SCRAPY_PROJECT=spider1

  2. scrapy crawl spider1

Pero de esta manera no se puede utilizar para correr arañas en scrapyd . scrapyd-deploy comando scrapyd-deploy siempre usa ''default'' nombre de proyecto ''default'' en la scrapy.cfg ''configuración'' de scrapy.cfg para crear un egg file y desplegarlo en scrapyd

Tiene varias preguntas:

  1. ¿Es esta la forma de usar múltiples arañas en un proyecto si no creo un proyecto por araña? ¿Hay formas mejores?

  2. Cómo separar la configuración especial de una araña como la anterior, que puede ejecutarse en scrapyd y reducir la redundancia del código fuente

  3. Si todas las arañas usan un mismo JOBDIR , ¿es seguro ejecutar todas las arañas simultáneamente? ¿Está corrompido el estado persistente de la araña?

Cualquier idea sería muy apreciada.


Como todas las arañas deberían tener su propia clase, podría establecer la configuración por araña con el argumento de la clase custom_settings , así que algo como:

Class MySpider1(Spider): name = "spider1" custom_settings = {''USER_AGENT'': ''user_agent_for_spider1/version1''} Class MySpider1(Spider): name = "spider1" custom_settings = {''USER_AGENT'': ''user_agent_for_spider2/version2''}

esta settings.py sobrescribirá las que están en el archivo settings.py , por lo que aún podría establecer algunas globales.


No sé si responderá a tu primera pregunta pero uso scrapy con múltiples arañas y en el pasado uso el comando

scrapy crawl spider1

pero si tengo más de una araña, este comando lo activa u otros módulos, así que comienzo a usar este comando:

scrapy runspider <your full spider1 path with the spiderclass.py>

ejemplo: "Inicio de Spypider / Documentos / scrapyproject / scrapyproject / spiders / spider1.py"

Espero que te ayude :)