使用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爬虫 文档、图片等数据抓取】

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

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

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

相关推荐
DES 仿真实践家几秒前
【Day 11-N22】Python类(3)——Python的继承性、多继承、方法重写
开发语言·笔记·python
云泽野5 小时前
【Java|集合类】list遍历的6种方式
java·python·list
技术小赵5 小时前
优化Facebook广告投放的五大关键策略
经验分享
IMPYLH6 小时前
Python 的内置函数 reversed
笔记·python
小赖同学啊8 小时前
物联网数据安全区块链服务
开发语言·python·区块链
码荼8 小时前
学习开发之hashmap
java·python·学习·哈希算法·个人开发·小白学开发·不花钱不花时间crud
风清再凯9 小时前
自动化工具ansible,以及playbook剧本
运维·自动化·ansible
深圳安锐科技有限公司9 小时前
深圳安锐科技发布国内首款4G 索力仪!让斜拉桥索力自动化监测更精准高效
运维·安全·自动化·自动化监测·人工监测·桥梁监测·索力监测
猫头虎9 小时前
猫头虎 AI工具分享:一个网页抓取、结构化数据提取、网页爬取、浏览器自动化操作工具:Hyperbrowser MCP
运维·人工智能·gpt·开源·自动化·文心一言·ai编程
SKYDROID云卓小助手9 小时前
无人设备遥控器之自动调整编码技术篇
人工智能·嵌入式硬件·算法·自动化·信号处理