python:爬取网络小说,看这一篇就够了

news2024/11/30 2:38:48

说明:

        本教程仅供于学习研究使用,请勿用于其他用途。

软件安装:

官网下载visual studio Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器 (microsoft.com)

点进网页后下拉找到个人免费版本。点击下载即可。

1:找到浏览器下载位置,2:选择打开下载文件位置、3:选择双击运行安装程序

点击继续

等待下载完成后,勾选对python 的开发。

最后等待安装完毕即可。

新建工程:

一般安装完成后桌面是没有图标的的我们要去系统栏进行搜索。

选择创建新项目。

1、点击下拉选项,2、找到python 项目

1、选择python应用程序,2、点击确定

1、程序名称,2、程序存放位置,可自行修改,3、勾选,4、创建

创建后如以下界面:

输入测试代码:

print("hello world")

点击启动按钮

查看运行结果。

到此我们的新建工程就完毕。

导入python 包:

需要导入的第三方包有两个,是requests和BeautifulSoup,其中一个是用于网页请求的,一个是网页解析的。

import requests
from bs4 import BeautifulSoup

直接运行会报以下错误。

错误的含义是没有找到对应的模块。我们要先下载相关的第三方包。

首先我们关闭调试模式后,点击工具-》python-》python环境

1、右侧输入requests,2、点击安装运行命令 pip install requests

如果弹出提升权限点击立即提升即可

显示此提升表明安装第三方包成功了

同样的步骤导入bs4

如果是其他编译环境就就采用以下命令即可。

pip install requests
pip install bs4

 判断爬取网页的编码格式:

定义一个字符串变量内容为需要爬取的小说主页。

# 小说的URL
url = 'https://www.nfxs.com/book/126295/'

字符串来源于百度搜索

 其他小说的话需要更换这个即可。

首先发起一个请求,并通过BeautifulSoup解析出来。

# 请求的URL是'url',这里的'url'只是一个占位符,你需要把实际的URL替换进去  
response = requests.get(url)  
# 设置响应的编码为'utf-8',这样获取到的文本内容就会是'utf-8'编码  
response.encoding = 'utf-8'  
  
# 导入BeautifulSoup库,这个库是Python中用来解析HTML或XML的库  
# 用BeautifulSoup库的'html.parser'解析器来解析从URL获取到的HTML内容  
soup = BeautifulSoup(response.text, 'html.parser')  
  
print(soup)

运行结果如下这是编码格式正确可以进行下一步了。

文中没有乱码是一个正常的页面返回。

下面是编码格式错误的,我们需要手动调整。

最常用的两种格式。

response.encoding = 'utf-8'
或者
response.encoding = 'gb2312'

到这里我们的编码格式就能确定下来了。

 获取小说章节链接及标题:

我们将执行的结果网上拉就可看到每个章节的前面带的有他的链接。

接下来我们要将其取出来,写入以下代码。第一次滤除其他数据

#找到HTML文档中的所有<a>标签(即所有链接)
soup.links = soup.find_all('a')

#遍历所有链接
# 获取小说的章节链接
for a in soup.links:
    print(a)

加入以上代码后输出,我们发现还有一些其他数据

我们通过修改遍历代码将其他的滤除掉.

## 获取小说的章节链接
for a in soup.links:
    if '.html' in str(a):
        print(a)

通过判断其中是否包含'.html'字符,来将其他滤除掉。

我们再次运行。

 

我们发现其中还是有两个我们不想要的数据。再次修改滤波代码。 

滤除第一种的时候,我们只需要将章节这个也加入判断即可,滤除第二种错误数据我们就需要强行固定序列了,比如我们强行让它从第一章开始。代码如下:

# 获取小说的章节链接
x=1
for a in soup.links:
    if '.html' in str(a) and "第"+str(x)+"章" in str(a):
        print(a)
        x=x+1

再次运行查看结果。

报错咯 ,因为我们用了中文字符,这个是python 编码文件问题。我们在第一行加一行代码:

# coding: utf-8  

再将文件改成utf-8的编码格式即可。

首先找到工具->自定义

命令-》文件-》添加命令

文件-》高级保存选项-》确定

 关闭窗口:

 我们将文件保存为utf-8模式即可。

选择编码-》保存

再次运行,我发现此时只有501章了,小说其实有1000多章呢

我们可以直接去章节目录查看问题。原来是网站存在错别字。

我们只好再次修改我们将这个错误也加入代码中.

# 获取小说的章节链接
x=1
for a in soup.links:
    if '.html' in str(a) and ("第"+str(x)+"章" in str(a) or "弟"+str(x)+"章" in str(a)):
        print(a)
        x=x+1

