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

python解析小说

前言

在信息爆炸的时代,网络上充斥着大量的小说资源,让人们能够随时随地尽享阅读的乐趣。然而,有些小说网站要求用户付费才能获取完整的内容,这给许多人带来了困扰,尤其是像我这类对金钱概念模糊的人。不过,我们也许可以尝试使用爬虫技术来获取我们想要的小说内容。

然而,实际操作中,我们可能会遇到各种各样的困难,使得爬取小说的任务变得异常艰难,让人望而却步。下面是我在准备过程中考虑到的一些问题。

首先,我们需要面对的第一个问题就是网站的动态加载。许多小说网站为了提高用户体验,会使用JavaScript来动态加载和展示内容。这使得我们传统的爬虫方法无法有效地抓取我们需要的数据。为了解决这个问题,

其次,我们需要面临的问题是网站的防爬机制。一些小说网站为了防止机器人访问,会设置防爬机制,比如检测请求的频率、检查User-Agent等。我通过调整爬虫的请求频率、伪装User-Agent以及随机化请求头等方式来规避这些防爬机制。

最后,我们需要处理的问题是内容的版权问题。在进行爬取的过程中,我们必须尊重网站的版权规定,避免侵犯他人的知识产权。

第一步.选择合适的爬取工具

我最初的尝试是使用Python中的BeautifulSoup模块。这是一个非常强大的HTML解析库,能够方便地从网页中提取出需要的信息。然而,在爬取小说网站时,我很快发现了问题。这些小说网站通常会使用JavaScript动态加载内容,而BeautifulSoup并不能很好地处理这种情况。因此,我需要寻找一种能够处理JavaScript动态加载内容的爬虫工具。

第二步.尝试使用Selenium库

为了应对动态加载的问题,我转而使用了Selenium库。Selenium可以模拟浏览器的行为,包括执行JavaScript代码,从而能够获取到完整的页面内容。我发现,通过Selenium,我可以获取到想要的小说内容,但是又遇到了新的问题。

第三步:Webdriver变量路径安装问题

在使用Selenium时,我需要指定一个Webdriver,它相当于一个浏览器的实例,用于加载网页并执行操作。然而,我在安装过程中遇到了Webdriver变量路径的问题。我尝试了多种方法,但始终无法成功地将Webdriver正确地配置到我的环境中。

在我尝试解决Webdriver变量路径问题时,我遇到了一些挫折。我尝试按照Selenium官方文档的指导,将Webdriver的路径设置到浏览器的安装目录下,但仍然无法成功。

后来,我意识到问题可能出在环境变量上。我需要在系统环境变量中添加Webdriver的路径,才能让Selenium正确地找到并使用它。于是,我按照这个思路进行了操作,并成功地将Webdriver正确地配置到了我的环境中。

具体来说,我按照以下步骤操作:

法①

  1. 找到Webdriver的路径。

    在Windows系统中,Webdriver通常位于浏览器的安装目录下,例如:C:\Program Files (x86)\Mozilla Firefox\geckodriver.exe
  2. 在系统环境变量中添加Webdriver的路径。

    在Windows系统中,可以在系统属性->高级->环境变量中添加新的系统环境变量,将Webdriver的路径添加到其中
  3. 重新启动Selenium并测试是否成功。

 法②

1. 下载合适版本的Webdriver,并将其解压到一个目录中。(我是解压到python安装目录下,记住复制一份并改名,添加变量才能成功)
2. 将Webdriver的路径添加到系统的环境变量中。这样,无论在哪个目录下,系统都能够找到Webdriver的位置。

通过以上步骤,我终于成功地将Webdriver正确地配置到了我的环境中,可以正常地使用Selenium进行网页内容的爬取了。

最终代码

注意事项:

1.一次只能下一本,如果要下一本你需要把txt文本提到一个文件夹中,清空。

2.一定要安装相应的库

