Задать вопрос
JRazor
@JRazor
Senior StarkOverFlow Programmer

Как в Scrapy реализовать последовательный или параллельный запуск пауков?

Здравствуйте. Возникла проблема: не могу запустить скрипты по порядку. Причина - reactor. Не перезапускается, почему-то. Один паук - один файл. В конце каждого файла прописано следующее:

spider = %текущий класс паука%()
settings = get_project_settings()
settings.overrides.update(options)
crawler = Crawler(settings)
# crawler.signals.connect(reactor.stop, signal=signals.spider_closed)
crawler.install()
crawler.configure()
crawler.crawl(spider)
crawler.signals.connect(crawler.uninstall, signal=signals.spider_closed)
crawler.signals.connect(reactor.stop, signal=signals.spider_closed)
crawler.start()
log.start(logfile=logfile, loglevel=log.DEBUG, crawler=crawler, logstdout=False)
reactor.run()

crawler._spider_closed()
print "Closed spider %имя паука%"
import %следующий паук%


Но выскакивает ошибка:

Traceback (most recent call last):
  File "C:/Users/Eugene/ODesk/450/spiders/__init__.py", line 1, in <module>
    import newenglandfilm
  File "C:\Users\Eugene\ODesk\450\spiders\newenglandfilm.py", line 60, in <module>
    import mandy
  File "C:\Users\Eugene\ODesk\450\spiders\mandy.py", line 68, in <module>
    reactor.run()
  File "C:\Python27\lib\site-packages\twisted\internet\base.py", line 1191, in run
    self.startRunning(installSignalHandlers=installSignalHandlers)
  File "C:\Python27\lib\site-packages\twisted\internet\base.py", line 1171, in startRunning
    ReactorBase.startRunning(self)
  File "C:\Python27\lib\site-packages\twisted\internet\base.py", line 683, in startRunning
    raise error.ReactorNotRestartable()
twisted.internet.error.ReactorNotRestartable
  • Вопрос задан
  • 4817 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
JRazor
@JRazor Автор вопроса
Senior StarkOverFlow Programmer
Уже понял, что реактор не нужно перезапускать. Нужно запускать один реактор. Решилось все следующим образом:

#!/usr/bin/python
# -*- coding: utf-8 -*-

from scrapy.crawler import Crawler
from scrapy.utils.project import get_project_settings
from twisted.internet import reactor

# Импортирем пауков
from spiders.newenglandfilm import NewenglandFilm
from spiders.mandy import Mandy
from spiders.productionhub import ProductionHub
from spiders.craiglist import Craiglist

from spiders.my_settings import options

# Передаем настройки
settings = get_project_settings()
settings.overrides.update(options)

# Запускаем четыре паука по очереди
crawler = Crawler(settings)
crawler.configure()
crawler.crawl(NewenglandFilm())
crawler.start()

crawler = Crawler(settings)
crawler.configure()
crawler.crawl(Mandy())
crawler.start()

crawler = Crawler(settings)
crawler.configure()
crawler.crawl(ProductionHub())
crawler.start()

crawler = Crawler(settings)
crawler.configure()
crawler.crawl(Craiglist())
crawler.start()

# Запускаем реактор
reactor.run()
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
rinnaatt
@rinnaatt
Python-разработчик
reactor - это как бы главный (вечный) цикл в Twisted приложении, и он не должен перезапускаться.
Честно говоря я не пойму для чего вам нужен именно такой способ запуск пауков. Если вам нужно чтобы у вас пауки по порядку отработали, то вы можете поставить scrapyd, и потом в кроне прописать задания для него, тобишь прописать вызовы curl-ом определенные урлы с пост параметрами.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы