跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python

Python Scrapy 爬虫入门:爬取网络小说实战

使用 Python Scrapy 框架爬取网络小说的实战教程。通过安装 Scrapy 创建项目,解析起点中文网和 23 小说网的 HTML 结构,提取章节标题与正文内容,并按序号保存为本地文件。教程涵盖基础环境搭建、XPath 选择器应用及数据持久化方法,同时强调尊重版权与支持正版的重要性。

观心发布于 2025/2/7更新于 2026/5/2820 浏览
Python Scrapy 爬虫入门:爬取网络小说实战

Python Scrapy 爬虫入门:爬取网络小说实战

前言

网络小说资源丰富,有时需要本地保存以便离线阅读。本教程以初级案例为例,演示如何使用 Python 的 Scrapy 框架抓取小说内容。

声明:请尊重作者劳动成果,支持正版小说。

新建 Scrapy 爬虫项目

Scrapy 是 Python 的爬虫框架。使用以下语句安装 Scrapy:

pip install scrapy

安装完成后,打开命令行窗口,转到目标目录下,使用下面命令新建 Scrapy 项目:

scrapy startproject ebook

新建后会出现基础代码框架。进入项目目录并创建爬虫:

cd ebook
scrapy genspider example example.com

使用 genspider 根据模板创建一个爬虫,在项目的 spider 目录下会多一个 example.py 文件。

实例一:起点中文网

第一个例子选取起点中文网的一本小说。

(此处展示网页结构截图)

使用命令创建爬虫文件:

scrapy genspider qxzz qidian.com

将 start_urls 中的内容改为这本小说的地址。打开浏览器开发者工具查看页面结构。

爬取章节地址

在右侧窗口中找到目录所在的标签。每一章节的内容链接位于列表项中。

# -*- coding: utf-8 -*-
import scrapy

class QxzzSpider(scrapy.Spider):
    name = 'qxzz'
    allowed_domains = ['qidian.com']
    start_urls = ['https://book.qidian.com/info/1011146676/']

    def parse(self, response):
        # 获取目录列表
        pages = response.xpath('//div[@id="j-catalogWrap"]//ul[@class="cf"]/li')
        for page in pages:
            url = page.xpath('./child::a/@href').get()
            print(url)

程序编写完之后,在命令行运行下面语句查看结果:

scrapy crawl qxzz

如果遇到 "No module named win32api" 的错误,可执行 pip install pypiwin32。

爬取每章内容

从页面结构可以看出,整个章节在 main-text-wrap 标签中,章节名和正文分别位于不同的子标签内。修改后的代码如下:

# -*- coding: utf-8 -*-
import scrapy

class QxzzSpider(scrapy.Spider):
    name = 'qxzz'
    allowed_domains = ['qidian.com']
    start_urls = ['https://book.qidian.com/info/1011146676/']

    def parse(self, response):
        pages = response.xpath('//div[@id="j-catalogWrap"]//ul[@class="cf"]/li')
        for page in pages:
            url = page.xpath('./child::a/@href').get()
            req = response.follow(url, callback=self.parse_chapter)
            yield req

    def parse_chapter(self, response):
        title = response.xpath('//div[@class="main-text-wrap"]//h3[@class="j_chapterName"]/text()').get().strip()
        content = response.xpath('//div[@class="main-text-wrap"]//div[@class="read-content j_readContent"]').get().strip()

内容的保存

在爬取内容后,可以以 HTML 形式保存。为了排序方便,给文件名加序号。起点网在 li 标签内有 data-rid 属性可作为序号。

# -*- coding: utf-8 -*-
import scrapy

class QxzzSpider(scrapy.Spider):
    name = 'qxzz'
    allowed_domains = ['qidian.com']
    start_urls = ['https://book.qidian.com/info/1011146676/']

    def parse(self, response):
        pages = response.xpath('//div[@id="j-catalogWrap"]//ul[@class="cf"]/li')
        for page in pages:
            url = page.xpath('./child::a/@href').get()
            idx = page.xpath('./@data-rid').get()
            req = response.follow(url, callback=self.parse_chapter)
            req.meta['idx'] = idx
            yield req

    def parse_chapter(self, response):
        idx = response.meta['idx']
        title = response.xpath('//div[@class="main-text-wrap"]//h3[@class="j_chapterName"]/text()').get().strip()
        content = response.xpath('//div[@class="main-text-wrap"]//div[@class="read-content j_readContent"]').get().strip()
        filename = './down/%s_%s.html' % (idx, title)
        cnt = '<h1>%s</h1> %s' % (title, content)
        with open(filename, 'wb') as f:
            f.write(cnt.encode('utf-8'))

