在开始之前先说几个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

  from scrapy.settings import Settings

  #引用spider

  from project.spiders.spider_name import spider_class

  #配置setting,可自定义setting属性

  settings = Settings() 

  #执行spider

  runner = CrawlerRunner(settings)

  runner.crawl(spider_class)

  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。。。。。





01-02 17:12
查看更多