scrapyd
是運行scrapy爬蟲的服務(wù)程序,它支持以http命令方式發(fā)布才写、刪除葡兑、啟動、停止爬蟲程序赞草。而且scrapyd可以同時管理多個爬蟲,每個爬蟲還可以有多個版本
下載命令:pip3 install scrapyd
scrapyd-client:發(fā)布爬蟲需要使用另一個專用工具讹堤,就是將代碼打包為EGG文件,其次需要將EGG文件上傳到遠(yuǎn)程主機上這些操作需要scrapyd-client來幫助我們完成
Scrapy_redis在scrapy的基礎(chǔ)上實現(xiàn)了更多厨疙,更強大的功能洲守,具體體現(xiàn)在:reqeust去重,爬蟲持久化沾凄,和輕松實現(xiàn)分布式
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的持續(xù)性,當(dāng)我們第一次運行dmoz爬蟲保屯,然后Ctrl + C停掉之后手负,再運行dmoz爬蟲涤垫,之前的爬取記錄是保留在Redis里的。其實它就是一個 scrapy-redis 版 CrawlSpider 類竟终,需要設(shè)置Rule規(guī)則蝠猬,以及callback不能寫parse()方法。
運行第二個myspider_redis文件
這個爬蟲繼承了RedisSpider统捶, 它能夠支持分布式的抓取榆芦,采用的是basic spider,需要寫parse函數(shù)喘鸟。其次就是不再有start_urls了匆绣,取而代之的是redis_key,scrapy-redis將key從Redis里pop出來什黑,成為請求的url地址犬绒。RedisSpider類 不需要寫start_urls:
scrapy-redis 一般直接寫allowd_domains來指定需要爬取的域,必須指定redis_key兑凿,即啟動爬蟲的命令,參考格式:redis_key = 'myspider:start_urls'根據(jù)指定的格式茵瘾,start_urls將在 Master端的 redis-cli 里 lpush 到 Redis數(shù)據(jù)庫里礼华,RedisSpider 將在數(shù)據(jù)庫里獲取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設(shè)置文件中需要做一下配置
這里表示啟用scrapy-redis里的去重組件圣絮,不實用scrapy默認(rèn)的去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
使用了scrapy-redis里面的調(diào)度器組件,不使用scrapy默認(rèn)的調(diào)度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
允許暫停雕旨,redis請求的記錄不會丟失扮匠,不清除Redis隊列,可以恢復(fù)和暫停
SCHEDULER_PERSIST = True
下面這些是request的隊列模式
scrapy-redis默認(rèn)的請求隊列形式(有自己的優(yōu)先級順序)
是按照redis的有序集合排序出隊列的
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
隊列形式凡涩,請求先進(jìn)先出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
使用了棧的形式棒搜,請求先進(jìn)后出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"
ITEM_PIPELINES = {
? ? 'example.pipelines.ExamplePipeline': 300,
? ? 'scrapy_redis.pipelines.RedisPipeline': 400,
}
指定要存儲的redis的主機的ip,默認(rèn)存儲在127.0.0.1
REDIS_HOST = 'redis的主機的ip'
定要存儲的redis的主機的port活箕,默認(rèn)6379
REDIS_PORT = '6379'