初试爬虫【爬虫实验获取网络小说】
文章目录:
- 重现实验
- 实验环境
- 实验目的
- 实验阶段一:【获取小说某章信息】
- 实验阶段二:【获取信息的有效内容】
- 实验阶段三:【获取小说的所有目录及链接】
- 实验阶段四:【获取主目录信息中的有效内容】
- 实验阶段五:【获取整篇小说内容】
- 注意
重现实验:
- 此文章是笔者想重现某博主的爬虫实验的过程中,出现的问题及处理方法,以及知识点
- 原实验链接:https://blog.csdn.net/c406495762/article/details/78123502
实验环境:
- windows 10
- python3.5.1
- python编辑器Geany
实验目的:
- 使用爬虫技术下载笔趣阁中《一念永恒》小说
实验阶段一:【获取小说某章信息】
- 第一:使用浏览器打开《一念永恒》网页窗口,笔者使用的url为:https://www.biquge5200.cc/38_38857/15054739.html
- 第二:进入到如下页面,同时检查该页面的源代码,小说内容的源代码部分截图,如下所示:

- 第三:根据源代码编写python脚本获取此章小说信息
- 获取条件:安装requests
-
pip install requests #以管理员身份打开CMD,并运行此命令;若报错,可将默认的超时时间调大,在笔者其他博文中有提到
-
- 获取条件:安装requests
- 第四:运行以下脚本即可获得此章小说的内容
-
# _*_ coding:UTF_8 _*_ import requests if __name__ == '__main__': target = "https://www.biquge5200.cc/38_38857/15054739.html" req = requests.get(url=target) print(req.text)
-
代码运行过程中报错处理编码报错: print(req.text)改为: print((req.text).encode('gbk','ignore'))
-
效果如下图所示:
-
实验阶段二:【获取信息的有效内容】
- 第一:由阶段一脚本中返回的信息截图可知,除了文章的内容外,还包括了很多不需要的东西,此阶段就是如何只获取有用的信息,剔除不用的信息
- 第二:由下面截图可知,小说内容信息是从<div id="content"><p> 开始的,可通过下面的脚本获取正文内容,详细的原因叙述,可以参考博主借鉴的博文【博文在文章开头处】
![]()
-
第三:编写脚本的前提条件:
pip install beautifulsoup4 #以管理员身份打开CMD,并运行此命令;若报错,可将默认的超时时间调大,在笔者其他博文中有提到
- 第四:编写的脚本如下:
# -*- coding:UTF-8 -*- from bs4 import BeautifulSoup import requests if __name__ == '__main__': target = "https://www.biquge5200.cc/38_38857/15054739.html" req = requests.get(url = target) html = req.text bf = BeautifulSoup(html,"html.parser") #print(req.text) texts = bf.find_all('div',id = 'content')
print(texts[0].text.replace('\xa0'*8,'\t\n'))
- 第五:脚本解析:
- 导入模块
- BeautifulSoup(html,"html.parser") #指定以"html.parser"格式读取html内容
- bf.find_all('div',id = 'content') #查找id=“content”的div标签的所有内容
- print(texts[0].text.replace('\xa0'*8,'\t\n')) #剔除正文内容中的空格或者</p><p>符号
- 至此,我们通过爬虫获取了小说的某一章的内容了
实验阶段三:【获取小说的所有目录及链接】
- 第一:打开小说的主目录,url为:https://www.biquge5200.cc/38_38857/
- 第二:查看主目录网页的源代码,得到关键接入如下所示:

- 编写获取主目录的脚本如下所示:
# -*- coding:UTF-8 -*- from bs4 import BeautifulSoup import requests if __name__ == '__main__': target = "https://www.biquge5200.cc/38_38857/" req = requests.get(url = target) html = req.text div_bf = BeautifulSoup(html,"html.parser") div = div_bf.find_all('div',id = "list") print(div[0])
- 脚本获取结果如下所示:

