2015-11-21 5 views
4

Я пытаюсь создать несколько пауков. Первый работает отлично, но второй дает мне ошибку: ReactorNotRestartable.Запуск более одного паука в цикле for

feeds = { 
    'nasa': { 
     'name': 'nasa', 
     'url': 'https://www.nasa.gov/rss/dyn/breaking_news.rss', 
     'start_urls': ['https://www.nasa.gov/rss/dyn/breaking_news.rss'] 
    }, 
    'xkcd': { 
     'name': 'xkcd', 
     'url': 'http://xkcd.com/rss.xml', 
     'start_urls': ['http://xkcd.com/rss.xml'] 
    }  
} 

С учетом указанных выше пунктов, я пытаюсь запустить два пауков в цикле, как это:

from scrapy.crawler import CrawlerProcess 
from scrapy.spiders import XMLFeedSpider 

class MySpider(XMLFeedSpider): 

    name = None 

    def __init__(self, **kwargs): 

     this_feed = feeds[self.name] 
     self.start_urls = this_feed.get('start_urls') 
     self.iterator = 'iternodes' 
     self.itertag = 'items' 
     super(MySpider, self).__init__(**kwargs) 

def parse_node(self, response, node): 
    pass 


def start_crawler(): 
    process = CrawlerProcess({ 
     'USER_AGENT': CONFIG['USER_AGENT'], 
     'DOWNLOAD_HANDLERS': {'s3': None} # boto issues 
    }) 

    for feed_name in feeds.keys(): 
     MySpider.name = feed_name 
     process.crawl(MySpider) 
     process.start() 

Исключение для второго цикла выглядит так, паук открыт, но затем:

... 
2015-11-22 00:00:00 [scrapy] INFO: Spider opened 
2015-11-22 00:00:00 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 
2015-11-22 00:00:00 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023 
2015-11-21 23:54:05 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023 
Traceback (most recent call last): 
    File "env/bin/start_crawler", line 9, in <module> 
    load_entry_point('feed-crawler==0.0.1', 'console_scripts', 'start_crawler')() 
    File "/Users/bling/py-feeds-crawler/feed_crawler/crawl.py", line 51, in start_crawler 
    process.start() # the script will block here until the crawling is finished 
    File "/Users/bling/py-feeds-crawler/env/lib/python2.7/site-packages/scrapy/crawler.py", line 251, in start 
    reactor.run(installSignalHandlers=False) # blocking call 
    File "/usr/local/lib/python2.7/site-packages/twisted/internet/base.py", line 1193, in run 
    self.startRunning(installSignalHandlers=installSignalHandlers) 
    File "/usr/local/lib/python2.7/site-packages/twisted/internet/base.py", line 1173, in startRunning 
    ReactorBase.startRunning(self) 
    File "/usr/local/lib/python2.7/site-packages/twisted/internet/base.py", line 684, in startRunning 
    raise error.ReactorNotRestartable() 
twisted.internet.error.ReactorNotRestartable 

Должен ли я сделать недействительным первый MySpider или что я делаю неправильно, и мне нужно изменить его действие. Заранее спасибо.

ответ

0

Решение является сбор пауков в цикле и начать процесс только один раз в конце. Я предполагаю, что это имеет какое-то отношение к распределению/освобождению реакторов.

def start_crawler(): 

    process = CrawlerProcess({ 
     'USER_AGENT': CONFIG['USER_AGENT'], 
     'DOWNLOAD_HANDLERS': {'s3': None} # disable for issues with boto 
    }) 

    for feed_name in CONFIG['Feeds'].keys(): 
     MySpider.name = feed_name 
     process.crawl(MySpider) 

    process.start() 

Спасибо @eLRuLL за ваш ответ, это вдохновило меня найти это решение.

0

выглядит, как вы должны создать экземпляр процесса за паука, попробуйте:

def start_crawler():  

    for feed_name in feeds.keys(): 
     process = CrawlerProcess({ 
      'USER_AGENT': CONFIG['USER_AGENT'], 
      'DOWNLOAD_HANDLERS': {'s3': None} # boto issues 
     }) 
     MySpider.name = feed_name 
     process.crawl(MySpider) 
     process.start() 
+0

Имеет больше смысла, но тем не менее то же исключение. – rebeling

0

Вы можете отправлять параметры в обход и использовать их в процессе разбора.

class MySpider(XMLFeedSpider): 
    def __init__(self, name, **kwargs): 
     super(MySpider, self).__init__(**kwargs) 

     self.name = name 


def start_crawler():  
    process = CrawlerProcess({ 
     'USER_AGENT': CONFIG['USER_AGENT'], 
     'DOWNLOAD_HANDLERS': {'s3': None} # boto issues 
    }) 

    for feed_name in feeds.keys(): 
     process.crawl(MySpider, feed_name) 

    process.start() 

 Смежные вопросы

  • Нет связанных вопросов^_^