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