Scrapy 框架实战:构建高效的快看漫画分布式爬虫

小白学大数据
• 阅读 13

一、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 scrapy

class ComicItem(scrapy.Item): title = scrapy.Field() # 漫画标题 author = scrapy.Field() # 作者 description = scrapy.Field() # 描述 cover_url = scrapy.Field() # 封面URL tags = scrapy.Field() # 标签 likes = scrapy.Field() # 喜欢数 comments = scrapy.Field() # 评论数 chapters = scrapy.Field() # 章节列表 source_url = scrapy.Field() # 源URL crawl_time = scrapy.Field() # 爬取时间 五、编写爬虫核心逻辑 在spiders/kuaikan.py中编写爬虫的主要逻辑: import scrapy import json from kuaikan_crawler.items import ComicItem from urllib.parse import urljoin

class 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.url
    item['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'] = chapters

    yield 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 RedisSpider

class 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 settings

class MongoPipeline: def init(self, mongo_uri, mongo_db): self.mongo_uri = mongo_uri self.mongo_db = mongo_db

@classmethod
def 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 signals

class RandomUserAgentMiddleware: def init(self, user_agents): self.user_agents = user_agents

@classmethod
def 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进行数据存储,以及实施多种反反爬虫策略,我们能够构建一个稳定高效的爬虫系统。这种架构不仅可以应用于漫画网站,经过适当修改后也可以用于其他各种类型的网站数据抓取任务。

点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
python爬虫增加多线程获取数据
Python爬虫应用领域广泛,并且在数据爬取领域处于霸主位置,并且拥有很多性能好的框架,像Scrapy、Request、BeautifuSoap、urlib等框架可以实现爬行自如的功能,只要有能爬取的数据,Python爬虫均可实现。数据信息采集离不开Pyt
Karen110 Karen110
4年前
使用Scrapy网络爬虫框架小试牛刀
前言这次咱们来玩一个在Python中很牛叉的爬虫框架——Scrapy。scrapy介绍标准介绍Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍。所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有很强通用性的项目模板。对于框架的学习,重点是要学习其框架的特性、各个功能的
Stella981 Stella981
3年前
Crawlscrapy分布式爬虫
1.概念:多台机器上可以执行同一个爬虫程序,实现网站数据的分布爬取2.原生的scrapy是不可以实现分布式式爬虫  a)调度器无法共享  b)管道无法共享3.scrapyredis组件:专门为scrapy开发的一套组件,该组件可以让scrapy实现分布式  a)pipinstallscrapyredis4.分布式爬取的流程:
Stella981 Stella981
3年前
Scrapy框架
\TOC\1\.Scrapy介绍1.1.Scrapy框架Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。!(http://ccszt.com.cn/python/%E7%88%AC%E8%99%AB/file/images/
Stella981 Stella981
3年前
Scrapy笔记(1)
Scrapy笔记01入门篇  Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。其最初是为了页面抓取(更确切来说,网络抓取)所设计的,也可以应用在获取API所返回的数据(比如WebServices)或者通用的网络爬虫。  Scr
Stella981 Stella981
3年前
Scrapy_redis
简介scrapy\_redis是一个基于Redis的Scrapy组件,用于scrapy项目的分布式部署和开发你可以启动多个spider对象,互相之间共享有一个redis的request队列,最适合多个域名的广泛内容的爬取特点分布式爬取分布式数据处理爬取到的item数据被推送到redis中,这意味着你可以启动尽可能多的item处理程序
Scrapy爬虫:利用代理服务器爬取热门网站数据
在当今数字化时代,互联网上充斥着大量宝贵的数据资源,而爬虫技术作为一种高效获取网络数据的方式,受到了广泛的关注和应用。本文将介绍如何使用Scrapy爬虫框架,结合代理服务器,实现对热门网站数据的高效爬取,以抖音为案例进行说明。1.简介Scrapy是一个强大
小白学大数据 小白学大数据
1个月前
Python爬虫案例:Scrapy+XPath解析当当网网页结构
引言在当今大数据时代,网络爬虫已成为获取互联网信息的重要工具。作为Python生态中最强大的爬虫框架之一,Scrapy凭借其高性能、易扩展的特性受到开发者广泛青睐。本文将详细介绍如何利用Scrapy框架结合XPath技术解析当当网的商品页面结构,实现一个完
小白学大数据
小白学大数据
Lv1
男 · 亿牛云 · python技术
宁为代码类弯腰,不为bug点提交!
文章
116
粉丝
5
获赞
18