通過協程管理實現scrapy異步循環爬取


在開始之前先說幾個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。。。。。






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM