背景

前端时间在喜马拉雅上偶然听到牛大宝说的有声小说神通板砖,说的很是幽默,听的正起劲的时候开始收费了,于是我就在网上找了下看看有没有免费版,一搜果然有,但该网站上广告太多了,于是我就写了个小脚本可以批量下载的,供大家学习,如果您使用该脚本用于任何非法用途,均与本站无关

思路

  1. 找到可以免费下载资源网站
  2. 针对该网站html进行分析并编写下载脚本
  3. linux命令行自动顺序播放

实施

找到可以免费下载资源网站

网址: www.ting56.com/mp3/6475.html#liebiao

编写脚本 stbz.py

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from html.parser import HTMLParser
  4. import urllib3
  5. import os
  6. http = urllib3.PoolManager()
  7. baseUrl='http://www.ting56.com'
  8. class Mp3HTMLParser(HTMLParser):
  9. def __init__(self):
  10. HTMLParser.__init__(self)
  11. def handle_starttag(self,tag,attrs):
  12. if tag == 'div':
  13. for (k,v) in attrs:
  14. if k=='id' and v=='bofangqi':
  15. print(tag)
  16. class MyHTMLParser(HTMLParser):
  17. def __init__(self):
  18. self.a_t = False
  19. HTMLParser.__init__(self)
  20. def handle_starttag(self, tag, attrs):
  21. """
  22. recognize start tag, like <div>
  23. :param tag:
  24. :param attrs:
  25. :return:
  26. """
  27. if tag == 'div':
  28. for (k,v) in attrs:
  29. if k == 'id' and v == 'vlink_1':
  30. self.a_t = True
  31. #print("Encountered a start tag:", tag)
  32. else:
  33. self.a_t = False
  34. if self.a_t:
  35. if tag == 'a':
  36. title = ''
  37. url = ''
  38. for (k,v) in attrs:
  39. if k=='href':
  40. url=baseUrl+v
  41. if k=='title':
  42. title=v
  43. #print('%s %s \n' % (title,url))
  44. download(title,url)
  45. #r = http.request('GET',url)
  46. #dataStr = r.data.decode('gbk')
  47. #parser = Mp3HTMLParser()
  48. #parser.feed(dataStr)
  49. # def handle_endtag(self, tag):
  50. # """
  51. # recognize end tag, like </div>
  52. # :param tag:
  53. # :return:
  54. # """
  55. # print("Encountered an end tag :", tag)
  56. #
  57. def handle_data(self, data):
  58. """
  59. recognize data, html content string
  60. :param data:
  61. :return:
  62. """
  63. pass
  64. #if self.a_t:
  65. #print(data)
  66. #
  67. # def handle_startendtag(self, tag, attrs):
  68. # """
  69. # recognize tag that without endtag, like <img />
  70. # :param tag:
  71. # :param attrs:
  72. # :return:
  73. # """
  74. # print("Encountered startendtag :", tag)
  75. #
  76. # def handle_comment(self,data):
  77. # """
  78. #
  79. # :param data:
  80. # :return:
  81. # """
  82. # print("Encountered comment :", data)
  83. def fromCharCode(n):
  84. return chr(n%256)
  85. def download(name,url):
  86. print('%s%s' % (name,url))
  87. cmd = 'echo "%s%s" >> /tmp/stbz/downloadList.txt' % (name,url)
  88. os.system(cmd)
  89. try:
  90. if int(name) <= 137:
  91. return
  92. r = http.request('GET',url)
  93. dataStr = r.data.decode('gbk')
  94. os.environ['htmlStr'] = dataStr
  95. cmd = 'echo $htmlStr | sed "s/.*FonHen_JieMa(\([0-9\\\'\*]*\)).*/\\1/g"'
  96. t = os.popen(cmd).read()
  97. t = t[1:-2]
  98. #print(t)
  99. tArr = t.split('*')
  100. tmp = ''
  101. for s in tArr:
  102. if len(s)==0:
  103. continue
  104. tmp = tmp + fromCharCode(int(s))
  105. print(tmp)
  106. datas = tmp.split('&')
  107. print(datas)
  108. cmd = 'curl %s --output /tmp/stbz/%s.%s' % (datas[0],name,datas[2])
  109. if os.system(cmd) != 0:
  110. raise Exception("download err")
  111. except:
  112. print('[err] %s%s ' % (name,url))
  113. cmd = 'echo "%s%s" >> /tmp/stbz/err.txt' % (name,url)
  114. os.system(cmd)
  115. if __name__ == "__main__":
  116. os.system('echo "" > /tmp/stbz/downloadList.txt')
  117. r = http.request('GET','http://www.ting56.com/mp3/6475.html#liebiao')
  118. dataStr = r.data.decode('gbk')
  119. #print(dataStr)
  120. parser = MyHTMLParser()
  121. parser.feed(dataStr)

自动播放脚本

