Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Por qué el rastreador distribuido scrapy-redis espera para iniciarse?

¿Por qué el rastreador distribuido scrapy-redis espera para iniciarse?

scrapy-redis implementa dos distribuciones: distribución de rastreadores y distribución de procesamiento de proyectos. Se implementan mediante el programador de módulos y la canalización de módulos, respectivamente.

Introducción al componente I.Scrapy-redis

(I) conexión.py

Responsable de crear instancias de la conexión redis de acuerdo con la configuración en los ajustes. Será llamado por dupefilter y Scheduler; en resumen, cualquier cosa que implique acceso a Redis debe usar este módulo.

(II) dupefilter.py

El módulo dupefilter.py es responsable de realizar la deduplicación de solicitudes, que se implementa de una manera muy inteligente utilizando la estructura de datos del conjunto de redis. Sin embargo, tenga en cuenta que el programador no programa solicitudes utilizando una de las claves de filtro dupe implementadas en este módulo, sino que utiliza la cola implementada en el módulo queue.py.

Cuando una solicitud no se repite, se colocará en la cola y se mostrará cuando esté programado.

(III)queue.py

El principio de funcionamiento es el mismo que el descrito en II, pero aquí se implementan tres tipos de colas:

SpiderQueue de FIFO, SpiderPriorityQueue y SpiderStack de LIFI.

(4) pipelines.py

Se utiliza para implementar el procesamiento distribuido. Almacena el artículo en redis para lograr un procesamiento distribuido.

Además, se puede encontrar que se han escrito las mismas canalizaciones, pero la implementación de codificación aquí es diferente de la situación analizada en el artículo (enlace :), porque la configuración debe leerse aquí. entonces se usa la función from_crawler().

(5) Scheduler.py

Esta extensión puede reemplazar el propio programador de scrapy (especificado en la variable SCHEDULER en la configuración) y se utiliza para implementar la programación distribuida de rastreadores. La estructura de datos que utiliza proviene de la estructura de datos en cola.

Las dos distribuciones implementadas por scrapy-redis: distribución del rastreador y distribución de procesamiento de proyectos se implementan mediante el programador y las canalizaciones de los módulos. Los demás módulos mencionados anteriormente sirven como módulos auxiliares para estas dos distribuciones.

(6) spider.py

Diseñado para capturar la URL leída por la araña desde redis y luego ejecutar el rastreo. Si el proceso de rastreo devuelve más URL, continúe con la búsqueda hasta completar todas las solicitudes. están completos. Después de eso, continúe leyendo la URL de Redis y repita este proceso.

2. Relación entre componentes

3. Análisis de ejemplo de Srapy-redis

(1)?spiders/ ebay_redis.py

classEbayCrawler (RedisMixin, CrawlSpider):

"""Spider que lee las URL de la cola de Redis (mycrawler: start_urls).""""

name = 'ebay_redis'

redis_key = 'ebay_redis:start_urls'

rules = (

# seguir todos los enlaces

# Rule(SgmlLinkExtractor (), callback='parse_page', seguir =Verdadero),

Regla(sle(allow=('[^\s] /itm/', )), devolución de llamada='parse_item'),

)

# Este método es el método más crítico. El nombre del método comienza con un guión bajo y se utiliza para establecer la relación con redis.

def _set_crawler(self, Crawler):

CrawlSpider._set_crawler(self, rastreador)

RedisMixin.setup_ redis(self)

# Analizar página sku

defparse_item(self, respuesta):

sel =Selector(respuesta)

base_url =get_base_url(respuesta)

item = EbayphoneItem()

imprimir base_url< / p>

item['baseurl'] = [base_url]

item['goodsname'] = sel.xpath("//h1[@id=' itemTitle']/text() " ).extract()

Devolver elemento

Esta clase hereda de RedisMixin (una clase en Scrapy_redis/spiders.py) y CrawlSpider, carga los elementos en el archivo de configuración, crea y asociación de Redis y análisis posterior al rastreo.

El método clave es _set_crawler(self, crawler), el atributo clave es redis_key, si no se inicializa, el valor predeterminado es spider.name: start_urls

Cómo llamar al método _set_crawler():

scrapy/crawler.

scrapy/crawl.py/Crawler:?crawl() -gt;

scrapy/crawl.py/Crawler:_create_spider () -gt;

CrawlSpider: from_crawler() -gt;

scrapy/spiders/Spider: ?from_crawler() -gt;

ebay_redis.py: _set_crawler()

(2)?setting.py

SPIDER_MODULES= ['ejemplo.spiders']

NEWSPIDER_MODULE= 'ejemplo.spiders'

ITEM_PIPELINES = {

'example.pipelines.ExamplePipeline': 300,

# Al configurar RedisPipeline en el proyecto, 'el proyecto se escribirá en una lista en redis y su clave

#spider.name: elementos para el procesamiento distribuido posterior del proyecto

'scrapy_redis.pipelines.RedisPipeline': 400,

}

SCHEDULER="scrapy_redis.scheduler.Scheduler"

#No borre la cola pesada, lo que permite pausar o reiniciar el rastreador

SCHEDULER _PERSIST= True

SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.Scheduler.Scheduler'