標籤:請求 爬蟲 允許 erp http parse 管道 優先順序 back
分布式問題:
request隊列集中管理
去重集中管理
儲存管理
可以上github上面找一下scrapy-redis
相關模組 redis
settings相關設定
#使用scrapy-redis裡的去重組件,不使用scrapy預設的去重方式DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"#使用scrapy-redis裡的調度器組件,不使用預設的SCHEDULER = "scrapy_redis.scheduler.Scheduler"#允許暫停,redis請求記錄不丟失SCHEDULER_PERSIST = True#預設的scrapy-redis請求隊列形式(按優先順序)SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"#隊列形式,先進先出SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"#棧形式,請求先進後出SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"#只是將資料放到redis資料庫,不需要寫pipeline,儲存到mysql還是需要寫的ITEM_PIPELINES = { ‘scrapy_redis.pipelines.RedisPipeline‘:400}#連結redis資料庫REDIS_URL = ‘redis://:@127.0.0.1:6379‘
運行分布式爬蟲
scrapy runspider myspider.py#後面的py檔案是你需要啟動並執行分布式爬蟲的檔案名稱
命令列啟動後,會在自行等待監聽redis上的url
也就是在spider上面設定的redis_key = ‘mybaike:start_url‘
然後後在redis上lpush一個健名和url#比如: # lpush mybaike:start_url "http://www.baike.com"
redis中預設產生的健有:
myspider:requestmyspider:dupefilter#如果開啟item管道儲存在redis的資料的話,就還有這這麼一個欄位myspider:item
#在redis中刪除所有的鍵命令為:flushdb
#查看所有鍵:keys *
spider.py ##基於RedisCrawlSpider,也就是翻頁的時候使用Crawl的需要繼承與這個類
import scrapyfrom scrapy.selector import Selectorfrom Scrapy_Redist.items import ScrapyRedistItemfrom scrapy_redis.spiders import RedisCrawlSpiderfrom scrapy.linkextractor import LinkExtractorfrom scrapy.spiders import CrawlSpider,Ruleclass MybaidukeSpider(RedisCrawlSpider): ##基於RedisCrawlSpider name = ‘mybaike‘ alloweb_domains = [‘baike.baidu.com‘] # start_urls = [‘https://baike.baidu.com/item/Python/407313‘] redis_key = ‘mybaike:start_url‘ rules = [Rule(LinkExtractor(allow=("item/(.*)")),callback="get_parse",follow=True)] def get_parse(self,response): items = ScrapyRedistItem() Seit = Selector(response) title = Seit.xpath(‘//dd[@class="lemmaWgt-lemmaTitle-title"]/h1/text()‘).extract() contentList = Seit.xpath(‘//div[@class="lemma-summary"]//text()‘) content = ‘‘ for c in contentList: content += c.extract().strip() items[‘title‘] = title items[‘content‘] = content yield items
import scrapyfrom scrapy.selector import Selectorfrom Scrapy_Redist.items import ScrapyRedistItemfrom scrapy_redis.spiders import RedisSpiderclass MybaidukeSpider(RedisSpider): name = ‘mybaike‘ alloweb_domains = [‘baike.baidu.com‘] # start_urls = [‘https://baike.baidu.com/item/Python/407313‘]
redis_key = ‘mybaike:start_url‘
#這句話很重要哦,也就是寫在redis中鍵
#rules = [Rule(LinkExtractor(allow=("item/(.*)")),callback="get_parse",follow=True)]# 如果自己寫一個翻頁的花就繼承於 RedisSpider
def get_parse(self,response): items = ScrapyRedistItem() Seit = Selector(response) title = Seit.xpath(‘//dd[@class="lemmaWgt-lemmaTitle-title"]/h1/text()‘).extract() contentList = Seit.xpath(‘//div[@class="lemma-summary"]//text()‘) content = ‘‘ for c in contentList: content += c.extract().strip() items[‘title‘] = title items[‘content‘] = content yield items
其他的也就差不多一樣的了
scrapy-redis分布式爬蟲