Scrapy 框架實戰:構建高效的快看漫畫分布式爬蟲

一、Scrapy框架概述

Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架,它提供了強大的數據提取能力、靈活的擴展機制以及高效的異步處理性能。其核心架構包括:

  • Engine:控制所有組件之間的數據流,當某個動作發生時觸發事件
  • Scheduler:接收Engine發送的請求并入隊,當Engine請求時返回給Engine
  • Downloader:負責下載網頁內容并將結果返回給Spider
  • Spider:用戶編寫的用于分析響應、提取項目和額外URL的類
  • Item Pipeline:負責處理Spider提取的項目,進行數據清洗、驗證和存儲

二、項目環境搭建

首先,我們需要安裝Scrapy和相關的依賴庫:

對于分布式爬蟲,我們還需要安裝和配置Redis服務器作為調度隊列。

三、創建Scrapy項目

使用Scrapy命令行工具創建項目:

scrapy startproject kuaikan_crawler
cd kuaikan_crawler
scrapy genspider kuaikan www.kuaikanmanhua.com

四、定義數據模型

在items.py中定義我們需要抓取的數據結構:

import scrapyclass ComicItem(scrapy.Item):title = scrapy.Field()          # 漫畫標題author = scrapy.Field()         # 作者description = scrapy.Field()    # 描述cover_url = scrapy.Field()      # 封面URLtags = scrapy.Field()           # 標簽likes = scrapy.Field()          # 喜歡數comments = scrapy.Field()       # 評論數chapters = scrapy.Field()       # 章節列表source_url = scrapy.Field()     # 源URLcrawl_time = scrapy.Field()     # 爬取時間

五、編寫爬蟲核心邏輯

在spiders/kuaikan.py中編寫爬蟲的主要邏輯:

import scrapy
import json
from kuaikan_crawler.items import ComicItem
from urllib.parse import urljoinclass KuaikanSpider(scrapy.Spider):name = 'kuaikan'allowed_domains = ['www.kuaikanmanhua.com']start_urls = ['https://www.kuaikanmanhua.com/web/topic/all/']def parse(self, response):# 解析漫畫列表頁comics = response.css('.TopicList .topic-item')for comic in comics:detail_url = comic.css('a::attr(href)').get()if detail_url:yield scrapy.Request(url=urljoin(response.url, detail_url),callback=self.parse_comic_detail)# 分頁處理next_page = response.css('.next-page::attr(href)').get()if next_page:yield scrapy.Request(url=urljoin(response.url, next_page),callback=self.parse)def parse_comic_detail(self, response):# 解析漫畫詳情頁item = ComicItem()# 提取基本信息item['title'] = response.css('.comic-title::text').get()item['author'] = response.css('.author-name::text').get()item['description'] = response.css('.comic-description::text').get()item['cover_url'] = response.css('.cover img::attr(src)').get()item['tags'] = response.css('.tags .tag::text').getall()item['likes'] = response.css('.like-count::text').get()item['comments'] = response.css('.comment-count::text').get()item['source_url'] = response.urlitem['crawl_time'] = datetime.now().isoformat()# 提取章節信息chapters = []for chapter in response.css('.chapter-list li'):chapter_info = {'title': chapter.css('.chapter-title::text').get(),'url': urljoin(response.url, chapter.css('a::attr(href)').get()),'update_time': chapter.css('.update-time::text').get()}chapters.append(chapter_info)item['chapters'] = chaptersyield item

六、實現分布式爬蟲

為了將爬蟲轉換為分布式模式,我們需要使用scrapy-redis組件:

  1. 修改settings.py配置文件:
# 啟用scrapy-redis調度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"# 啟用去重過濾器
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"# 設置Redis連接
REDIS_URL = 'redis://localhost:6379/0'# 保持Redis隊列不清空,允許暫停/恢復爬取
SCHEDULER_PERSIST = True# 設置Item Pipeline
ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline': 300,'kuaikan_crawler.pipelines.MongoPipeline': 400,
}
  1. 修改爬蟲代碼,繼承RedisSpider:
from scrapy_redis.spiders import RedisSpiderclass DistributedKuaikanSpider(RedisSpider):name = 'distributed_kuaikan'redis_key = 'kuaikan:start_urls'def __init__(self, *args, **kwargs):super(DistributedKuaikanSpider, self).__init__(*args, **kwargs)self.allowed_domains = ['www.kuaikanmanhua.com']def parse(self, response):# 解析邏輯與之前相同pass

七、數據存儲管道

創建MongoDB存儲管道,在pipelines.py中:

import pymongo
from scrapy import settingsclass MongoPipeline:def __init__(self, mongo_uri, mongo_db):self.mongo_uri = mongo_uriself.mongo_db = mongo_db@classmethoddef from_crawler(cls, crawler):return cls(mongo_uri=crawler.settings.get('MONGO_URI'),mongo_db=crawler.settings.get('MONGO_DATABASE', 'scrapy'))def open_spider(self, spider):self.client = pymongo.MongoClient(self.mongo_uri)self.db = self.client[self.mongo_db]def close_spider(self, spider):self.client.close()def process_item(self, item, spider):collection_name = item.__class__.__name__self.db[collection_name].insert_one(dict(item))return item

