2010-12-15 11 views
25

existe la posibilidad de detener el rastreo cuando es específica si la condición es verdadera (como scrap_item_id == predefine_value). Mi problema es similar al Scrapy - how to identify already scraped urls pero quiero 'forzar' a mi araña scrapy a dejar de gatear después de descubrir el último elemento raspado.Forzar que mi araña scrapy deje de arrastrarse

+2

Ok consiguió. .. Estoy bastante seguro de que hay una solución mejor, pero de scrapy.project import crawler crawler.engine.close_spider (spider, 'closespider_blee') funciona – no1

+0

Esa solución parece estar bien. También se usa en la fuente de scrapy (por ejemplo, contrib/closespider.py) –

Respuesta

7

Esta pregunta fue hecha hace 8 meses pero me preguntaba lo mismo y he encontrado otra (no excelente) solución. Espero que esto pueda ayudar a los futuros lectores.

Me estoy conectando a una base de datos en mi archivo Pipeline, si la conexión de la base de datos no es exitosa, quería que el Spider dejara de rastrear (no tiene sentido recolectar datos si no hay dónde enviarlo). Lo que terminé haciendo fue usando:

from scrapy.project import crawler 
crawler._signal_shutdown(9,0) #Run this if the cnxn fails. 

Esto hace que la araña para hacer lo siguiente:

[scrapy] INFO: Received SIGKILL, shutting down gracefully. Send again to force unclean shutdown. 

Yo sólo tipo de retazos esto juntos después de leer sus comentarios y mirando a través de la "/ usr/local/lib/python2.7/dist-packages/Scrapy-0.12.0.2543-py2.7.egg/scrapy/crawler.py "archivo. No estoy totalmente seguro de lo que está haciendo, el primer número entregado a la función es el signame (por ejemplo, usando 3,0 en lugar de 9,0 devuelve el error [scrapy] INFO: Received SIGKILL...

Parece que funciona bien. Raspado feliz.

EDIT: también supongo que usted podría forzar su programa de cerrar con algo como:

import sys 
sys.exit("SHUT DOWN EVERYTHING!") 

Edit2:. Parece que alguien ha creado una extensión para detener la araña Esto podría ser útil a alguien: http://dev.scrapy.org/browser/scrapy/contrib/closespider.py

+2

Gracias por mencionar la extensión, ahora mismo es un camino por recorrer. Aquí hay documentos: http://readthedocs.org/docs/scrapy/en/0.12/topics/extensions.html#module-scrapy.contrib.closespider –

+0

Lo que no me gusta de la extensión Close Spider es que solo puede ser iniciado por cuatro condiciones (tiempo de espera, itempased, pagecount, errorcount, hasta donde yo sé). Lo que sería bueno es si pudiera crear sus propias condiciones para cerrar la araña, de modo que esté cerrada cuando haya un evento específico (por ejemplo, se raspa una palabra determinada). – alukach

+3

el enlace a la extensión está inactivo – pinkvoid

27

En la última versión de Scrapy, disponible en GitHub, puede generar una excepción CloseSpider para cerrar manualmente una araña.

En el 0.14 release note doc se menciona: "Agregado CloseSpider excepción a manualmente cercanos arañas (r2691)"

Ejemplo de acuerdo con los documentos:

def parse_page(self, response): 
    if 'Bandwidth exceeded' in response.body: 
    raise CloseSpider('bandwidth_exceeded') 

Ver también: http://readthedocs.org/docs/scrapy/en/latest/topics/exceptions.html?highlight=closeSpider

+1

Logra forzar detener, pero no rápido suficiente. Todavía permite que se ejecute alguna Solicitud. Espero que Scrapy brinde una mejor solución en el futuro. –

+0

De acuerdo con mis observaciones, termina las solicitudes que ya fueron despedidas, ¿no? –

Cuestiones relacionadas