Python下载网络小说实例代码


Posted in Python onFebruary 03, 2018

看网络小说一般会攒上一波,然后导入Kindle里面去看,但是攒的多了,机械的Ctrl+C和Ctrl+V实在是OUT,所以就出现了此文。

其实Python我也是小白,用它的目的主要是它强大文本处理能力和网络支持,以及许多好用的库,不需要自己造轮子。而且真心比C方便啊(真是用了才知道)

分析要获取的网页

Python下载网络小说实例代码

我要获取的主要是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,问题就解决了,因为一般修仙网络小说中,会出现各种王霸之气的文字,你们懂得,所以需要更加牛逼文字库,你们感受一下博大精深的字符编码。

Python下载网络小说实例代码

源代码

我就知道,大家要这个,哈哈哈。

主函数

#主函数
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。
  • 本程序只是针对这个网站而已,但是如果网站换了,细节性代码就得重新写了。不过大框架还可以用。
  • 网络小说毒害有志青年,一入网文深是海,从此节操是路人,诸君且行且珍惜!

总结

以上就是本文关于Python下载网络小说实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python根据经纬度计算距离示例
Feb 16 Python
Python中的choice()方法使用详解
May 15 Python
Python3搜索及替换文件中文本的方法
May 22 Python
K-means聚类算法介绍与利用python实现的代码示例
Nov 13 Python
Python实现八皇后问题示例代码
Dec 09 Python
详解用python写网络爬虫-爬取新浪微博评论
May 10 Python
搞清楚 Python traceback的具体使用方法
May 13 Python
python 随机生成10位数密码的实现代码
Jun 27 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
Aug 19 Python
浅谈Selenium+Webdriver 常用的元素定位方式
Jan 13 Python
Python opencv缺陷检测的实现及问题解决
Apr 24 Python
pandas提升计算效率的一些方法汇总
May 30 Python
JS设计模式之责任链模式实例详解
Feb 03 #Python
numpy使用技巧之数组过滤实例代码
Feb 03 #Python
python验证码识别实例代码
Feb 03 #Python
Django中cookie的基本使用方法示例
Feb 03 #Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
Feb 03 #Python
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
Feb 03 #Python
Python数据分析之双色球中蓝红球分析统计示例
Feb 03 #Python
You might like
查找mysql字段中固定字符串并替换的几个方法
2012/09/23 PHP
PHP遍历目录并返回统计目录大小
2014/06/09 PHP
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
PHP实现根据设备类型自动跳转相应页面的方法
2014/07/24 PHP
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
2014/08/04 PHP
php通过session防url攻击方法
2014/12/10 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
2017/05/29 PHP
PHP简单实现二维数组的矩阵转置操作示例
2017/11/24 PHP
FileUpload 控件 禁止手动输入或粘贴的实现代码
2010/04/07 Javascript
让mayfish支持mysqli数据库驱动的实现方法
2010/05/22 Javascript
jquery isType() 类型判断代码
2011/02/14 Javascript
jquery入门—数据删除与隔行变色以及图片预览
2013/01/07 Javascript
3种js实现string的substring方法
2015/11/09 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
2015/11/19 Javascript
AngularJS监听路由的变化示例代码
2016/09/23 Javascript
基于vue2实现上拉加载功能
2017/11/28 Javascript
vue-cli 组件的导入与使用教程详解
2018/04/11 Javascript
解析vue data不可以使用箭头函数问题
2018/07/03 Javascript
利用Vue实现简易播放器的完整代码
2020/12/30 Vue.js
[52:12]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python pandas中DataFrame类型数据操作函数的方法
2018/04/08 Python
pandas将DataFrame的列变成行索引的方法
2018/04/10 Python
Python 3.7新功能之dataclass装饰器详解
2018/04/21 Python
Pycharm以root权限运行脚本的方法
2019/01/19 Python
说说如何遍历Python列表的方法示例
2019/02/11 Python
python高斯分布概率密度函数的使用详解
2019/07/10 Python
Python使用Slider组件实现调整曲线参数功能示例
2019/09/06 Python
美国复古街头服饰精品店:Need Supply Co.
2017/02/22 全球购物
main 主函数执行完毕后,是否可能会再执行一段代码,给出说明
2012/12/05 面试题
安全员岗位职责
2015/02/10 职场文书
小型企业的绩效考核制度模板
2019/11/21 职场文书
Go 语言下基于Redis分布式锁的实现方式
2021/06/28 Golang
 分享一个Python 遇到数据库超好用的模块
2022/04/06 Python
python开发制作好看的时钟效果
2022/05/02 Python
使用pd.merge表连接出现多余行的问题解决
2022/06/16 Python
Hive HQL支持2种查询语句风格
2022/06/25 数据库