当前位置: 首页 > article >正文

Scrapy 爬取 Bangumi 网站的分页与详情页数据

使用 Scrapy 爬取 Bangumi 网站的分页与详情页数据

项目简介

在本项目中,我们使用 Scrapy 框架实现了对 Bangumi 网站的分页与详情页数据的爬取。项目包括以下功能:

  1. 分页解析:爬取排名页面的动漫信息。
  2. 详情页解析:获取动漫的详细描述。
  3. 图片下载与处理:从资源网站下载图片,进行重命名后存储。
注意: 在之前, 已经讲过很多怎么去找请求, 怎么去爬取请求相关的内容, 一些基本的操作, 从这篇文章开始, 就不再赘述了。

功能实现

1. 分页与详情页爬虫

我们定义了一个名为 BangumiSpider 的 Scrapy 爬虫类,具体实现如下:

class BangumiSpider(scrapy.Spider):
    name = "bangumi"
    start_urls = ["https://bgm.tv/anime/browser?sort=rank"]
    page = 2
    count = 1

    def parse(self, response):
        lis = response.xpath('//ul[@id="browserItemList"]/li')
        for li in lis:
            title = li.xpath('.//a[@class="l"]/text()').get()
            info = li.xpath('.//p[@class="info tip"]/text()').get().replace(' ', '').replace('\n', '')
            fade = li.xpath('.//small[@class="fade"]/text()').get()
            detail_url = 'https://bgm.tv' + li.xpath('.//a[@class="l"]/@href').get()

            # 存储数据到 Item 对象
            item = Scrapy19Item()
            item['title'] = title
            item['info'] = info
            item['fade'] = fade
            
            # 发起详情页请求
            yield scrapy.Request(url=detail_url, callback=self.parse_detail, meta={'item': item})

        # 自动处理分页
        if self.page < 6:
            self.page += 1
            yield scrapy.Request(url=f'https://bgm.tv/anime/browser?sort=rank&page={self.page}', callback=self.parse)

    def parse_detail(self, response):
        content = ''.join(response.xpath('//div[@id="subject_summary"]/text()').getall())
        item = response.meta['item']
        item['content'] = content
        yield item
2. 数据存储

爬取的数据会被保存到 Excel 文件中,具体通过以下 Scrapy19Pipeline 实现:

class Scrapy19Pipeline:
    def open_spider(self, spider):
        if spider.name == 'bangumi':
            self.wb = openpyxl.Workbook()
            self.sh = self.wb.active
            self.sh.title = '番组计划1-5页数据'
            self.sh.append(['名称', '介绍', '评分', '简介'])

    def process_item(self, item, spider):
        if spider.name == 'bangumi':
            self.sh.append([item['title'], item['info'], item['fade'], item['content']])
        return item

    def close_spider(self, spider):
        if spider.name == 'bangumi':
            self.wb.save('番组计划.xlsx')

图片爬取

除了 Bangumi 数据外,我们还实现了对图片资源的爬取和保存。

爬取实现

ZzscSpider 爬虫负责图片链接和名称的获取:

class ZzscSpider(scrapy.Spider):
    name = "zzsc"
    start_urls = ["https://sc.chinaz.com/tupian/"]

    def parse(self, response):
        divs = response.xpath('//div[@class="item"]')
        for div in divs:
            img_url = 'https:' + div.xpath('./img/@data-original').get().replace('_s', '')
            img_name = div.xpath('./img/@alt').get()

            # 提交给管道
            item = ZZSCItem()
            item['img_name'] = img_name
            item['img_url'] = img_url
            yield item
图片管道

通过 ZZSCPipeline 管道完成图片下载和重命名:

class ZZSCPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        yield scrapy.Request(url=item['img_url'])

    def file_path(self, request, response=None, info=None, *, item=None):
        return item['img_name'] + '.png'

配置中设置了图片存储路径:

IMAGES_STORE = 'imgs'

总结

通过本项目,我们实现了 Scrapy 的多个核心功能:分页与详情页爬取、多源数据整合、数据存储以及图片下载和处理。这不仅提升了对 Scrapy 框架的理解,也为未来的爬虫开发提供了模板。如果您对项目有任何问题或建议,欢迎留言讨论!

以上就是Scrapy 爬取 Bangumi 网站的分页与详情页数据的所有内容了, 如果有哪里不懂的地方,可以把问题打在评论区, 欢迎大家在评论区交流!!!
如果我有写错的地方, 望大家指正, 也可以联系我, 让我们一起努力, 继续不断的进步.
学习是个漫长的过程, 需要我们不断的去学习并掌握消化知识点, 有不懂或概念模糊不理解的情况下,一定要赶紧的解决问题, 否则问题只会越来越多, 漏洞也就越老越大.
人生路漫漫, 白鹭常相伴!!!


http://www.kler.cn/a/509518.html

相关文章:

  • Linux虚拟化技术:从Xen到KVM
  • 微信小程序
  • 本地仓库管理之当前分支内的操作
  • 生成树机制实验
  • 纯代码实现给WordPress添加文章复制功能
  • springboot如何解析 Map 的泛型信息来确定要注入哪些 Bean?
  • unity——Preject3——摄像机动画
  • Java并发05 - AQS共享模式的数据结构
  • windows 搭建flutter环境,开发windows程序
  • 新星杯-ESP32智能硬件开发--ESP32的I/O组成
  • 《重生到现代之从零开始的C++生活》—— 类和对象1
  • “深入浅出”系列之FFmpeg:(3)音视频开发的学习路线和必备知识
  • Transformer 与注意力机制原理说明与面试笔试题
  • ASP.NET Core 基础知识---依赖注入(DI)---生命周期和作用域
  • 中国数字安全产业年度报告(2024)
  • 智慧家居环境监测与控制系统的研发与应用案例分析
  • Asp .Net Core 实现微服务:集成 Ocelot+Nacos+Swagger+Cors实现网关、服务注册、服务发现
  • Linux下level-ip安装及测试_4
  • SSL配置实验
  • ChatGPT提示词合集(国内大模型可参考使用)
  • 深入了解计算机网络中的路由协议与性能优化
  • 【Python】分析JVM的GC日志
  • 前端小案例——网页井字棋
  • 基于Matlab驱动CAN接口设备进行通信
  • 小程序疫苗预约网站系统ssm+论文源码调试讲解
  • C语言(1)—基础概念的详解