2011-06-27 14 views
7

Sto cercando di eseguire scrapy da uno script come discusso here. Ha suggerito di utilizzare lo snippet this, ma quando lo faccio si blocca indefinitamente. Questo è stato scritto nella versione .10; è ancora compatibile con la stalla attuale?Esecuzione di Scrapy da uno script - Arresti

+0

Questa domanda e risposta potrebbe essere pronta per l'aggiornamento. Ecco [un recente frammento di Scrapy] (http://scrapy.readthedocs.org/en/0.16/topics/practices.html). Funziona, ma la domanda, per me, diventa: come fermi il reattore Twisted e vai avanti quando hai finito? – bahmait

risposta

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." 

UPDATE:

Se avete bisogno di avere anche le impostazioni per ragno vedere questo esempio:

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 

Esempio di impostazioni nel file per gli spider:

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

Ottengo traceback [this] (https://gist.github.com/1051117). Il mio progetto scrapy è chiamato raschietto. Potrebbe essere il problema? – ciferkey

+0

Penso che questo sia il problema. Questo è da un vero progetto. È possibile rimuovere i riferimenti al raschietto. Hai solo bisogno di alcune impostazioni per gli spider. – warvariuc

+0

quindi, dopo aver rimosso i riferimenti a raschietto, come faccio ad importare le impostazioni per il mio progetto? – ciferkey

Problemi correlati