注意:需要在目录下新建 down 文件夹,否则可能会出错。

同一个网站,电子书网页的源代码架构通常一致,只需改变网址即可爬取该网站的其他电子书。爬取结束并保存后,可以通过 Sigil 等工具制作 epub 电子书或转换格式。

实例二:其他小说网站

第二个例子选择另一本小说,逻辑类似但选择器不同。

(此处展示网页结构截图)

目录和正文内容所在的标签如下:

(此处展示网页结构截图)

# -*- coding: utf-8 -*-
import scrapy

class DmhsSpider(scrapy.Spider):
    name = 'dmhs'
    allowed_domains = ['m.x23us.com']
    start_urls = ['https://m.x23us.com/html/51/51940/']

    def parse(self, response):
        pages = response.xpath('//div[@class="cover"]//ul[@class="chapter"]/li')
        for page in pages:
            url = page.xpath('./child::a/@href').get()
            idx = str(url[0:8])
            req = response.follow(url, callback=self.parse_chapter)
            req.meta['idx'] = idx
            yield req

    def parse_chapter(self, response):
        idx = response.meta['idx']
        title = response.xpath('//div[@class="content"]//h1[@id="nr_title"]/text()').get().strip()
        content = response.xpath('//div[@class="content"]//div[@class="txt"]').get().strip()
        filename = './down/%s_%s.html' % (idx, title)
        cnt = '<h1>%s</h1> %s' % (title, content)
        with open(filename, 'wb') as f:
            f.write(cnt.encode('utf-8'))

在该网站中没有 data-rid 属性,但发现章节网页地址的数字随章节号递增,因此截取地址中的数字来排序保存后的 HTML 文件。

结语

通过上述两个实例,掌握了使用 Scrapy 进行基础网页数据抓取的方法。实际应用中需注意网站的 robots 协议及相关法律法规,合理合法地使用爬虫技术。

目录

  1. Python Scrapy 爬虫入门:爬取网络小说实战
  2. 前言
  3. 新建 Scrapy 爬虫项目
  4. 实例一:起点中文网
  5. 爬取章节地址
  6. -- coding: utf-8 --
  7. 爬取每章内容
  8. -- coding: utf-8 --
  9. 内容的保存
  10. -- coding: utf-8 --
  11. 实例二:其他小说网站
  12. -- coding: utf-8 --
  13. 结语
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • NestJS 接口响应 message 编写规范与 API 提示标准化
  • C++ 测试与调试实战:保障代码质量与稳定性
  • Spring AI Tool 实现自然语言操作 MySQL 数据库详解
  • Microi 吾码低代码平台技术架构与集成实践
  • Docker 多容器编排:Compose 实战教程
  • 密码攻击实践:获取并破解 Net-NTLMv2 哈希(上)
  • C++ vector 深度剖析与模拟实现
  • Python 从 0 到 100 完整学习指南
  • GitHub Copilot 配合 Figma MCP 还原设计稿生成前端代码
  • 微信小程序接入 AI 服务实战:基于 Bmob SDK 实现智能对话
  • Java 响应式编程:Mono 接口深度解析
  • AI 幻觉深度解析:成因、风险与应对策略
  • Java Swing 拼图小游戏开发实战
  • Llama-3.2-3B 本地部署与 FlashAttention 加速实测
  • Windows 安装 Python 的最佳方案:或许你并不需要手动安装
  • 基于 FPGA 的千兆以太网接口设计与实现
  • Vue3 中点击方法提示不存在的问题排查与解决方案
  • PyTorch 文本引导图像生成与 Stable Diffusion 实践
  • 11 款常用 C++ 在线编译与运行平台推荐与对比
  • 如何降低 AIGC 检测率:15 个提示词优化写作风格

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online