将scrapy蜘蛛打造成我自己的程序,我不想从命令行调用scrapy)

Jos*_*eph 8 python scrapy web-scraping

与此问题类似: stackoverflow:run-multiple-spiders-in-scrapy

我想知道,我可以在另一个python程序中运行整个scrapy项目吗?让我们说我想构建一个需要抓取几个不同站点的整个程序,并为每个站点构建整个scrapy项目.

而不是从命令行运行,我想运行这些蜘蛛并从中获取信息.

我可以在python OK使用MongoDB的,我已经可以构建包含蜘蛛,但现在只是合并这一切到一个应用程序scrapy项目.

我想运行一次应用程序,并且能够从我自己的程序中控制多个蜘蛛

为什么这样?以及此应用程序还可以使用API​​连接到其他站点,并且需要实时比较API站点和已删除站点的结果.我不想从命令行调用scrapy,它的意思是自包含.

(我最近一直在问很多关于抓取的问题,因为我正在努力寻找合适的解决方案来构建)

谢谢 :)

Max*_*ant 8

是的,你当然可以;)

这个想法(灵感来自这篇博文)是创建一个worker然后在你自己的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)
Run Code Online (Sandbox Code Playgroud)

使用示例:

result_queue = Queue()
crawler = CrawlerWorker(MySpider(myArgs), result_queue)
crawler.start()
for item in result_queue.get():
    yield item
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用执行scrapy crawl命令 system()