在settings.py中添加MongoDB配置:

MONGO_URI = 'mongodb://localhost:27017'
MONGO_DATABASE = 'kuaikan_comics'

八、中間件與反爬蟲策略

為了應對網站的反爬蟲機制,我們需要添加一些中間件:

# 在middlewares.py中添加隨機User-Agent中間件
import random
from scrapy import signalsclass RandomUserAgentMiddleware:def __init__(self, user_agents):self.user_agents = user_agents@classmethoddef from_crawler(cls, crawler):return cls(user_agents=crawler.settings.get('USER_AGENTS', []))def process_request(self, request, spider):request.headers['User-Agent'] = random.choice(self.user_agents)# 在settings.py中配置用戶代理列表
USER_AGENTS = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15',# 添加更多用戶代理...
]

總結

本文詳細介紹了如何使用Scrapy框架構建一個高效的分布式漫畫爬蟲。通過結合Scrapy-Redis實現分布式抓取,使用MongoDB進行數據存儲,以及實施多種反反爬蟲策略,我們能夠構建一個穩定高效的爬蟲系統。這種架構不僅可以應用于漫畫網站,經過適當修改后也可以用于其他各種類型的網站數據抓取任務。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/920553.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/920553.shtml
英文地址,請注明出處:http://en.pswp.cn/news/920553.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據結構(C語言篇):(六)單鏈表算法題(下)

目錄 前言 一、鏈表的回文結構 二、相交鏈表 三、環形鏈表?編輯 四、環形鏈表II 總結 前言 本篇博客將繼續介紹單鏈表相關的算法題,包括了鏈表的回文結構、相交鏈表、環形鏈表等。現在就讓我們正式開始吧! 一、鏈表的回文結構 題目鏈接&#xff1a…

【AI自動化】VSCode+Playwright+codegen+nodejs自動化腳本生成

VSCodePlaywrightnodejs,能完美實現UI自動化全流程腳本自動生成和回放,生成的腳本方便維護,回放執行快速; 概述 Playwright 是由Microsoft開發的一個開源的跨瀏覽器自動化測試庫,它支持Chromium、WebKit和Firefox瀏覽…

基于能量方法的納維-斯托克斯方程高階范數有界性理論推導-陳墨仙

寫在最前面,圈外人,沒有背書沒有教育郵箱,發不了預印本,我先發csdn。剛才首發沒復制完,抱歉,現在編輯下。基于能量方法的納維-斯托克斯方程高階范數有界性理論推導作者 陳墨仙郵件 2488888241qq.com摘要納維…

Labview邪修01:貪吃蛇

從博主很小的時候就在掌機上玩過這個貪吃蛇的小游戲,突然有一天心血來潮的想Labview是不是也可以編這個小游戲,回憶一下童年!然后就又了下面的這個程序,執行結果如下圖所示。 基本功能: 1)點擊開始按鈕&am…

將自己的jar包發布到maven中央倉庫(2025-08-29)

將自己的jar包發布到maven中央倉庫(2025-08-29) 一、注冊賬號 https://central.sonatype.com/ 二、新建命名空間 這里的命名空間需要填寫github的用戶名因為我的用戶名是daimao0,所以命名空間填io.github.daimao0 這里要求你建一個名為ubuxfc5q7r的公共項目,先創…

Spring CompositeCacheManager融合緩存

這是一個非常實用但容易被忽視的組件,它在特定的緩存場景下能提供極大的靈活性。 1. 核心概念:它是什么? ??CompositeCacheManager?? 是 Spring Framework 緩存抽象(spring-context模塊)的一部分。它的核心作用正如其名——??組合(Composite)??。 它本身并不…

無懈可擊的 TCP AIMD

不特指 TCP AIMD,而泛指控制范疇的所有 Additive Increase / Multiplicative Decrease 算法,繼 難以超越的 TCP AIMD 再敘。 “你永遠不能僅憑 BBR 的吞吐更高就說 BBR 比 CUBIC 更好” 這句話怎么總是沒人看,這句話是這一系列文章的前提論點…

數據集數量與神經網絡參數關系分析

1. 理論基礎 1.1 經驗法則與理論依據 神經網絡的參數量與所需數據集大小之間存在重要的關系,這直接影響模型的泛化能力和訓練效果。 經典經驗法則10倍法則:數據樣本數量應至少為模型參數量的10倍 公式:數據量 ≥ 10 參數量適用于大多數監督學…

項目經驗處理