再次运行代码。可以发现代码到可以到1000多章了。

 首先将链接从标签a中取出来。

# 获取小说的章节链接
x=1
for a in soup.links:
    if '.html' in str(a) and ("第"+str(x)+"章" in str(a) or "弟"+str(x)+"章" in str(a)):
        print(str(a['href']))
        x=x+1

运行结果如下。

我会发现其中链接不全,我们直接通过这种形式肯定不行。我们查看网站网页的命名格式。

我们每读取一章就要如何通过这个网址来获取,而不是上面那个地方的网页。

我们需要将

/book/13713/18785770.html

转化成下面这种模式 

https://www.biqubao2.com/book/13713/18785770.html

我们发现前面缺少的其实就是我们刚开始的链接,我们使用字符拼接即可。

修改后代码如下所示。

# 获取小说的章节链接
x=1
for a in soup.links:
    if '.html' in str(a) and ("第"+str(x)+"章" in str(a) or "弟"+str(x)+"章" in str(a)):
        tp=str(a['href'])
        print(url[:-12]+tp)
        x=x+1

运行代码结果:

最后修改代码我们将链接和章节名称保存起来。

# 获取小说的章节链接
x=1
#链接
chapter_links=[]
#章节名称
catalogue=[]

for a in soup.links:
    if '.html' in str(a) and ("第"+str(x)+"章" in str(a) or "弟"+str(x)+"章" in str(a)):
        tp=str(a['href'])
        chapter_links.append(url[:-12]+tp)
        catalogue.append(a.text)
        x=x+1
 
print(chapter_links)
print(catalogue)

运行后发现链接和我们的标题都被保存下来了。

获取小说并保存:

写入以下代码

# 初始化一个计数器,用于跟踪章节的序号  
i=0  
  
# 对章节链接进行遍历  
for link in chapter_links:  
  
    # 获取每一章的内容  
    chapter_response = requests.get(link)  
  
    # 设置响应对象的编码为utf-8,以正确处理获取到的文本数据  
    chapter_response.encoding = 'utf-8'  
  
    # 使用BeautifulSoup库解析获取到的响应文本,将其转化为一个BeautifulSoup对象  
    # BeautifulSoup是一个用于解析HTML和XML文档的Python库  
    chapter_soup = BeautifulSoup(chapter_response.text, 'html.parser')  
  
    # 在BeautifulSoup对象中寻找id为"myDiv"的div标签  
    # 这通常用于定位网页中的特定区域,以获取其内容  
    # 找到 id 为 "myDiv" 的 div 标签  
    div = chapter_soup.find('div', {'id': 'content'})  
  
    # 从找到的div标签中获取文本内容  
    chapter_text = div.get_text()  
  
    # 打开名为'novel.txt'的文件,以追加模式写入数据  
    # 如果文件不存在,将创建一个新文件  
    # 将章节内容写入文件  
    with open('寒门极品公子.txt', 'a', encoding='utf-8') as f:  
  
        # 将catalogue[i]的内容与一个换行符'\n'拼接,并写入到文件中  
        # catalogue可能是一个列表或其他类型的可索引对象,它包含了各章节的标题或其它标识信息  
        f.write(catalogue[i] + '\n')  
  
        # 将获取到的章节文本内容与一个换行符'\n'拼接,并写入到文件中  
        f.write(chapter_text + '\n')  
  
    # 打印出当前处理的章节编号和状态信息  
    print('第'+str(i)+'章下载完成')  

    time.sleep(5)  # 延时5秒 
# 当所有章节都处理完毕后,打印出小说下载完成的信息  
print('小说下载完成。')

代码的主要内容就是通过单个章节的链接获取到回复,之后找到居中格式的div ,获取其中的文本就是先说内容 这个时候我们将其写入到txt中,知道完成下载,其中延时是必须的,防止影响网站运行,从而导致踩缝纫机的风险。以下是运行结果。

最后等待下载完成即可.

最后贴一下完整源码。

# coding: utf-8 
import time   
import requests
from bs4 import BeautifulSoup

url='https://www.biqubao2.com/book/13713/'

# 请求的URL是'url',这里的'url'只是一个占位符,你需要把实际的URL替换进去  
response = requests.get(url)  
  
# 设置响应的编码为'utf-8',这样获取到的文本内容就会是'utf-8'编码  
response.encoding = 'utf-8'  
  
# 用BeautifulSoup库的'html.parser'解析器来解析从URL获取到的HTML内容  
soup = BeautifulSoup(response.text, 'html.parser') 

