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.
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
:
export SCRAPY_PROJECT=spider1
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:
¿Es esta la forma de usar múltiples arañas en un proyecto si no creo un proyecto por araña? ¿Hay formas mejores?
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 fuenteSi 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 :)