爬虫学习笔记(十三)—— scrapy-redis(二):存储到MySQL、Scrapy项目部署
文章目錄
- 一、小案例:爬取縱橫小說(RedisCrawlSpider)
- 1.1、spider文件
- 1.2、settings文件
- 二、redis數據存儲到MySQL
- 三、Scrapy 項目部署
- 3.1、安裝 scrapyd
- 3.2、scrapy.cfg設置
- 3.3、執行打包命令
- 3.4、啟動爬蟲
- 3.5、關閉爬蟲
一、小案例:爬取縱橫小說(RedisCrawlSpider)
這里修改我們 Scrapy框架(三):CrawSpider模板的案例實現偽分布式(下面我僅寫有修改部分的代碼)
1.1、spider文件
import jsonimport datetime import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from ..items import BookItem,ChapterItem,CatalogItemfrom scrapy_redis.spiders import RedisCrawlSpider #1.導入RedisCrawlSpider class ZhSpider(RedisCrawlSpider): #2.原來是繼承CrawlSpider 現在改為RedisCrawlSpidername = 'zh'# allowed_domains = ['book.zongheng.com']# start_urls = ['http://book.zongheng.com/store/c0/c0/b0/u0/p1/v9/s1/t1/u0/i1/ALL.html'] #一定要注釋掉start_urls redis_key = "zh:start_urls" #3.設置 redis_keyrules = (Rule(LinkExtractor(allow=r'http://book.zongheng.com/book/\d+.html',restrict_xpaths='//div[@class="bookname"]'), callback='parse_book', follow=True,process_links='get_booklink'),Rule(LinkExtractor(allow=r'http://book.zongheng.com/showchapter/\d+.html'), callback='parse_catalog', follow=True),Rule(LinkExtractor(allow=r'http://book.zongheng.com/chapter/\d+/\d+.html',restrict_xpaths='//ul[@class="chapter-list clearfix"]'), callback='parse_chapter',follow=False,process_links='get_chapterlink'),)def get_booklink(self,links):for index,link in enumerate(links):print(index,link.url)if index<=30:yield linkelse:returndef get_chapterlink(self,links):for index,link in enumerate(links):if index<=1:yield linkelse:return·············1.2、settings文件
# 啟用調度將請求存儲進redis SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 確保所有spider通過redis共享相同的重復過濾。 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" #公共管道 與 本地管道 ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline':300,'zhnovel.pipelines.ZhnovelPipeline': 200, } # 指定連接到Redis時要使用的主機和端口。 REDIS_HOST = 'localhost' REDIS_PORT = 6379 # 不清理redis隊列,允許暫停/恢復抓取。 # 可選 允許暫定,redis數據不丟失 SCHEDULER_PERSIST = True #日志時間輸出格式 LOG_DATEFORMAT='%Y'結果執行步驟:
1、準備(除了寫入的表名,這兩文件代碼完全一模一樣):
數據庫的novel(存儲書名及相關信息)和chapter(存儲各個章節)表都復制一份
2、在終端分布運行這兩個文件(由于還沒在redis設置鑰匙,所以這兩文件都處于等待狀態)
3、再開啟一個終端(redis寫入鑰匙)
最后讓我們來看看結果是什么樣的(這里我爬取了31本書):
① 首先我們先看下redis數據庫里面的數據:
可以看到總共有31本書
② 然后我們先打開MySQL數據庫:
兩個張表里的數據加起來剛好31條,說明我們的偽分布式是成功的(這里章節結果爬取不演示了)。
二、redis數據存儲到MySQL
-
因為開啟了公共管道,所以兩個項目的公共區域 redis 里會有兩個項目的數據,是完整的數據,可以持久化到MySQL里進行持久化的存儲
-
原因:redis存儲是基于內存的,數據多可能會影響運行速度,所以要對redis中的數據進行持久化
-
下面的是 redis數據存儲到MySQL 的一般書寫形式(僅供參考):
示例:
(redis里的數據是案例存進去的)
結果:
三、Scrapy 項目部署
3.1、安裝 scrapyd
命令1:
pip install scrapyd驗證:
輸入 scrapyd ,可以點擊頁面則成功
命令2:
?pip install scrapyd-client驗證:
到 scrapy 項目下面,輸入 scrapyd-deploy ,出現
Unknown target: defaultg3.2、scrapy.cfg設置
[settings] default = zhnovel.settings[deploy:novel] ;#novel:部署名稱隨便取 可以無 默認為空 ;取消注釋 url必須有,可以是遠程服務器 url = http://localhost:6800/ ;項目名稱 project = zhnovel ;訪問服務器需要的用戶名和密碼 (可以不寫) ;username=xxx ;password=xxx終端輸入命令 scrapyd-deploy -l 查看設置的部署名稱 和 url
3.3、執行打包命令
位置: 在有scrapy.cfg 的目錄下
輸入 scrapyd-deploy spider(部署名稱) -p zongheng(項目名稱)
終端顯示如下:
Deploying to project "zhnovel" in http://localhost:6800/addversion.json Server response (200): {"node_name": "DESKTOP-ISNG60N", "status": "ok", "project": "zhnovel", "version": "1626959536", "spiders": 1}輸入 http://127.0.0.1:6800 網頁端顯示如下:
3.4、啟動爬蟲
命令:
curl http://localhost:6800/schedule.json -d project=項目名稱 -d spider=爬蟲文件名
顯示如下:
建議使用cmd,打開命令行執行該語句,不然可能會出現報錯
3.5、關閉爬蟲
命令:curl http://localhost:6800/cancel.json -d project=項目名 -d job=填jobid值
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的爬虫学习笔记(十三)—— scrapy-redis(二):存储到MySQL、Scrapy项目部署的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爬虫学习笔记(十二)—— scrapy-
- 下一篇: linux cmake编译源码,linu