下载好的音频文件都是以数字编号的,所以可以播放完一个自动进行下一个,并且记录当前播放记录,方便下次继续播放 将下面的脚本保存为play.sh

  1. #!/usr/bin/env bash
  2. basepath=$(cd `dirname $0`;pwd)
  3. cd $basepath
  4. echo "workspace [$basepath]"
  5. posfile="stbz.pos"
  6. if [ ! -f "$posfile" ]; then
  7. echo '1.m4a' > ${posfile}
  8. fi
  9. pos=$(cat ${posfile})
  10. state="start"
  11. for name in `cat ./stbz.lst`;do
  12. if [ $state = "start" ]; then
  13. if [ $pos = $name ]; then
  14. echo "begin play ${pos}"
  15. mplayer $name 1>> /dev/null 2>>err.txt || exit 1
  16. state="play"
  17. echo "${name}" > ${posfile}
  18. fi
  19. else
  20. echo "begin play ${name}"
  21. echo "${name}" > ${posfile}
  22. mplayer $name 1>> /dev/null 2>>err.txt || exit 1
  23. fi
  24. done


  1. 原文来自 https://www.h3blog.com/article/python-download-stbz/

python下载神通板砖有声版的更多相关文章

  1. python下载想听的有声书,让喜马拉雅收费,我是程序员!

    from urllib import parse,request import urllib header_dict = {'User-Agent': 'Mozilla/5.0 (Windows NT ...

  2. Python学习手册(第4版) - 专业程序员的养成完整版PDF免费下载_百度云盘

    Python学习手册(第4版) - 专业程序员的养成完整版PDF免费下载_百度云盘 提取码:g7v1 作者简介 作为全球Python培训界的领军人物,<Python学习手册:第4版>作者M ...

  3. Python基础教程(第3版)PDF高清完整版免费下载|百度云盘

    百度云盘:Python基础教程(第3版)PDF高清完整版免费下载 提取码:gkiy 内容简介 本书包括Python程序设计的方方面面:首先从Python的安装开始,随后介绍了Python的基础知识和基 ...

  4. Python学习手册(第4版)PDF高清完整版免费下载|百度云盘

    Python学习手册(第4版)PDF高清完整版免费下载|百度云盘 提取码:z6il 内容简介 Google和YouTube由于Python的高可适应性.易于维护以及适合于快速开发而采用它.如果你想要编 ...

  5. Python编程入门(第3版)|百度网盘免费下载|零基础入门学习资料

    百度网盘免费下载:Python编程入门(第3版) 提取码:rsd7 目录  · · · · · · 第1章 编程简介 11.1 Python语言 21.2 Python适合用于做什么 31.3 程序员 ...

  6. Python核心编程(第3版)PDF高清晰完整中文版|网盘链接附提取码下载|

    一.书籍简介<Python核心编程(第3版)>是经典畅销图书<Python核心编程(第二版)>的全新升级版本.<Python核心编程(第3版)>总共分为3部分.第1 ...

  7. Python下载及Python最强大IDEPyCharm下载链接

    Python下载: https://www.python.org/downloads/ PyCharm下载: https://www.jetbrains.com/pycharm/download/#s ...

  8. 学习参考《Python基础教程(第3版)》中文PDF+英文PDF+源代码

    python基础教程ed3: 基础知识 列表和元组 字符串 字典 流程控制 抽象(参数 作用域 递归) 异常 魔术方法/特性/迭代器 模块/标准库 文件 GUI DB 网络编程 测试 扩展python ...

  9. Python环境搭建-3 Python下载

    python环境搭建 Python是一个跨平台.可移植的编程语言,因此可在windows.Linux和Mac OS X系统中安装使用. 安装完成后,你会得到Python解释器环境,可以通过终端输入py ...

随机推荐

  1. crontab不执行service命令

    我这里的需求是每30分钟重启一次 写成下面的格式就可以正确执行了,后面执行的命令写绝对路径 */30 * * * * /usr/bin/supervisorctl restart all

  2. poj-3662 Telephone Lines 二分答案+最短路

    链接:洛谷 POJ 题目描述 Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone co ...

  3. 401认证钓鱼demo

    <?php //@b4dboy if(!isset($_SERVER['PHP_AUTH_USER']) && !isset($_SERVER['PHP_AUTH_PW'])) ...

  4. jquery JavaScript如何监听button事件

    下面的html页面中有两个按钮 <div class="layui-tab-item layui-show"> <form class="layui-f ...

  5. 动态指定log4net日志文件名称

    如果是希望日志文件按常见的日期格式动态命名,没什么好说的,直接修改app.config <param name="DatePattern" value="yyyyM ...

  6. Filezilla Server搭建FTP服务器

    一.下载Filezilla  Server 官网网址:https://filezilla-project.org 下载链接 :https://filezilla-project.org/downloa ...

  7. 01_JDK的下载-安装-配置

    下载 https://www.oracle.com/technetwork/java/javase/downloads/index.html 安装 1.安装路径不要有空格(去除安装路径中的Progra ...

  8. jquery框架概览(一)

    参照jQuery 2.0.3版本(http://files.cnblogs.com/files/snoy/jquery-2.0.3.js")来进行的源码分析 从代码的最外层可以看到是一个II ...

  9. 深入JVM内核--常用JVM配置参数

    Trace跟踪参数 -verbose:gc -XX:+printGC 可以打印GC的简要信息 [GC 4790K->374K(15872K), 0.0001606 secs] [GC 4790K ...

  10. CPU时间分片、多线程、并发和并行

    1.CPU时间分片.多线程? 如果线程数不多于CPU核心数,会把各个线程都分配一个核心,不需分片,而当线程数多于CPU核心数时才会分片. 2.并发和并行的区别 并发:当有多个线程在操作时,如果系统只有 ...