Python爬虫入门——简单的爬取小说

本文最后更新于:2020年7月6日 上午

概览:Python爬虫,非常简单的爬取一个小说网站。

前言

我找到的小说网站是无错小说网,网址是www.read8.net

这是一个免费小说网站,不需要登陆注册就能看小说,重要的是网站设计比较简单,网页结构并不复杂,非常适合拿来尝试爬虫。

要爬取的小说名叫《神武主宰》,作者鬼舞沙。之所以爬取这本书,是因为我与这本小说还稍微有点渊源。

高中的时候,这本书的小说作者在偶家中文网连载这本书,我开玩笑地给作者发帖,如果他把我一个同学地名字写进去,我就给他打赏一点小礼物,没想到作者还真的写了进去,后来偶家中文网倒闭了,我就再也没看过这本书。

最近突然想起了这件事,找到了这本书,没想到作者超乎我的想象,我原以为作者会安排一个龙套角色,活不过十章,没想到简单翻了一下,在小说的末尾还发现了那个名字,而且还是主角阵营比较重要的一员,真的是没有想到。

在此谢谢那位作者鬼舞沙。

网页结构

书籍链接: https://www.read8.net/dushu/41/41357/

这是这本小说的全部章节所在,所有章节的链接都存在于<dd>标签之中的<a>标签。

上图是小说的某一章,小说内容的主体都存在于一个id="content"<div>之中。

所以实现起来就很简单了。

先在小说的章节目录页中取得全部小说的章节名以及章节对应的链接。

然后依次爬取每一章小说,获取小说内容之后写入到一个txt文件之中。

得益于网页结构非常简单,所以这个爬虫也非常的简单。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# 目标:爬取无错小说网的一本小说的内容:https://www.read8.net/dushu/41/41357/

import requests
import time
from bs4 import BeautifulSoup

novel_title = [] #小说章节名称
novel_link = [] #小说章节链接

def getChapter(baseurl,novel_link_pre):
html = requests.get(baseurl) # 获取网页代码
soup = BeautifulSoup(html.text, 'html.parser') # html.parser为python自带的一个html解析器,

novelList = soup.find_all("dd") # 获取小说全部章节的链接,查看文件结构可发现都在dd标签之中
# print(novelList) # <dd><a href="/dushu/41/41357/15990720.html">第488章 十年</a></dd>

for title in novelList:
# print(title.get_text()) # 小说的章节名称
novel_title.append(str(title.get_text()))
# print(title.a['href']) # 小说的链接 /dushu/41/41357/15990708.html
# https://www.read8.net/dushu/41/41357/15990708.html
novel_link.append(str(novel_link_pre + title.a['href']))


# 爬取单独一章里的小说主体
def getChapterText(baseurl):
html = requests.get(baseurl)
soup = BeautifulSoup(html.text, 'html.parser')
text = soup.find(id="content") #内容
text = str(text.get_text())

text = text.replace("    ","\n  ") #增加换行
text = text.replace("天才一秒记住本站地址:https://www.read8.net","") #去除广告
text = text.replace("网上直接搜索: ”(阅)(读)(悦)” 20万本热门小说免费看,,精彩!","")
text = text.replace("章节错误,点此报送,报送后维护人员会在两分钟内校正章节内容,请耐心等待。","")
text = text.replace("转载请注明出处:https://www.read8.net","")
text = text.replace("《神武主宰》来源:", "")
text = text.replace("https://www.read8.net", "")

return text


# 将内容写入到txt文件中
def saveTxt(title,text,filename):
with open(filename, 'a',encoding='utf-8') as file:
file.write(title+"\n\n")
file.write(text)

def main():
baseurl = "https://www.read8.net/dushu/41/41357/" # 小说链接
novel_link_pre = "https://www.read8.net" # 链接前缀
novel_begin_index = 12 # 因为网站原因,前一部分是最新更新的章节,后面才是从第一章开始的内容

filename = "神武主宰.txt"

print("开始时间: %s" % time.ctime())

getChapter(baseurl, novel_link_pre)
for i in range(novel_begin_index,len(novel_title)):
text = getChapterText(novel_link[i])
saveTxt(novel_title[i],text,filename)
print("已经爬取:",novel_title[i],"进度: (",i-novel_begin_index+1,"/",len(novel_title)-novel_begin_index,")")
time.sleep(1)

print("结束时间: %s" % time.ctime())


if __name__ == '__main__':
main()

代码逻辑也非常简单,就不再赘述了。

因为我延迟等待1秒的原因,加之没有采用多线程爬取,所以爬取这个大概500章的小说,爬了接近20分钟。

……


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!