создание 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()