import os
import re
from selenium import webdriver
from bs4 import BeautifulSoup
import time
from tqdm import tqdm# 作者信息
from termcolor import coloredauthor_name = "作者:O2Ethereal"
author_url = "https://gitee.com/o2ethereal"print(f"{author_name}\n{author_url}")
print("网站举例:\nhttps://www.biqukan8.cc/38_38836/")# 用户输入小说目录下载地址
directory_url = input("请输入小说目录下载地址(回车键继续):")# 创建 Edge WebDriver,使用无痕模式
options = webdriver.EdgeOptions()
options.add_argument('--inprivate')
driver = webdriver.Edge(options=options)# 打开小说目录页面
driver.get(directory_url)
time.sleep(5)  # 等待页面加载# 获取页面源码
directory_html = driver.page_source
soup = BeautifulSoup(directory_html, 'html.parser')# 获取章节链接和标题
chapter_data = []
in_content_div = False
for element in soup.find_all(['dt', 'dd']):if "正文卷" in element.get_text():in_content_div = Trueelif in_content_div and element.name == 'dd':link = element.a.get('href')if link.startswith("/"):link = link[1:]  # 去除开头的斜杠chapter_url = f"https://www.biqukan8.cc/{link}"title = element.a.get_text()chapter_data.append((title, chapter_url))# 创建文件夹
output_folder = "novel_chapters"
os.makedirs(output_folder, exist_ok=True)# 正则表达式模式
pattern = re.compile(r'(我们会尽快处理\.举报后请耐心等待,并刷新页面。|\(\)章节错误,点此举报\(免注册\)我们会尽快处理\.举报后请耐心等待,并刷新页面。|笔趣阁手机版阅读网址:m\.biqukan8\.cc|请记住本书首发域名:www.biqukan8.cc。)')# 保存每个章节的内容到文件
for idx, (title, link) in enumerate(tqdm(chapter_data, desc="Downloading", ncols=100, bar_format="{l_bar}%s{bar:10}{r_bar} {percentage:3.0f}%",colour="cyan"), start=1):# 打开章节页面driver.get(link)time.sleep(0.5)  # 等待页面加载chapter_soup = BeautifulSoup(driver.page_source, 'html.parser')# 获取章节内容content_div = chapter_soup.find('div', class_='showtxt')if content_div:chapter_content = content_div.get_text()# 去除章节链接chapter_content = chapter_content.replace(link, "")# 使用正则表达式清理文本chapter_content = re.sub(pattern, '', chapter_content)# 去除空行lines = [line.strip() for line in chapter_content.split('\n') if line.strip()]cleaned_content = '\n'.join(lines)# 保存到文件file_name = os.path.join(output_folder, f"{title}.txt")with open(file_name, "w", encoding="utf-8") as file:file.write(cleaned_content)print(f"Downloading:   {idx / len(chapter_data) * 100:.0f}%|▏ {title}  已下载")# 关闭 WebDriver
driver.quit()

效果

 好东西,偷偷用

相关文章:

python解析小说

前言 在信息爆炸的时代,网络上充斥着大量的小说资源,让人们能够随时随地尽享阅读的乐趣。然而,有些小说网站要求用户付费才能获取完整的内容,这给许多人带来了困扰,尤其是像我这类对金钱概念模糊的人。不过&#xff0…...

SQL Server 执行报错: “minus“ 附近有语法错误。

sql server 执行带 minus 的语句一直报错,如下图: 找了好久才知道minus是Oracle里面的语法,SQL server 应用 EXCEPT。...

kali linux查看局域网下所有IP,并对指定IP攻击

kali linux查看局域网下所有IP,并对指定IP实施局域网内攻击 首先我们打开我们熟悉的kali linux操作系统,利用指令: ifconfig来确认本机的ip地址 确认了本机的ip地址之后,利用一下的指令查看局域网下所有ip: fping -g 本机IP地址…...

基于QCC_BES 平台的LMS自适应滤波算法实现

+我V hezkz17进数字音频系统研究开发交流答疑群(课题组) LMS算法是最小均方(Least Mean Square)算法的缩写。它是一种自适应滤波算法,常用于信号处理、系统辨识和自适应滤波等领域。 LMS算法的目标是通过对输入信号和期望输出信号之间的误差进行最小化,来调整滤波器的权重…...

大疆飞卡30运载无人机技术分享

大疆飞卡30是大疆公司面向运输领域推出的一款专业运载无人机。它采用了优秀的设计,装备了多种先进传感器,以解决运输中的难题。以下我们来了解一下其主要特点: 【应用领域】 飞卡30适用于山地救灾、农业化肥施用、工程材料运送等交通不便的山区应用,也适用于海岛联通等运输链…...

单片机的串口通信

今天,完整地总结一下普中科技的单片机的串口通信的硬件与编程,记录一下以后如果需要也比较方便捡起来。 单片机的串口部分的电路图。开发板上集成了 1 个串口通信电路,是 USB 转串口模块,它既可下载程序也可实现串口通信功能。 对…...

【C/C++】STL学习所得

文章目录 STL 框架核心组成部分STL 序列容器分类STL 容器适配器分类STL 迭代器分类STL 中一些易混淆知识点一些重要的简述 STL 框架核心组成部分 算法容器迭代器适配器空间配置器访函数 STL 序列容器分类 vectorqueuelistarrayforward_list STL 容器适配器分类 stack 栈qu…...

leetcode几个数组题

数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合 因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址 二分查找 移除元素 有序数组的平方 209.长度最小的子数组...

【LeetCode】模拟实现FILE以及认识缓冲区

