通过协程管理实现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