#找到HTML文档中的所有<a>标签(即所有链接)
soup.links = soup.find_all('a')

# 获取小说的章节链接
x=1
#链接
chapter_links=[]
#章节名称
catalogue=[]

for a in soup.links:
    if '.html' in str(a) and ("第"+str(x)+"章" in str(a) or "弟"+str(x)+"章" in str(a)):
        tp=str(a['href'])
        chapter_links.append(url[:-12]+tp)
        catalogue.append(a.text)
        x=x+1
 
i=0
for link in chapter_links:
    # 获取每一章的内容
    chapter_response = requests.get(link)
    chapter_response.encoding = 'utf-8'
    chapter_soup = BeautifulSoup(chapter_response.text, 'html.parser')
    # 找到 id 为 "myDiv" 的 div 标签  
    div = chapter_soup.find('div', {'id': 'content'}) 
    chapter_text = div.get_text()
    # 将章节内容写入文件
    with open('novel.txt', 'a', encoding='utf-8') as f:
        
        f.write(catalogue[i] + '\n')
        f.write(chapter_text + '\n')
        i=i+1
    print('第'+str(i)+'章下载完成')
    time.sleep(5)  # 延时5秒 
print('小说下载完成。')

好了,不多说了,我的小说下载好了,我看小说去了。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1095896.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第六章:TF-A学习

TF-A学习 TF-A初探如何获取系统源码移植过程中遇到的问题和解决方案编译报错&#xff1a;arm-none-linux-gnueabi-gcc: not foundTF-A 源码打补丁 遇到assume -R&#xff1f;[n] TF-A初探 为了保证安全 ARM 推出了 Arm Trusted Firmware 的可信固件&#xff0c;简称 TF-A。它…

windows环境cmake的nmake failed

windows环境cmake异常 问题如下&#xff1a; > cmake ..CMake Error at CMakeLists.txt:4 (PROJECT): Running nmake -?failed with:系统找不到指定的文件。CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage CMake Error: CMAKE_CXX_COMPILER not set, after…

中断机制-interrupt和isInterrupted源码分析、中断协商案例

当前线程的中断标识为true&#xff0c;是不是线程就立刻停止&#xff1f; 答案是不立刻停止&#xff0c;具体来说&#xff0c;当对一个线程&#xff0c;调用interrupt时&#xff1a; 如果线程处于正常活动状态&#xff0c;那么会将该线程的中断标志设置为true&#xff0c;仅此…

【C++】:关键字 命名空间 输入输出 缺省参数 函数重载 引用

【本节目标】 C关键字命名空间C输入&输出缺省参数函数重载引用 C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式等 熟悉C语言之后&#xff0c;对C学习有一定的帮助&#xff0c;本章节主要目标&#xff…

关于面试以及小白入职后的一些建议

面试的本质 面试的过程是一个互相选择的过程&#xff1b;面试官的诉求是&#xff0c;了解应聘者的个人基本信息、工作态度、专业能力及其他综合能力是否与公司招聘岗位匹配&#xff1b;面试者的诉求是&#xff0c;拿下招聘岗位offer&#xff0c;获得工作报酬&#xff1b; 面试…

【go学习笔记】Go errors 最佳实践

文章目录 一、Error Type1. Sentinel Error&#xff08;预定义Error字符串错误值&#xff09;1.1 缺点 2. Error types&#xff08;错误类型&#xff09;2.1 缺点 3. Opaque errors&#xff08;不透明错误&#xff09;3.1 Assert errors for behaviour, not type 二、Handling …

详解RocketMQ消息存储原理

本文基于RocketMQ 4.6.0进行源码分析 一. 存储概要设计 RocketMQ存储的文件主要包括CommitLog文件、ConsumeQueue文件、Index文件。RocketMQ将所有topic的消息存储在同一个文件中&#xff0c;确保消息发送时按顺序写文件&#xff0c;尽最大的能力确保消息发送的高性能与高吞吐…

SpringBoot实战(二十五)集成 Shiro

目录 一、Shiro 简介1.1 Shiro 定义1.2 Shiro 核心组件1.3 Shiro 认证过程 二、SpringBoot集成2.1 集成思路2.2 Maven依赖2.3 自定义 Realm2.4 Shiro 配置类2.5 静态资源映射2.6 AuthController2.7 User 实体2.8 用户接口类2.9 用户接口实现类2.10 OrderController&#xff08;…

手把手教你使用Python从零开始搭建感知器