实验阶段四:【获取主目录信息中的有效内容】
- 第一:由阶段三实验截图可知,返回的主目录信息包含了一些不需要的内容,而我们目标是获取每一章的章节名及其链接;通过观察可知符合条件的每一条信息均有"a"字符
- 第二:获取脚本如下:
# -*- coding:UTF-8 -*- from bs4 import BeautifulSoup import requests #import html5lib if __name__ == '__main__': target = "https://www.biquge5200.cc/38_38857/" req = requests.get(url = target) html = req.text div_bf = BeautifulSoup(html,"html.parser") div = div_bf.find_all('div',id = "list") a_bf = BeautifulSoup(str(div[0]),"html.parser") a = a_bf.find_all('a') for each in a: print(each.string, each.get('href'))
- 第三:脚本返回的结果为:

【章节顺序错乱,这问题笔者暂时未找到原因及处理方法,但不影响后面的小说获取】
实验阶段五:【获取整篇小说内容】
- 第一:整合代码
# -*- coding:UTF-8 -*- from bs4 import BeautifulSoup import requests,sys,time """ 类说明:下载《笔趣看》网小说《一念永恒》 Parameters: 无 Returns: 无 Modify: 2019-12-21 """ class downloader(object): def __init__(self): self.target = 'https://www.biquge5200.cc/38_38857/' #小说的主目录URL self.names = [] #存放章节名 self.urls = [] #存放章节链接 self.nums = 0 #章节数 """ 函数说明:获取下载链接 Parameters: 无 Returns: 无 Modify: 2019-12-22 """ def get_download_url(self): req = requests.get(url = self.target) html = req.text div_bf = BeautifulSoup(html,"html.parser") div = div_bf.find_all('div', id = "list") a_bf = BeautifulSoup(str(div[0]),"html.parser") a = a_bf.find_all('a') self.nums = len(a[9:]) #剔除不必要的章节,并统计章节数,根据情况 for each in a[9:]: self.names.append(each.string) self.urls.append(each.get('href')) """ 函数说明:获取章节内容 Parameters: target - 下载连接(string) Returns: texts - 章节内容(string) Modify: 2019-12-22 """ def get_contents(self, target): req = requests.get(url = target) html = req.text bf = BeautifulSoup(html,"html.parser") texts = bf.find_all('div',id = 'content') texts = texts[0].text.replace('\xa0'*8,'\n\n') return texts """ 函数说明:将爬取的文章内容写入文件 Parameters: name - 章节名称(string) path - 当前路径下,小说保存名称(string) text - 章节内容(string) Returns: 无 Modify: 2019-12-22 """ def writer(self, name, path, text): write_flag = True with open(path, 'a', encoding='utf-8') as f: f.write(name + '\n') f.writelines(text) f.write('\n\n') if __name__ == '__main__': dl = downloader() dl.get_download_url() print("《一念永恒》开始下载:") for i in range(dl.nums): time.sleep(0.1) #此处是笔者根据自身环境加入的,因为文件写入太快,脚本老是报错 #print(dl.urls[i]) try: #此处是冗余操作 dl.writer(dl.names[i],'一念永恒.txt',dl.get_contents(dl.urls[i])) sys.stdout.write("已下载:%.3f%%" % float(i/dl.nums*100) + "\r") except IndexError: continue sys.stdout.flush() print("《一念永恒》下载完成")
- 效果:


- 至此,我们就能通过简单爬虫获取一部小说了
【注意】
UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("html.parser").
This usually isn't a problem, but if you run this code on another system, or in a different virtual environment,
it may use a different parser and behave differently.
用户警告:没有指定解析器,所以自动采用了HTML解析器。这不是一个问题,但是如果你在其他系统或虚拟环境下运行该代码,可能采用其他的解析器,导致不同的运行结果
解决办法:指定HTML解析器
BeautifulSoup(res.text, "html.parser")



浙公网安备 33010602011771号