訂單取消和支付成功并發問題 這是一個非常經典且重要的分布式系統問題。訂單取消和支付成功同時發生,本質上是一個資源競爭問題,核心在于如何保證兩個并發操作對訂單狀態的修改滿足業務的最終一致性(即一個訂單最終只能有一種確定的狀態&…

rabbitmq學習筆記 ----- 多級消息延遲始終為 20s 問題排查

問題現象 在實現多級延遲消息功能時&#xff0c;發現每次消息延遲間隔始終為20s&#xff0c;無法按照預期依次使用20s→10s→5s的延遲時間。日志顯示每次處理時移除的延遲時間都是20000L。 問題代碼片段 1.生產者 Testvoid sendDelayMessage2() {List<Long> expireTimeLi…

軟件測試(三):測試流程及測試用例

1.測試流程1.需求分析進行測試之前先閱讀需求文檔&#xff0c;分析指出不合理或不明確的地方2.計劃編寫與測試用例測試用例用例即&#xff1a;用戶使用的案例測試用例&#xff1a;執行測試的文檔作用&#xff1a;用例格式&#xff1a;----------------------------------------…

Python:列表的進階技巧

列表&#xff08;list&#xff09;作為 Python 最常用的數據結構之一&#xff0c;不僅能存儲有序數據&#xff0c;還能在推導式、函數參數傳遞、數據處理等場景中發揮強大作用。下面介紹一些進階技巧與常見應用。一、去重與排序1、快速去重&#xff08;不保序&#xff09;nums …

【完整源碼+數據集+部署教程】硬幣分類與識別系統源碼和數據集:改進yolo11-SWC

背景意義 隨著經濟的發展和數字支付的普及&#xff0c;傳統硬幣的使用逐漸減少&#xff0c;但在某些地區和特定場合&#xff0c;硬幣仍然是重要的支付手段。因此&#xff0c;硬幣的分類與識別在自動化支付、智能零售和物聯網等領域具有重要的應用價值。尤其是在銀行、商超和自助…

萊特萊德:以“第四代極限分離技術”,賦能生物發酵產業升級

萊特萊德&#xff1a;以“第四代極限分離技術”&#xff0c;賦能生物發酵產業升級Empowering Upgrades in the Bio-Fermentation Industry with "Fourth-Generation Extreme Separation Technology生物發酵行業正經歷從 “規模擴張” 向 “質效提升” 的關鍵轉型&#xff…

外賣大戰之后,再看美團的護城河

美團&#xff08;03690.HK&#xff09;于近日發布了2025年Q2財報&#xff0c;市場無疑將更多目光投向了其備受關注的外賣業務上。毫無懸念&#xff0c;受外賣競爭和加大投入的成本影響&#xff0c;美團在外賣業務上的財務數據受到明顯壓力&#xff0c;利潤大幅下跌&#xff0c;…

R包fastWGCNA - 快速執行WGCNA分析和下游分析可視化

最新版本: 1.0.0可以對著視頻教程學習和使用&#xff1a;然而還沒錄呢, 關注B站等我更新R包介紹 開發背景 WGCNA是轉錄組或芯片表達譜數據常用得分析, 可用來鑒定跟分組或表型相關得模塊基因和核心基因但其步驟非常之多, 每次運行起來很是費勁, 但需要修改的參數并不多所以完全…

GitHub 熱榜項目 - 日榜(2025-08-29)

GitHub 熱榜項目 - 日榜(2025-08-29) 生成于&#xff1a;2025-08-29 統計摘要 共發現熱門項目&#xff1a;11 個 榜單類型&#xff1a;日榜 本期熱點趨勢總結 本期GitHub熱榜展現出三大技術趨勢&#xff1a;1&#xff09;AI應用持續深化&#xff0c;ChatGPT等大模型系統提示…

【深度學習實戰(58)】bash方式啟動模型訓練

export \PATHPYTHONPATH/workspace/mmlab/mmdetection/:/workspace/mmlab/mmsegmentation/:/workspace/mmlab/mmdeploy/:${env:PYTHONPATH} \CUDA_VISIBLE_DEVICES0 \DATA_ROOT_1/mnt/data/…/ \DATA_ROOT_2/mnt/data/…/ \DATA_ROOT_MASK/…/ \PATH_COMMON_PACKAGES_SO…sonoh…

【物聯網】關于 GATT (Generic Attribute Profile)基本概念與三種操作(Read / Write / Notify)的理解

“BLE 讀寫”在這里具體指什么&#xff1f; 在你的系統里&#xff0c;樹莓派是 BLE Central&#xff0c;Arduino 是 BLE Peripheral。 Central 和 Peripheral 通過 **GATT 特征&#xff08;Characteristic&#xff09;**交互&#xff1a;讀&#xff08;Read&#xff09;&#x…

JavaSE丨集合框架入門(二):從 0 掌握 Set 集合

這節我們接著學習 Set 集合。一、Set 集合1.1 Set 概述java.util.Set 接口繼承了 Collection 接口&#xff0c;是常用的一種集合類型。 相對于之前學習的List集合&#xff0c;Set集合特點如下&#xff1a;除了具有 Collection 集合的特點&#xff0c;還具有自己的一些特點&…