全书网小说内容爬取

本篇主要记录的是关于小说网的简单爬取,并将内容保存至txt文件中。

前期准备

准备工作的话,一方面Python语言,另一方面就是几个Python库的使用:requests、bs4等。
关于这些库的具体用法,我这边就不描述了,详细的内容可见官方文档或某些博客:
requests:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html
bs4:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html

小说网链接:http://www.quanshuwang.com/list/1_1.html

小说模型

我是定义了一个小说类模型,用来存储或操作一篇小说的相关信息。

首先是,通过小说的一些数据信息对小说进行初始化:

1
2
3
4
5
6
7
8
def __init__(self, title=None, author=None, cover=None, desc=None, novel_url=None, chapters_url=None):
self.NovelTitle = title # 小说名
self.Author = author # 小说作者
self.CoverImgUrl = cover # 封面图片链接
self.Desc = desc # 小说内容的简短介绍
self.NovelUrl = novel_url # 小说跳转链接
self.ChaptersUrl = chapters_url # 小说目录链接
self.Chapters = [] # 小说所有章节(chapterTitle, chapterUrl)列表

之后,我简单定义了一个获取网页源码的方法:

1
2
3
4
5
# 读取传入参数url的网页源码
def readHtml(self, url):
html = requests.get(url) # 请求url
html.encoding = 'gbk'
return html.text

接着便是获取该小说所有章节的标题及章节链接:

1
2
3
4
5
6
7
# 获取该小说所有章节的(title, url)组成的列表Chapters
def getChaptersUrl(self):
html = self.readHtml(self.ChaptersUrl)
soup = BeautifulSoup(html, 'html.parser')
for chapter in soup.select(".chapterNum ul li a"):
self.Chapters.append((chapter.string, chapter['href'])) # 章节名及链接加入列表
return self.Chapters

最后便是通过章节链接,去访问该章节对应的小说内容,当然,里面还包括了将内容存入本地txt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 获取该小说某一章节的小说文本内容,并写入文件 chapter: (chapter_title, chapter_url)
def getOneChapterContent(self, chapter):
k = 0
obj = None
while k < 3: # 容错
html = self.readHtml(chapter[1])
soup = BeautifulSoup(html, 'html.parser')
obj = soup.find(attrs="mainContenr")
if obj:
break
k += 1
if not obj:
print('None')
return
content = obj.text
content_drop = content.replace("style5();", "").replace("style6();", "").replace('<br />', '\n').replace(u'\xa0', u' ').replace(u'\ufffd', u' ')
self.write2txt(chapter[0], content_drop)

其中,里面有调用了写入文本的方法:

1
2
3
4
5
# 写入txt,传入章节名和该章节对应的文本内容
def write2txt(self, chapter_name, content):
with open('Novels/' + self.NovelTitle + '.txt', 'a') as file:
print(self.NovelTitle + ' 正在写入 ' + chapter_name)
file.writelines(chapter_name + '\n\n' + content + '\n\n')

所有小说信息

在这边,我主要是获取链接页面中,所有小说的基本信息,例如小说名、作者、封面图片链接、内容简介、跳转链接等。
首先便是,基本的网页源码读取:

1
2
3
4
5
# 返回页面源码
def readHtml(url):
html = requests.get(url) # 请求url
html.encoding = 'gbk'
return html.text

接着是获取该页面上所有小说的基本信息:小说名、作者、封面链接、内容描述、跳转链接,返回信息列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 获取小说信息
def get_novels_info(url):
novels = []
html = readHtml(url)
soup = BeautifulSoup(html, 'html.parser')
for item in soup.select(".seeWell li"):
title = item.find(attrs='clearfix').text # 小说名
author = item.span.find_all('a')[1].text # 作者
coverImg = item.find('img')['src'] # 小说封面链接
desc = item.find('em').text.replace('\n', '').replace(' ', '') # 内容描述
novelUrl = item.span.find('a')['href'] # 小说跳转链接
#print(title, author, coverImg, desc, novelUrl)
novel = [title, author, coverImg, desc, novelUrl]
novels.append(novel)
return novels

这边是小说信息写入csv文件的方法:

1
2
3
4
5
6
# 将小说信息写入csv文件
def write2csv(novels):
with open("novels.csv", 'a', newline='') as file:
writer = csv.writer(file)
for novel in novels:
writer.writerow(novel)

之后便是获取小说跳转至目录的链接,并将该链接也添加至数据信息列表,并返回:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 获取小说跳转至章节的链接
def get_chapters_url(novel_list):
for novel in novel_list:
k = 0
obj = None
while k < 3:
html = readHtml(novel[-1])
soup = BeautifulSoup(html, 'html.parser')
obj = soup.find(attrs="reader")
if obj:
break
k += 1
if not obj:
novel.append('')
continue
chapters_url = obj['href']
novel.append(chapters_url)
return novel_list

最后便是实例化小说对象,然后获取所有章节链接,之后遍历访问它的小说内容:

1
2
3
4
5
6
7
def all_chapters_url(novel_list):
for novel in novel_list:
a_novel = ANovel(novel[0], novel[1], novel[2], novel[3], novel[4], novel[5]) # 初始化一个novel对象
a_novel.getChaptersUrl() # 获取该小说对象的所有章节的链接
#print(a_novel.Chapters[:10]) # 打印小说章节列表中的前10章
for chapter in a_novel.Chapters: # 遍历该小说的所有章节
a_novel.getOneChapterContent(chapter) # 获取某一章节的文本内容

调用运行

最后就是在main里调用运行即可:

1
2
3
4
5
6
7
if __name__ == '__main__':
url = 'http://www.quanshuwang.com/list/1_%s.html'
for page in range(1, 2): # range范围可修改
novelsObjList = get_novels_info(url % page)
novelsObjList = get_chapters_url(novelsObjList)
# write2csv(novelsObjList)
all_chapters_url(novelsObjList)

运行显示:
novel

小说下载:
pJRGdO.png

附上程序:https://github.com/asdfv1929/QuanshuNetNovelSpider

------------- 本 文 结 束 感 谢 您 的 阅 读 -------------
坚持原创技术分享,您的支持将鼓励我继续创作!
0%