说明:

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

软件安装:

官网下载visual studioVisual 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 requestsfrom bs4 import BeautifulSoup

直接运行会报以下错误。

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

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

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

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

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

同样的步骤导入bs4

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

pip install requestspip install bs4

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

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

# 小说的URLurl = '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文档中的所有标签(即所有链接)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=1for 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=1for 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=1for 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=1for 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 requestsfrom bs4 import BeautifulSoupurl='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文档中的所有标签(即所有链接)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=0for 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+1print('第'+str(i)+'章下载完成')time.sleep(5)# 延时5秒 print('小说下载完成。')

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