爬虫学习笔记(十二)—— scrapy-redis(一):基本使用、介绍
文章目錄
- 一、分布式概念和作用
- 二、Scrapy-redis
- 2.1、redis的安裝與使用
- 2.2、Redis Desktop Manager下載
- 2.3、特點和架構
- 2.4、安裝和使用
- 2.5、redis中存儲的數據
- 2.6、項目配置及項目代碼
- 三、小案例:爬取豆瓣250電影信息(RedisSpider)
- 3.1、spider文件
- 3.2、settings文件
- 3.3、pipelines文件
一、分布式概念和作用
分布式:一個業務分拆多個子業務,部署在不同的服務器上;是一種將任務分布在不同地方的工作方式。
作用:提高安全性和效率
分布式爬蟲:
二、Scrapy-redis
2.1、redis的安裝與使用
1、redis 下載地址
https://github.com/MicrosoftArchive/redis/releases
2、修改redis.windows.conf
bind 127.0.0.1 -> bind 0.0.0.03、啟動服務與數據庫
啟動服務器:redis-server
啟動數據庫:redis-cli
4、使用:
redis基本使用可看我博客:學習筆記(十七)——redis(CRUD)
python連接redis可看我博客:學習筆記(十九)——Python與數據庫交互(mysql、redis)
2.2、Redis Desktop Manager下載
這是一個redis的桌面工具,可以圖形化界面操作redis數據庫
安裝教程:https://www.cnblogs.com/ttlx/p/11611086.html
2.3、特點和架構
scrapy_redis是一個基于Redis的Scrapy組件,用于scrapy項目的分布式部署和開發。
特點:分布式爬取
可以啟動多個spider對象,互相之間共享有一個redis的request隊列。最適合多個域名的廣泛內容的爬取。
分布式數據處理:
爬取到的item數據被推送到redis中,這意味著你可以啟動盡可能多的item處理程序。
2.4、安裝和使用
- 一般通過pip安裝Scrapy-redis:
- scrapy-redis依賴:
- scrapy-redis的使用非常簡單,幾乎可以并不改變原本scrapy項目的代碼,只用做少量設置
2.5、redis中存儲的數據
-
spidername:items
list類型,保存爬蟲獲取到的數據item內容是json字符串。
-
spidername:dupefilter
set類型,用于爬蟲訪問的URL去重內容,是40個字符的url的hash字符串
-
spidername:start_urls
list類型,用于接收redis spider啟動時的第一個url
-
spidername:requests
zset類型,用于存放requests等待調度。內容是requests對象的序列化字符串
2.6、項目配置及項目代碼
spider文件
代碼作了簡單改動
注意:使用時,記得提前在redis中添加。例如:lpush db:start_urls https://movie.douban.com/top250
settings文件
需要配置:
- 公共的調度器 SCHEDULER
- 公共的過濾器 DUPEFILTER_CLASS
- 公共存儲區域 redis
常用設置:
# 1.啟用調度將請求存儲進redis 必須 SCHEDULER = "scrapy_redis.scheduler.Scheduler"# 2.確保所有spider通過redis共享相同的重復過濾。 必須 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"#公共管道 ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline':300, # 'db250.pipelines.Db250Pipeline': 200, } # 3.指定連接到Redis時要使用的主機和端口。 必須 REDIS_HOST = 'localhost' REDIS_PORT = 6379 # 不清理redis隊列,允許暫停/恢復抓取。 # 可選 允許暫定,redis數據不丟失 SCHEDULER_PERSIST = True三、小案例:爬取豆瓣250電影信息(RedisSpider)
(這里就用我博客:Scrapy框架(二)的案例來進行修改演示,以下僅列舉需要稍微修改的地方)
注意:這里有一點要提示下,爬取的數據量要設置大些,不然可能效果不明顯。這里僅僅只是偽分布式
3.1、spider文件
from scrapy_redis.spiders import RedisSpider #導入RedisSpider #原本是繼承scrapy.Spider 現在改為RedisSpider class DbSpider(RedisSpider): name = 'db'# allowed_domains = ['movie.douban.com']# start_urls = ['https://movie.douban.com/top250'] #這個要注釋掉redis_key = 'db:start_urls' # 開啟爬蟲鑰匙page = 0def parse(self, response):all_mes = response.xpath('//div[@class="info"]')for mes in all_mes:film_name = mes.xpath('./div/a/span[1]/text()')[0].extract()score = mes.xpath('./div/div/span[2]/text()')[0].extract()director = mes.xpath('./div/p/text()')[0].extract().strip()item = Db250Item()item['film_name'] = film_nameitem['score'] = scoreitem['director'] = director# yield itemdetail_url = mes.xpath('./div/a/@href').extract()[0]yield scrapy.Request(detail_url,callback=self.get_detail,meta={'info':item})if response.meta.get('num'): #這個meta很關鍵 可以避免相互干擾self.page = response.meta["num"]self.page += 1if self.page == 6:returnpage_url = 'https://movie.douban.com/top250?start={}&filter='.format(self.page * 25)yield scrapy.Request(page_url,meta={'num':self.page})def get_detail(self,response):items = Db250Item()info = response.meta["info"]items.update(info)detail= response.xpath('//div[@class="indent"]//span[@property="v:summary"]/text()').extract()[0].strip()items['detail'] = detailyield items3.2、settings文件
添加
# 1.啟用調度將請求存儲進redis 必須 SCHEDULER = "scrapy_redis.scheduler.Scheduler"# 2.確保所有spider通過redis共享相同的重復過濾。 必須 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"#公共管道 ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline':300, #為了寫的redis 'db250.pipelines.Db250Pipeline': 200, #寫到txt文本方便我們查看 } # 3.指定連接到Redis時要使用的主機和端口。 必須 REDIS_HOST = 'localhost' REDIS_PORT = 6379 # 不清理redis隊列,允許暫停/恢復抓取。 # 可選 允許暫定,redis數據不丟失 SCHEDULER_PERSIST = True3.3、pipelines文件
import json import pandas as pd from itemadapter import ItemAdapterclass Db250Pipeline:def open_spider(self,spider):self.f = open('film_mes1.txt','w',encoding='utf-8') def process_item(self, item, spider):data = json.dumps(dict(item),ensure_ascii=False)+'\n'self.f.write(data)return itemdef close_spider(self,spider):self.f.close()結果執行步驟:
1、準備(這兩文件代碼完全一模一樣):
2、在終端分布運行這兩個文件(由于我還沒在redis設置鑰匙,所以這兩文件都處于等待狀態)
3、再開啟一個終端(在redis寫入鑰匙)
最后讓我們來看看結果是什么樣的(這里我爬取了6頁數據也就是150條):
① 首先我們先看看redis數據庫的內容,這里我們打開RDM:
這里我們看到了數據庫的內容是一堆字符,但是我們可以從網上找JSON解析工具來進行解析(這里我隨便找了一個JSON在線解析)
②接下來,我們來看看txt文件的寫入情況
兩個文件加起來剛好150條,說明我們的偽分布式是成功的
總結
以上是生活随笔為你收集整理的爬虫学习笔记(十二)—— scrapy-redis(一):基本使用、介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爬虫学习笔记(十一)—— Scrapy框
- 下一篇: 爬虫学习笔记(十三)—— scrapy-