2011-06-27 9 views
7

Estoy tratando de ejecutar scrapy desde una secuencia de comandos como se describe here. Sugirió usar el fragmento this, pero cuando lo hago cuelga indefinidamente. Esto fue escrito en la versión .10; ¿sigue siendo compatible con el establo actual?Ejecutando Scrapy desde una secuencia de comandos: se bloquea

+0

Esta pregunta y respuesta pueden estar listas para la actualización. Aquí hay [un fragmento reciente de Scrapy] (http://scrapy.readthedocs.org/en/0.16/topics/practices.html). Funciona, pero la pregunta, para mí, se convierte en: ¿cómo se detiene el reactor Twisted y se mueve cuando está listo? – bahmait

Respuesta

7
from scrapy import signals, log 
from scrapy.xlib.pydispatch import dispatcher 
from scrapy.crawler import CrawlerProcess 
from scrapy.conf import settings 
from scrapy.http import Request 

def handleSpiderIdle(spider): 
    '''Handle spider idle event.''' # http://doc.scrapy.org/topics/signals.html#spider-idle 
    print '\nSpider idle: %s. Restarting it... ' % spider.name 
    for url in spider.start_urls: # reschedule start urls 
     spider.crawler.engine.crawl(Request(url, dont_filter=True), spider) 

mySettings = {'LOG_ENABLED': True, 'ITEM_PIPELINES': 'mybot.pipeline.validate.ValidateMyItem'} # global settings http://doc.scrapy.org/topics/settings.html 

settings.overrides.update(mySettings) 

crawlerProcess = CrawlerProcess(settings) 
crawlerProcess.install() 
crawlerProcess.configure() 

class MySpider(BaseSpider): 
    start_urls = ['http://site_to_scrape'] 
    def parse(self, response): 
     yield item 

spider = MySpider() # create a spider ourselves 
crawlerProcess.queue.append_spider(spider) # add it to spiders pool 

dispatcher.connect(handleSpiderIdle, signals.spider_idle) # use this if you need to handle idle event (restart spider?) 

log.start() # depends on LOG_ENABLED 
print "Starting crawler." 
crawlerProcess.start() 
print "Crawler stopped." 

ACTUALIZACIÓN:

Si es necesario tener también ajustes por araña ver este ejemplo:

for spiderConfig in spiderConfigs: 
    spiderConfig = spiderConfig.copy() # a dictionary similar to the one with global settings above 
    spiderName = spiderConfig.pop('name') # name of the spider is in the configs - i can use the same spider in several instances - giving them different names 
    spiderModuleName = spiderConfig.pop('spiderClass') # module with the spider is in the settings 
    spiderModule = __import__(spiderModuleName, {}, {}, ['']) # import that module 
    SpiderClass = spiderModule.Spider # spider class is named 'Spider' 
    spider = SpiderClass(name = spiderName, **spiderConfig) # create the spider with given particular settings 
    crawlerProcess.queue.append_spider(spider) # add the spider to spider pool 

Ejemplo de configuración en el archivo de arañas:

name = punderhere_com  
allowed_domains = plunderhere.com 
spiderClass = scraper.spiders.plunderhere_com 
start_urls = http://www.plunderhere.com/categories.php? 
+0

obtengo [este] (https://gist.github.com/1051117) rastreo. Mi proyecto de scrapy se llama scraper. ¿Podría ser el problema? – ciferkey

+0

Creo que ese es el problema. Esto es de un proyecto real. Puede eliminar referencias al raspador. Solo necesitas algunos ajustes para arañas. – warvariuc

+0

entonces, ¿después de eliminar las referencias al raspador cómo voy a importar las configuraciones para mi proyecto? – ciferkey

Cuestiones relacionadas