scrapyd
是运行scrapy爬虫的服务程序,它支持以http命令方式发布、删除、启动、停止爬虫程序。而且scrapyd可以同时管理多个爬虫,每个爬虫还可以有多个版本
下载命令:pip3 install scrapyd
scrapyd-client:发布爬虫需要使用另一个专用工具,就是将代码打包为EGG文件,其次需要将EGG文件上传到远程主机上这些操作需要scrapyd-client来帮助我们完成
Scrapy_redis在scrapy的基础上实现了更多,更强大的功能,具体体现在:reqeust去重,爬虫持久化,和轻松实现分布式
Scrapy-redis提供了下面四种组件(components)
Scheduler
Duplication Filter
Item Pipeline
Base Spider
获取一下sceapy_redis的源代码:
git clone https://github.com/rolando/scrapy-redis.git
我们clone到的 scrapy-redis 源码中有自带的一个example-project项目,这个项目包含3个spider,分别是dmoz, myspider_redis,mycrawler_redis
运行第一个dmoz文件
这个爬虫继承的是CrawlSpider,它是用来说明Redis的持续性,当我们第一次运行dmoz爬虫,然后Ctrl + C停掉之后,再运行dmoz爬虫,之前的爬取记录是保留在Redis里的。其实它就是一个 scrapy-redis 版 CrawlSpider 类,需要设置Rule规则,以及callback不能写parse()方法。
运行第二个myspider_redis文件
这个爬虫继承了RedisSpider, 它能够支持分布式的抓取,采用的是basic spider,需要写parse函数。其次就是不再有start_urls了,取而代之的是redis_key,scrapy-redis将key从Redis里pop出来,成为请求的url地址。RedisSpider类 不需要写start_urls:
scrapy-redis 一般直接写allowd_domains来指定需要爬取的域,必须指定redis_key,即启动爬虫的命令,参考格式:redis_key = 'myspider:start_urls'根据指定的格式,start_urls将在 Master端的 redis-cli 里 lpush 到 Redis数据库里,RedisSpider 将在数据库里获取start_urls。
运行myspider_redis文件的命令可以使用scrapy runspider myspider_redis或者使用scrapy crawl myspider_redis
运行myspider_redis文件的命令可以使用scrapy runspider myspider_redis或者使用scrapy crawl myspider_redis
在命令行端的redis-cli输入push指令,参考格式(指定起始url):
lpush myspider:start_urls +你要请求的起始url
要使用分布式 Scrapy_Redis Settings.py设置文件中需要做一下配置
这里表示启用scrapy-redis里的去重组件,不实用scrapy默认的去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
使用了scrapy-redis里面的调度器组件,不使用scrapy默认的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
允许暂停,redis请求的记录不会丢失,不清除Redis队列,可以恢复和暂停
SCHEDULER_PERSIST = True
下面这些是request的队列模式
scrapy-redis默认的请求队列形式(有自己的优先级顺序)
是按照redis的有序集合排序出队列的
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
队列形式,请求先进先出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
使用了栈的形式,请求先进后出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"
ITEM_PIPELINES = {
'example.pipelines.ExamplePipeline': 300,
'scrapy_redis.pipelines.RedisPipeline': 400,
}
指定要存储的redis的主机的ip,默认存储在127.0.0.1
REDIS_HOST = 'redis的主机的ip'
定要存储的redis的主机的port,默认6379
REDIS_PORT = '6379'