создание scrapy пауков в моей собственной программе, я не хочу вызывать scrapy из командной строки)

в аналогичном ключе к этому вопросу: stackoverflow: запуск-несколько пауков-в-scrapy

Мне интересно, могу ли я запустить весь проект scrapy из другой программы python? Скажем так, я хотел создать целую программу, которая требовала бы очистки нескольких разных сайтов, и я строю целые проекты для каждого сайта.

вместо запуска из командной строки как один из, Я хочу запустить эти пауки и получить информацию от их.

Я могу использовать mongoDB в python ok, и я уже могу создавать скрипучие проекты, содержащие пауков, но теперь просто объединяю все это в одно приложение.

Я хочу запустить приложение один раз и иметь возможность управлять несколькими пауками из моей собственной программы

Почему это? ну, это приложение также может подключаться к другим сайтам с помощью API и должно сравнивать результаты с сайта API на выскобленный сайт в режиме реального времени. Я не хочу когда-нибудь придется вызовите scrapy из командной строки, все это должно быть автономным.

(в последнее время я задаю много вопросов о выскабливании, потому что я пытаюсь найти правильное решение для сборки)

спасибо :)

1 ответов


Да, конечно, ты можешь ;)

идея (вдохновленная этим сообщением в блоге) создать работника, а затем использовать его в своем собственном скрипте Python:

from scrapy import project, signals
from scrapy.conf import settings
from scrapy.crawler import CrawlerProcess
from scrapy.xlib.pydispatch import dispatcher
from multiprocessing.queues import Queue
import multiprocessing

class CrawlerWorker(multiprocessing.Process):

    def __init__(self, spider, result_queue):
        multiprocessing.Process.__init__(self)
        self.result_queue = result_queue

        self.crawler = CrawlerProcess(settings)
        if not hasattr(project, 'crawler'):
            self.crawler.install()
        self.crawler.configure()

        self.items = []
        self.spider = spider
        dispatcher.connect(self._item_passed, signals.item_passed)

    def _item_passed(self, item):
        self.items.append(item)

    def run(self):
        self.crawler.crawl(self.spider)
        self.crawler.start()
        self.crawler.stop()
        self.result_queue.put(self.items)

пример использования:

result_queue = Queue()
crawler = CrawlerWorker(MySpider(myArgs), result_queue)
crawler.start()
for item in result_queue.get():
    yield item

другой способ-выполнить команду scrapy crawl с помощью system()