Python下载网络小说实例代码
作者:祥知道 发布时间:2023-08-01 18:22:17
看网络小说一般会攒上一波,然后导入Kindle里面去看,但是攒的多了,机械的Ctrl+C和Ctrl+V实在是OUT,所以就出现了此文。
其实Python我也是小白,用它的目的主要是它强大文本处理能力和网络支持,以及许多好用的库,不需要自己造轮子。而且真心比C方便啊(真是用了才知道)
分析要获取的网页
我要获取的主要是3个东西:
文章的标题。<div id="title">正文 第一章 北灵院</div>
文章正文内容。<div id="content" style="line-height: 150%; color: rgb(0, 0, 0);">
下一章的URL。<a href="11455541.html" rel="external nofollow" >下一页</a>
还有就是注意网页的编码,这个网页的编码是GBK,但在实际运行过程中,我用GBK会出现网页解码错误:
UnicodeDecodeError: ‘gbk' codec can't decode bytes in position 2-3: illegal multibyte sequence
所以换用了gb18030,问题就解决了,因为一般修仙网络小说中,会出现各种王霸之气的文字,你们懂得,所以需要更加牛逼文字库,你们感受一下博大精深的字符编码。
源代码
我就知道,大家要这个,哈哈哈。
主函数
#主函数
if __name__ == '__main__':
global numChapter
global NOVERL
NOVERL = '大主宰.txt'
#NOVERL = '择天记.txt'
NOVERL = '武动乾坤.txt'
if(NOVERL == '大主宰.txt'):
textStartURL = 'http://www.bxwx8.org/b/62/62724/11455540.html';#大主宰第一章的URL
textStartURL = 'http://www.bxwx8.org/b/62/62724/28019405.html';#第一千两百三十七章 鬼大师
else:
textStartURL = 'http://www.bxwx8.org/b/98/98289/17069215.html';#择天记第一章URL
textStartURL = 'http://www.bxwx8.org/b/98/98289/28088874.html';#择天记第七十八章 合剑术
textStartURL = 'http://www.bxwx8.org/b/35/35282/5839471.html';#武动乾坤第一章
#textStartURL = 'http://www.bxwx8.org/b/35/35282/7620539.html';#武动乾坤
nextURL = textStartURL;
isEnd = False
f = open(NOVERL, 'w', encoding='utf-8')
f.close()
numChapter = 0;
while(not isEnd):
nextURL,isEnd = findNextTextURL(nextURL)
print('end of capture!')
print('获取到 ' + str(numChapter) + ' 章')
获取内容和下一章URL
#找到 下一章节的URL
#获取小说内容
def findNextTextURL(url):
global numChapter
global NOVERL
#如果nextURL == endURL 则返回false
if(NOVERL == '大主宰.txt'):
endURL = 'http://www.bxwx8.org/b/62/62724/index.html'#大主宰
headURL = 'http://www.bxwx8.org/b/62/62724/'#大主宰
else:
endURL = 'http://www.bxwx8.org/b/98/98289/index.html'#择天记
headURL = 'http://www.bxwx8.org/b/98/98289/'#择天记
endURL = 'http://www.bxwx8.org/b/35/35282/index.html'#武动乾坤
headURL = 'http://www.bxwx8.org/b/35/35282/'#武动乾坤
isEnd = False
resp = urllib.request.urlopen(url)
#处理的字符的确是gbk的,但是其中夹杂的部分特殊字符,
#是gbk编码中所没有的如果有些特殊字符是GB18030中有的,但是是gbk中没有的。
#则用gbk去解码,去所不支持的字符,也比如会出错。
#所以,此种情况,可以尝试用和当前编码(gbk)所兼容的但所包含字符更多的编码(gb18030)去解码,或许就可以了。
#allHtml = resp.read().decode('gbk')#
allHtml = resp.read().decode('gb18030')#
textSoup = BeautifulSoup(allHtml)
#章节名
strChapter = textSoup.find(id='title').getText().split(r'【')[0]
strChapter = strChapter.split(r'(')[0]
strChapter = strChapter.replace('正文 ','') + '\n'
numChapter = numChapter + 1
strID = '#' + str(numChapter) + '-'
strChapter = strID + strChapter
strChapter = strChapter + '\n------------------------------\n' + url + '\n------------------------------\n'
#小说正文
strNovel = textSoup.find(id='content').getText()
strNovel = strNovel.replace(' ','\n')
#除去正文中多余的第XXX章
strMatch = r"第[\u4e00-\u9fa5]+章"
list2replace = re.findall(strMatch, strNovel)
if list2replace:
str2replace = list2replace[0]
strNovel = strNovel.replace(str2replace, '')
#合并章节和正文
strNovel = strChapter + strNovel + '\n------------------------------\n------------------------------\n'
#写到txt文件中
write2TXT(strNovel)
#获取下一个章节的URL
nextURL = re.findall(r'var next_page = "[\w]+.html"', allHtml)[0]
nextURL = nextURL.replace(r'"', '')
nextURL = nextURL.replace(r'var next_page = ', '')
nextURL = headURL + nextURL
print(numChapter)#章节数
print(strChapter)#章节名字
print((nextURL))#下一章URL
if(endURL == nextURL):
isEnd = True
return nextURL,isEnd
写入TXT
#写到文本文件中
def write2TXT(txt):
global NOVERL
f = open(NOVERL, 'a', encoding='utf-8')
f.write(txt + '\n\n')
f.close()
结束语
三个说明:
txt文本的编排肯定不好,而且在Kindle里面无法自动分章,多看阅读可以,原生系统就GG了,所以下一步可以用epubBuilder这款软件进行二次编排,输出mobi导入你的Kindle。
本程序只是针对这个网站而已,但是如果网站换了,细节性代码就得重新写了。不过大框架还可以用。
网络小说毒害有志青年,一入网文深是海,从此节操是路人,诸君且行且珍惜!
来源:http://blog.csdn.net/humanking7/article/details/51759965
猜你喜欢
- 有时我们有很多文件(如图片),我们需要对每一个文件进行操作。 我们还需要一份文件的名字来进行遍历,这时我们首先需要建立一份文件名单,有时还会
- 在cssrain整理的一个 试题集 中有这么一道题:<SCRIPT LANGUAGE="JavaScript"&g
- 如果你计划将数据库从SQL Server 2000 升级到 SQL Server 2005。你在升级之前一定会测试每样东西,并且证明应用程序
- 我有大量的重要数据要从SQL Server导出到Access或Excel文件中去,手工做太麻烦,还有其它的好办法吗?有,我们在 SQL Se
- 在编程时你一定碰到过时间触发的事件,在VB中有timer控件,而asp中没有,假如你要不停地查询数据库来等待一个返回结果的话,我想你一定知道
- 字符编码,在编程中,是一个让学习者比较郁闷的东西,比如一个str,如果都是英文,好说多了。但恰恰不是如此,中文是我们不得不用的。所以,哪怕是
- 本文实例讲述了PHPExcel冻结(锁定)表头的简单实现方法。分享给大家供大家参考,具体如下:PHPExcel是一款功能比较强大的操作微软e
- 本文介绍了使用xmlhttp处理远程文件数据、或采集文章时,对对方网页编码的处理方法。因为使用ajax的xmlhttp网页编码处理不当很容易
- 字符串转十六进制StrToHex Function<% Response.Write StrToHex("Nice
- 一、问题描述通过调用MyQR模块来实现生成个人所需二维码。安装:pip install myqr二、代码实现1.普通二维码from MyQR
- 前些天写一个存储过程,存储过程中使用了事务,后来我把一些代码注释掉来进行调试找错,突然发现一张表被锁住了,原来是创建事务的代码忘记注释掉。本
- lambda函数是一种小的匿名函数。lambda语法lambda函数:lambda [arg1 [,arg2,...[,argn]]] :
- 前言由于一直用Linux系统,对于词典的支持特别不好,对于我这英语渣渣的人来说,当看英文文档就一直卡壳,之前用惯了有道词典,感觉很不错,虽然
- 本文实例为大家分享了Python QQBot库的QQ聊天机器人的具体代码,供大家参考,具体内容如下项目地址:https://github.c
- 本文实例讲述了Python全局变量用法。分享给大家供大家参考,具体如下:全局变量不符合参数传递的精神,所以,平时我很少使用,除非定义常量。今
- 浏览器对于CSS的支持问题落后于CSS的发展,以占有市场绝对份额的Internet Explorer来说,直到其前不久发布的第8个版本才刚刚
- 本文实例讲述了PHP实现断点续传乱序合并文件的方法。分享给大家供大家参考,具体如下:分割成多个文件发送,由于网络原因并不上先发就能发接收到。
- 由于众所周知的原因,ACCESS在大型站点应用中都靠不上边,主要问题就是数据量大了以后几乎无法索引。当ACCESS里数据过万后,明显可以感觉
- 计算表达式:1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/
- redux-saga在学习它之前先了解es6生成器生成器关键字:yield next()定义函数需要在函数名前急+*号function *t