Jos*_*eph 8 python scrapy web-scraping
与此问题类似: stackoverflow:run-multiple-spiders-in-scrapy
我想知道,我可以在另一个python程序中运行整个scrapy项目吗?让我们说我想构建一个需要抓取几个不同站点的整个程序,并为每个站点构建整个scrapy项目.
而不是从命令行运行,我想运行这些蜘蛛并从中获取信息.
我可以在python OK使用MongoDB的,我已经可以构建包含蜘蛛,但现在只是合并这一切到一个应用程序scrapy项目.
我想运行一次应用程序,并且能够从我自己的程序中控制多个蜘蛛
为什么这样?以及此应用程序还可以使用API连接到其他站点,并且需要实时比较API站点和已删除站点的结果.我不想从命令行调用scrapy,它的意思是自包含.
(我最近一直在问很多关于抓取的问题,因为我正在努力寻找合适的解决方案来构建)
谢谢 :)
是的,你当然可以;)
这个想法(灵感来自这篇博文)是创建一个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()
归档时间: |
|
查看次数: |
1597 次 |
最近记录: |