大家好&#xff0c;今天本文将展示如何从零开始实现神经网络的最基本要素&#xff08;感知器&#xff09;&#xff0c;以及人工智能的基本模块背后的数学原理。 虽然人工智能和机器学习等术语已经成为流行词汇&#xff0c;每天都会听到或谈论这些概念&#xff0c;但它们背后的…

软件开发介绍

一、软件开发整体介绍 作为一名软件开发工程师&#xff0c;我们需要了解在软件开发过程中的开发流程&#xff0c;以及软件开发过程中涉及到的岗位角色&#xff0c;角色的分工、职责&#xff0c;并了解软件开发中涉及到的三种软件环境。 1.1 软件开发流程 第一阶段&#xff1a…

MQTT解读【全网最易懂】

目录 前言 一、MQTT相比于TCP长连接的优势 1、协议更标准 2、MQTT协议制定好了很多利于物联网的功能 3、理解数据内容&#xff0c;用数据产生价值 二、选择MQTT还是TCP长连接透传 1、原始的业务场景 2、端对端M2M场景——无人汽车 3、APP控制设备端场景——智能家居、智…

RK3588的GPU驱动和桌面环境

这里主要是以orange pi 5 plus为对象作一个简单的笔记 首先看rk3588的gpu介绍&#xff0c;它用的是ARM的GPU&#xff0c;支持openGL ES和openCL&#xff08;支持什么其实跟GPU驱动有关&#xff0c;arm官方闭源GPU驱动就只支持这两个&#xff09; opi官方提供了debian的xfce和…

Linux网络编程系列之服务器编程——多路复用模型

Linux网络编程系列 &#xff08;够吃&#xff0c;管饱&#xff09; 1、Linux网络编程系列之网络编程基础 2、Linux网络编程系列之TCP协议编程 3、Linux网络编程系列之UDP协议编程 4、Linux网络编程系列之UDP广播 5、Linux网络编程系列之UDP组播 6、Linux网络编程系列之服务器编…

ROS-6.参数的使用

参数的使用 参数服务结构命令行的使用方式运行小海龟命令介绍查看参数获取参数值设置参数保存参数到文件从文件导入参数 通过程序操作创建节点修改cmake编译运行 参数服务结构 ros中存在参数服务管理服务&#xff0c;管理这所有参数&#xff0c;所有节点剋订阅和发布这些节点 …

第三章 内存管理 三、覆盖与交换

目录 一、覆盖技术 二、交换技术 三、总结 一、覆盖技术 1、在覆盖技术中&#xff0c;我们要找到程序的调用结构。 2、因为这些程序不可能同时被调用&#xff08;互斥调用&#xff09;&#xff0c;所以我们只需要选出需要空间最大的程序。 3、在物理内存中开拓一片与最大程…

ABB机器人关于重定位移动讲解

关于机器人如何重定位移动&#xff0c;首先来看一下示教器上的重定位移动是在哪。 从图中所示的坐标位置和操纵杆方向得知&#xff0c;重定位的本质是绕X、Y、Z轴的旋转。那么实现跟摇杆一样的操作&#xff0c;就可以通过改变当前位置的欧拉角来实现&#xff0c;参考Rapid指令…

小米笔记本Pro 15.6“频繁蓝屏解决办法

一、事情的缘起 2020年3月&#xff0c;我在小米官网购买这个笔记本&#xff0c;型号为&#xff1a;小米笔记本Pro 15.6" 2019款 四核i5 8G MX250 深灰。当时买这款笔记本&#xff0c;也是考虑到它屏幕比较大&#xff0c;而且配置也不错&#xff0c;四核8G的内存也足够我办…

测试需要写测试用例吗?

如何理解软件的质量 我们都知道&#xff0c;一个软件从无到有要经过需求设计、编码实现、测试验证、部署发布这四个主要环节。 需求来源于用户反馈、市场调研或者商业判断。意指在市场行为中&#xff0c;部分人群存在某些诉求或痛点&#xff0c;只要想办法满足这些人群的诉求…

并行Stream的性能测试

final long count 200_000_000;Random random new Random();//创建2亿条的listList<Integer> list Stream.generate(() -> random.nextInt(20)).limit(count).collect(Collectors.toList());// 顺序处理long startTime System.currentTimeMillis();list.stream().…

C语言联合体和枚举

C语言联合体和枚举 文章目录 C语言联合体和枚举一、联合体①联合体简介②联合体大小的计算 二、枚举 一、联合体 ①联合体简介 union Un {char c;int i; };像结构体一样&#xff0c;联合体也是由⼀个或者多个成员构成&#xff0c;这些成员可以不同的类型。但是编译器只为最大…