日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

爬虫学习笔记(十三)—— scrapy-redis(二):存储到MySQL、Scrapy项目部署

發布時間:2025/3/21 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 爬虫学习笔记(十三)—— 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 的一般書寫形式(僅供參考):

import redis import pymysql import json# 創建redis數據庫連 rediscli = redis.StrictRedis(host= '127.0.0.1', port = 6379, db = 0)# 創建mysql數據庫連接 mysql_conn = pymysql.connect(host="127.0.0.1", port=3306, user="xxx", passwd="xxx", db="數據庫名")while True:# 將數據從redis里取出來source, data = rediscli.blpop("表名:items")item = json.loads(data)# 創建mysql 操作游標對象,可以執行mysql語句cursor = mysql_conn.cursor()cursor.execute("insert into 表名 (username, age) values (%s, %s)", [item['username'], item['age']])# 提交事務mysql_conn.commit()# 關閉游標cursor.close()

示例
(redis里的數據是案例存進去的)

import redis import pymysql import json# 創建redis數據庫連 rediscli = redis.StrictRedis(host= '127.0.0.1', port = 6379, db = 0)# 創建mysql數據庫連接 mysql_conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="123456", db="zhnovel",charset="utf8")while True:# 將數據從redis里取出來source, data = rediscli.blpop("zh:items")item = json.loads(data)print('source = ',source)print('data = ',data)# 創建mysql 操作游標對象,可以執行mysql語句cur = mysql_conn.cursor()# 注意!!! 要提前建表if 'book_name' in data:sql = "select id from novel_copy where book_name=%s and author=%s"cur.execute(sql, (item['book_name'], item['author']))if not cur.fetchone():sql = "insert into novel_copy(category,book_name,author,status,book_nums,description,book_url,catalog_url) values(%s,%s,%s,%s,%s,%s,%s,%s)"cur.execute(sql, (item['category'], item['book_name'], item['author'], item['status'], item['book_nums'], item['description'],item['book_url'], item['catalog_url']))elif 'chapter_list' in data:sql = 'insert into chapter_redisTomysql(title,ord_num,chapter_url,catalog_url) values(%s,%s,%s,%s)'data_list = []for index, chapter in enumerate(item['chapter_list']):ord_num = index + 1title, chapter_url, catalog_url = chapterdata_list.append((title, ord_num, chapter_url, catalog_url))cur.executemany(sql, data_list)elif 'content' in data:sql = "update chapter_redisTomysql set content=%s where chapter_url=%s"cur.execute(sql, (item['content'], item['chapter_url']))mysql_conn.commit()# 關閉游標cur.close()mysql_conn.close()

結果:


三、Scrapy 項目部署

3.1、安裝 scrapyd

命令1:

pip install scrapyd

驗證:

輸入 scrapyd ,可以點擊頁面則成功

命令2:

?pip install scrapyd-client

驗證:

到 scrapy 項目下面,輸入 scrapyd-deploy ,出現

Unknown target: defaultg

3.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项目部署的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。