模拟实现FILE以及认识缓冲区 刷新缓冲逻辑图自定义实现如何强制刷新内核缓冲区例子 刷新缓冲逻辑图 自定义实现 mystdio.h #pragma once #include <stdio.h>#define NUM 1024 #define BUFF_NOME 0x1 #define BUFF_LINE 0x2 #define BUFF_ALL 0x4typedef struct _MY_FIL…...

【Terraform学习】使用 Terraform 将 EC2 实例作为 Web 服务器启动(Terraform-AWS最佳实战学习)

使用 Terraform 将 EC2 实例作为 Web 服务器启动 实验步骤 前提条件 安装 Terraform&#xff1a; 地址 下载仓库代码模版 本实验代码位于 task_ec2 文件夹中。 变量文件 variables.tf 在上面的代码中&#xff0c;您将声明&#xff0c;aws_access_key&#xff0c;aws_secr…...

WebGL 变量uniform、gl.getUniformLocation、gl.uniform4f及其同族函数相关

目录 uniform变量命名规范 获取 uniform 变量的存储地址 gl.getUniformLocation 向uniform变量赋值 gl.uniform4f ​编辑 gl.uniform4f()的同族函数 demo&#xff1a;点击webgl坐标系的四个象限绘制各自不同颜色的点 uniform变量命名规范 var FSHADER_SOURCE uniform vec4…...

【Visual Studio】生成.i文件

环境 VS版本&#xff1a;VS2013 问题 如何生成.i预编译文件&#xff1f; 步骤 1、打开VS项目属性&#xff0c;打开C/C\预处理器页面&#xff0c;【预处理到文件】选择是&#xff0c;开启。 2、生成文件如下。 3、正常编译需要关闭此选项。...

本地生活服务平台加盟哪家公司好?

本地生活的竞争从年初的火热到现在&#xff0c;已经进入了下半场&#xff0c;随着优胜劣汰的筛选&#xff0c;那么直到现在&#xff0c;想做本地生活服务平台加盟&#xff0c;哪家公司比较好呢&#xff0c;应该如何选择呢&#xff1f; 首先我们得弄懂&#xff0c;我们加盟本地…...

css-grid使用

文章目录 grid概念容器和项目网格轨道&#xff1a;网格单元网格线 使用分配item空间大小对于子元素的意义 行列指定隐式和显示网格默认排列 grid容器属性grid-template-rows: 100px 100px 200px;grid-template-columns: 100px 100px 100px;grid-auto-rows: 200pxgrid-column-ga…...

springBoot提取一个List<?>中的某个字段集合

import cn.hutool.core.collection.CollUtil;PageResult prrecommendUserApi.queryRecommendUserList(dto.getPage(),dto.getPagesize(),userId);List<RecommendUser> items (List<RecommendUser>) pr.getItems(); //提取所有推荐的用户id List<Long> ids …...

【BUG】 ‘cv2.cv2‘ ‘wechat_qrcode_WeChatQRCode‘

首发博客地址 https://blog.zysicyj.top/ 报错内容 AttributeError: module cv2 has no attribute wechat_qrcode_WeChatQRCode 解决方法 pip install opencv-pythonpip install opencv-contrib-python 本文由 mdnice 多平台发布...

10 Mybatis

文章目录 1 概述1.1 什么是Mybatis?1.2 JDBC介绍(了解)1.2.1 问题分析1.2.2 技术对比 1.3 数据库连接池1.4 lombok 2 Mybatis基础操作2.1 准备2.2 删除2.2.1 日志输入2.2.2 预编译SQL2.2.2.1 介绍2.2.2.2 SQL注入2.2.2.3 参数占位符 2.3 新增2.3.1 主键返回 2.4 更新2.5 查询2…...

【PHP】PHP的面向对象编程

PHP面向对象编程是PHP编程的一个重要方向&#xff0c;它通过将数据和操作封装在对象中&#xff0c;使得代码更加模块化、可重用性和易于维护。本文将介绍PHP面向对象编程的基本概念、核心思想和常见应用&#xff0c;并探讨使用PHP面向对象编程时需要注意的问题。 一、概述 PH…...

Windows10突然出现音频无法正常运行的解决方法

文章目录 前言 一 问题描述 二 解决方法 2.1 下载完成之后选择安装 2.2 选择其他位置来安装 2.3 静静等待安装完成 三 升级Windows显卡和声卡 总结 前言 本文主要介绍Windows里面的音频出现问题的解决方法 一 问题描述 Windows使用好好的&#xff0c;突然就出现声卡出…...

Maven面试题大全及答案

1.什么是Maven&#xff1f; Maven使用项目对象模型(POM)的概念&#xff0c;可以通过一小段描述信息来管理项目的构建&#xff0c;报告和文档的软件项目管理工具。 Maven 除了以程序构建能力为特色之外&#xff0c;还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...