2016-03-07 4 views
1

Я занимаюсь проекцией scrapy Я хочу запускать несколько пауков за один раз Это код для запуска пауков из скрипта. Я получаю ошибку .. как сделатьЗапуск нескольких пауков из сценария в scrapy

from spiders.DmozSpider import DmozSpider 
from spiders.CraigslistSpider import CraigslistSpider 

from scrapy import signals, log 
from twisted.internet import reactor 
from scrapy.crawler import Crawler 
from scrapy.settings import Settings 

TO_CRAWL = [DmozSpider, CraigslistSpider] 


RUNNING_CRAWLERS = [] 

def spider_closing(spider): 
"""Activates on spider closed signal""" 
log.msg("Spider closed: %s" % spider, level=log.INFO) 
RUNNING_CRAWLERS.remove(spider) 
if not RUNNING_CRAWLERS: 
    reactor.stop() 

log.start (LogLevel = log.debug) для паука в TO_CRAWL: настройки = Настройки()

# crawl responsibly 
settings.set("USER_AGENT", "Kiran Koduru (+http://kirankoduru.github.io)") 
crawler = Crawler(settings) 
crawler_obj = spider() 
RUNNING_CRAWLERS.append(crawler_obj) 

# stop reactor when spider closes 
crawler.signals.connect(spider_closing, signal=signals.spider_closed) 
crawler.configure() 
crawler.crawl(crawler_obj) 
crawler.start() 

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

reactor.run()

+0

Вы можете улучшить свой код форматирования? Какая ошибка вы получаете? можете ли вы предоставить трассировку? –

ответ

1

Извините, не ответить на вопрос его эльфов, но просто привлекая к себе внимание scrapyd и scrapinghub (по крайней мере, для быстрого теста). reactor.run() (когда вы это сделаете) будет запускать любое количество экземпляров Scrapy на одном CPU. Вам нужен этот побочный эффект? Даже если вы посмотрите на код scrapyd, они не запускают несколько экземпляров с одним потоком, но они делают fork/spawn subprocesses.

2

Вам нужно что-то вроде кода ниже. Вы можете легко найти его из Scrapy Docs :)

Первой утилиты вы можете использовать для запуска пауков является scrapy.crawler.CrawlerProcess. Этот класс запустит для вас реактор Twisted , настроив обработчики регистрации и настройки останова. Этот класс является тем, который используется всеми командами Scrapy.

# -*- coding: utf-8 -*- 
import sys 
import logging 
import traceback 
from scrapy.crawler import CrawlerProcess 
from scrapy.conf import settings 
from scrapy.utils.project import get_project_settings 
from spiders.DmozSpider import DmozSpider 
from spiders.CraigslistSpider import CraigslistSpider 

SPIDER_LIST = [ 
    DmozSpider, CraigslistSpider 
] 

if __name__ == "__main__": 
    try: 
     ## set up the crawler and start to crawl one spider at a time 
     process = CrawlerProcess(get_project_settings()) 
     for spider in SPIDER_LIST: 
      process.crawl(spider) 
     process.start() 
    except Exception, e: 
     exc_type, exc_obj, exc_tb = sys.exc_info() 
     logging.info('Error on line {}'.format(sys.exc_info()[-1].tb_lineno)) 
     logging.info("Exception: %s" % str(traceback.format_exc())) 

Ссылки: http://doc.scrapy.org/en/latest/topics/practices.html

+0

спасибо за это, но я думаю, что это работает на одном процессоре. Но у меня есть список из 100000 доменов, в которых я хочу запустить 30 экземпляров в AWS EC2. как сделать очередь списка доменов для запуска пауков в 30 экземплярах. 30 пауков запускаются в этих 30 экземплярах за раз. Как сделать –

+0

Вы можете сделать отдельные сценарии для разных экземпляров. Каждый экземпляр запускает набор ваших пауков. Извините, но я не совсем понимаю ваш вопрос. – hungneox