本文实例讲述了Python实现在线程里运行scrapy的方法。分享给大家供大家参考。具体如下:
如果你希望在一个写好的程序里调用scrapy,就可以通过下面的代码,让scrapy运行在一个线程里。
\"\"\" Code to run Scrapy crawler in a thread - works on Scrapy 0.8 \"\"\" import threading, Queue from twisted.internet import reactor from scrapy.xlib.pydispatch import dispatcher from scrapy.core.manager import scrapymanager from scrapy.core.engine import scrapyengine from scrapy.core import signals class CrawlerThread(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.running = False def run(self): self.running = True scrapymanager.configure(control_reactor=False) scrapymanager.start() reactor.run(installSignalHandlers=False) def crawl(self, *args): if not self.running: raise RuntimeError(\"CrawlerThread not running\") self._call_and_block_until_signal(signals.spider_closed, \\ scrapymanager.crawl, *args) def stop(self): reactor.callFromThread(scrapyengine.stop) def _call_and_block_until_signal(self, signal, f, *a, **kw): q = Queue.Queue() def unblock(): q.put(None) dispatcher.connect(unblock, signal=signal) reactor.callFromThread(f, *a, **kw) q.get() # Usage example below: import os os.environ.setdefault(\'SCRAPY_SETTINGS_MODULE\', \'myproject.settings\') from scrapy.xlib.pydispatch import dispatcher from scrapy.core import signals from scrapy.conf import settings from scrapy.crawler import CrawlerThread settings.overrides[\'LOG_ENABLED\'] = False # avoid log noise def item_passed(item): print \"Just scraped item:\", item dispatcher.connect(item_passed, signal=signals.item_passed) crawler = CrawlerThread() print \"Starting crawler thread...\" crawler.start() print \"Crawling somedomain.com....\" crawler.crawl(\'somedomain.com) # blocking call print \"Crawling anotherdomain.com...\" crawler.crawl(\'anotherdomain.com\') # blocking call print \"Stopping crawler thread...\" crawler.stop()
希望本文所述对大家的Python程序设计有所帮助。