在開始之前先說幾個scrapy運行的方式
1、常用的命令行形式的運行方式:
scrapy crawl spider_name
這種方式可以根據爬蟲名進行項目的運行
2、通過CrawlerProcess方式來執行
from scrapy.crawler import CrawlerProcess from baidu_spider.spiders.baidu_news import BaiduNewsSpider process = CrawlerProcess() process.crawl(BaiduNewsSpider) process.start(False)
3、通過CrawlerProcess方式來執行
# -*- coding: utf-8 -*- from twisted.internet import reactor from scrapy.crawler import CrawlerRunner #引用spider from baidu_spider.spiders.baidu_news import BaiduNewsSpider #執行spider runner = CrawlerRunner() runner.crawl(BaiduNewsSpider) reactor.run()
現在來說下怎樣實現(先貼代碼):
from gevent import monkey monkey.patch_all() ------->第一步:導入模塊 from scrapy.crawler import CrawlerProcess from baidu_spider.spiders.baidu_news import BaiduNewsSpider, BaiduNews1Spider from gevent.pool import Pool import gevent def task(spider):----------> 第二步:創建爬蟲執行任務 while True: print('%s start*******************************task' % spider.name) cmd = 'scrapy crawl %s' % spider.name a = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) a.stdout.read()--------> 注意:需要自己去阻塞該任務,否則不會等到該任務結束就會開啟下次執行任務 gevent.sleep(2) if __name__ == '__main__': p = Pool() --------> 第三步:生成協程並執行 for spider in [BaiduNewsSpider,BaiduNews1Spider]: p.spawn(task, spider) p.join()
第一步:導包:使用協程異步執行,我這里使用的是比較方便的包gevent,你也可以自己使用yield實現協程,或者使用greenlet模塊,根據個人習慣選擇協程實現方式
注意:需要在最開始時導入,這個會動態更新插件
from gevent import monkey monkey.patch_all()
然后需要導入 from gevent.pool imporgt Pool(或者import gevent)
說明:為什么在這里我要Pool模塊?
原始的gevent在生成協程任務的時候不能使用for循環動態生成,這樣的話我們就需要對應實現多個任務函數比如task1(),task2()這樣,而通過使用Pool這個類
我們就可以使用for循環動態添加任務,相同的代碼不用復制許多份了
第二步:創建一個循環任務(不一定想我上面那樣無限循環,實際根據需求來創建,也可用for語句實現)
該任務是你要執行的任務
第三步:使用Pool創建協程
spawn方法:第一個參數是任務方法名,后面的參數是任務方法需要的參數,該方法並不會啟動任務
使用join()啟動協程任務
這個是使用第一種執行方式進行的異步循環爬取(后面兩種暫時還沒研究好,待有進展了在來更新(有大神也可以指點下我)。。。。。)
后面我會繼續更新定時執行scrapy。。。。。