使用Python中的DrissonPage库爬取小说网站并保存章节内容(bqg)

前言

在这个教程中,我们将学习如何使用Python结合DrissionPage库来自动化浏览器操作,从而从一个小说网站(bqg)上抓取小说的章节链接和内容,并将这些内容保存到本地文件。本文将详细介绍整个过程,并提供完整的代码示例。

准备工作

在开始之前,请确保已经安装了以下Python库:

  • drissionpage:用于控制浏览器行为。
  • fake_useragent:生成随机用户代理字符串以避免被目标网站识别为自动化脚本。
  • osrandom:操作系统相关的功能和生成随机数。

可以通过pip命令安装所需的库:

bash 复制代码
pip install drissionpage fake_useragent

代码详解

1. 导入必要的模块

首先导入需要用到的Python标准库以及第三方库:

python 复制代码
import os  # 用于文件和目录操作
import random  # 用于生成随机数
import time  # 用于暂停程序执行
from fake_useragent import UserAgent  # 用于生成随机的用户代理字符串
from DrissionPage import ChromiumPage, ChromiumOptions  # 用于自动化浏览器操作

2. 定义获取章节链接的函数

定义一个名为fetch_links_data的函数,该函数负责打开指定的小说页面,提取所有章节的链接,并创建存储小说内容的目录。

python 复制代码
def fetch_links_data():
    co = ChromiumOptions()  # 创建Chromium选项实例
    user_agent = f"{UserAgent().random}"  # 生成随机的用户代理
    print(user_agent)  # 打印当前使用的用户代理
    co.set_user_agent(user_agent=user_agent)  # 设置浏览器的用户代理
    
    # 初始化ChromiumPage实例,使用上面设置的选项
    page = ChromiumPage(addr_or_opts=co)
    url = "https://www.3bqg.cc/book/9753/"  # 目标小说页面URL
    tab = page.new_tab(url)  # 在新的标签页中打开目标URL
    tab.wait.load_start()  # 等待页面加载开始
    novel_name = tab.ele('x://div[@class="info"]/h1').text  # 获取小说名称
    print(novel_name)  # 打印小说名称
    
    # 创建小说对应的目录,如果已存在则不创建
    novel_path = os.path.join(os.getcwd(), novel_name)
    os.makedirs(novel_path, exist_ok=True)
    print(novel_path)  # 打印小说存储路径
    
    last_link = tab.ele('x://div[@class="listmain"]/dl/dd[21]/a').attr('href')  # 获取最后一个章节链接
    print(last_link)  # 打印最后一个章节链接
    
    # 提取章节编号
    chapter_number = int(last_link.split('/')[-1].split('.')[0])
    # 构造所有章节的链接列表
    all_chapter_links = [f"{url}{i}.html" for i in range(1, chapter_number + 1)]
    print("所有链接获取完成")
    tab.close()  # 关闭当前标签页
    return all_chapter_links, novel_path  # 返回所有章节链接和小说目录路径

3. 定义下载章节内容的函数

接下来定义一个名为fetch_content_data的函数,它接收单个章节链接和存储路径作为参数,然后抓取该章节的内容并将其保存为文本文件。

python 复制代码
def fetch_content_data(link, novel_path):
    time.sleep(random.uniform(1, 3))  # 随机等待一段时间,避免过于频繁请求
    co = ChromiumOptions()
    user_agent = f"{UserAgent().random}"
    print(user_agent)
    co.set_user_agent(user_agent=user_agent)
    
    # 初始化ChromiumPage实例
    page = ChromiumPage(addr_or_opts=co)
    url = link  # 当前章节的URL
    tab = page.new_tab(url)
    tab.wait.load_start()
    chapter_name = tab.ele('x://div[@class="content"]/h1').text  # 获取章节标题
    print(chapter_name)  # 打印章节标题
    content = tab.ele('x://div[@class="Readarea ReadAjax_content"]').text  # 获取章节内容
    
    # 将章节内容写入到对应的小说目录下的文件中
    with open(f"{novel_path}/{chapter_name}.txt", 'w', encoding='utf-8') as f:
        f.write(content)

    tab.close()  # 关闭当前标签页

4. 主程序逻辑

最后,在主程序部分调用上述两个函数,实现对整个小说的抓取与保存。

python 复制代码
# 调用函数获取所有章节链接及小说路径
all_chapter_links, novel_path = fetch_links_data()

# 循环处理每一个章节链接
for link in all_chapter_links:
    fetch_content_data(link, novel_path)

运行结果

控制台输入

爬取小说章节内容

总结

以上就是利用Python进行网络爬虫抓取小说内容的一个简单案例。

如果有爬虫的需求的话可以到,【python爬虫 文档、图片等数据抓取】

请注意,希望合理设置请求间隔时间,避免对服务器造成过大负担。

本代码仅用于学习和研究目的,不得用于商业用途或其他非法活动。

使用者自行承担因不当使用代码而产生的任何法律责任。

相关推荐
神奇夜光杯16 分钟前
Python酷库之旅-第三方库Pandas(181)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
光明中黑暗17 分钟前
Python 学习笔记
笔记·python·学习
tang138976426 分钟前
Python(包和模块)
开发语言·python
正义的彬彬侠40 分钟前
绘制近似线性可分支持向量机的分类边界和支持向量
人工智能·python·机器学习·支持向量机·分类·svm
纪怽ぅ44 分钟前
LSTM——长短期记忆神经网络
python·深度学习·神经网络·算法·机器学习·lstm
yannan201903131 小时前
【算法】(Python)回溯算法
python·算法
心软且酷丶1 小时前
leetcode:面试题 05.07. 配对交换(python3解法)
python·算法·leetcode
bigbig猩猩1 小时前
基于python的语音识别与蓝牙通信的温控系统毕设项目
python·django·语音识别
山里灵活的狗_1 小时前
蓝桥杯练习笔记(十九-质数筛)
笔记·职场和发展·蓝桥杯
B站计算机毕业设计超人1 小时前
计算机毕业设计Python+大模型股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI
大数据·爬虫·python·深度学习·数据挖掘·数据分析·课程设计