1
/ 写在前面的话 /
如今网络上很多小说网站都有免费的小说阅读,但是它不提供下载全本的服务,目的也是为了获得更多的流量,资源君就不服了,今天刚好看到一个小说网站,就想弄本小说来看看,于是拿起电脑,噼里啪啦写了一个下载小说的Python代码,下面我来带大家读一读代码(具体的代码讲解我已经写在注释里了)!
2
/ 用爬虫来下载小说 /
1.首先第一步,导入两个我们需要的包
# 用于获取网页的html
from urllib import request
# 用于解析html
from bs4 import BeautifulSoup
2. 我们来分析一下,我们要抓取的小说页面
(广告还挺显眼的)
我们看下这个界面然后再来看看html源码
我们会发现,我框住的地方正是我们所需要的地方,但是注意上面的最新章节和我们的正式的小说目录也就是下面的地方,他们都处于<div class='box1'>中,待会大家可以看看我是怎么处理的。
然后再来看看小说阅读的界面:
这个界面就很简单了,我们来看看HTML源码:
很容易看到<h1>标签中的正是每一章的标题,<p>标签中的也就是正文
OK,经过我们初步分析,我们可以开始写代码了!
3.首先我们写出获取网页html源码的一个方法:
# 得到网页的html
def getHtml(url):
url = url
res = request.urlopen(url)
res = res.read().decode()
# print(res)
return res
这个方法传入一个url,会返回一个html源码
4.然后我们再来写一下,获取整本小说所有章节的链接的方法:
# 解析小说章节页面,获取所有章节的子链接def jsoupUrl(html):
# 获取soup对象
url_xiaoshuo = BeautifulSoup(html)
# 因为我们要拿取class为box1中的div
class_dict = {'class': 'box1'}
url_xiaoshuo = url_xiaoshuo.find_all('div', attrs=class_dict)
# 因为分析html中的代码可以发现div的class为box1的有两个,通过上面的代码返回的是一个list格式的结果,所以下面的索引应该是1
# 我们要获取li中的值,所以find_all,这个方法返回的是一个list集合
url_xiaoshuo = url_xiaoshuo[1].find_all('li')
# print(url_xiaoshuo)
# 创建一个集合,用于存放每个章节的链接
url_xs = []
for item in url_xiaoshuo:
# 获取每个元素中的href值
url = item.a['href']
# 将值传入url_xs集合中
url_xs.append(url)
return url_xs
具体的解释,我已经写在注释里了,不懂的可以在公众号后台留言
5.我们获取到每个章节的链接之后,我们就需要把每一章节的内容给弄下来并且把它写入到txt文本而且每个文本的标题为章节的标题
# 解析小说每个章节的的主要内容
def jsoupXiaoshuo(list):
for item in list:
html = getHtml(item)
html = BeautifulSoup(html)
# 获取小说标题
title = html.h1.get_text()
xiaoshuo = html.find_all('p')
for item in xiaoshuo:
str = item.get_text()
# open中的第二个参数是让每一次的字符串接连到上一个字符串,千万不能是w
with open(title + '.txt', 'a') as f:
f.write(str+'\n')
6.最后我们再main方法中运行这几个方法即可:
if __name__ == '__main__':
html = getHtml("http://www.136book.com/dadaozhaotian/")
url_xs = jsoupUrl(html)
jsoupXiaoshuo(url_xs)
运行出来的结果:
大功告成!