文 | 某某白米饭

来源:Python 技术「ID: pythonall」

在路上发现好多人都喜欢用耳机听小说,同事居然可以一整天的带着一只耳机听小说。小编表示非常的震惊。今天就用 Python 下载听小说 tingchina.com的音频。

书名和章节列表

随机点开一本书,这个页面可以使用 BeautifulSoup 获取书名和所有单个章节音频的列表。复制浏览器的地址,如:https://www.tingchina.com/yousheng/disp_31086.htm

from bs4 import BeautifulSoup
import requests
import re
import random
import osheaders = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'
}def get_detail_urls(url):url_list = []response = requests.get(url, headers=headers)response.encoding = 'gbk'soup = BeautifulSoup(response.text, 'lxml')name = soup.select('.red12')[0].strong.textif not os.path.exists(name):os.makedirs(name)div_list = soup.select('div.list a')for item in div_list:url_list.append({'name': item.string, 'url': 'https://www.tingchina.com/yousheng/{}'.format(item['href'])})return name, url_list

音频地址

打开单个章节的链接,在 Elements 面板用章节名称作为搜索词,在底部发现了一个 script,这一部分就是声源的地址。

在 Network 面板可以看到,声源的 url 域名和章节列表的域名是不一样的。在获取下载链接的时候需要注意这一点。

def get_mp3_path(url):response = requests.get(url, headers=headers)response.encoding = 'gbk'soup = BeautifulSoup(response.text, 'lxml')script_text = soup.select('script')[-1].stringfileUrl_search = re.search('fileUrl= "(.*?)";', script_text, re.S)if fileUrl_search:return 'https://t3344.tingchina.com' + fileUrl_search.group(1)

下载

惊喜总是突如其来,把这个 https://t3344.tingchina.com/xxxx.mp3 放入浏览器中运行居然是 404。

肯定是少了关键性的参数,回到上面 Network 仔细观察 mp3 的 url,发现在 url 后面带了一个 key 的关键字。如下图,这个 key 是来自于 https://img.tingchina.com/play/h5_jsonp.asp?0.5078556568562795 的返回值,可以使用正则表达式将 key 取出来。

def get_key(url):url = 'https://img.tingchina.com/play/h5_jsonp.asp?{}'.format(str(random.random()))headers['referer'] = urlresponse = requests.get(url, headers=headers)matched = re.search('(key=.*?)";', response.text, re.S)if matched:temp = matched.group(1)return temp[len(temp)-42:]

最后的最后在 __main__ 中将以上的代码串联起来。

if __name__ == "__main__":url = input("请输入浏览器书页的地址:")dir,url_list = get_detail_urls()for item in url_list:audio_url = get_mp3_path(item['url'])key = get_key(item['url'])audio_url = audio_url + '?key=' + keyheaders['referer'] = item['url']r = requests.get(audio_url, headers=headers,stream=True)with open(os.path.join(dir, item['name']),'ab') as f:f.write(r.content)f.flush()

总结

这个 Python 爬虫比较简单,小编的每个月 30 元的流量都不够用,又了这个小程序在地铁上就可以不用流量听小说了。

PS:公号内回复「Python」即可进入Python 新手学习交流群,一起 100 天计划!

老规矩,兄弟们还记得么,右下角的 “在看” 点一下,如果感觉文章内容不错的话,记得分享朋友圈让更多的人知道!

代码获取方式】

识别文末二维码,回复:210629

用 50 行代码写个听小说的爬虫相关推荐

  1. 用 50 行代码写个听小说的爬虫,以后洗澡也可以听小说了

    在路上发现好多人都喜欢用耳机听小说,同事居然可以一整天的带着一只耳机听小说.小编表示非常的震惊.今天就用 Python 下载听小说 tingchina.com 的音频. 书名和章节列表 随机点开一本书 ...

  2. 50行代码写的一个插件,破解一个H5小游戏

    小游戏链接:测测你的眼睛对色差的辨识度http://www.webhek.com/post/color-test.html?from=timeline 废话不多说,先放代码: window.onloa ...

  3. python爬虫实战:利用scrapy,短短50行代码下载整站短视频

    近日,有朋友向我求助一件小事儿,他在一个短视频app上看到一个好玩儿的段子,想下载下来,可死活找不到下载的方法.这忙我得帮,少不得就抓包分析了一下这个app,找到了视频的下载链接,帮他解决了这个小问题 ...

  4. 如何用50行代码构建情感分类器

    选自Toward Data Science,作者:Rohith Gandhi,机器之心编译. 本文介绍了如何构建情感分类器,从介绍自然语言处理开始,一步一步讲述构建过程. 自然语言处理简介 语言把人类 ...

  5. python跑酷游戏源码_HTML5游戏实战(1):50行代码实现正面跑酷游戏

    前段时间看到一个"熊来了"的HTML5跑酷游戏,它是一个典型的正面2D跑酷游戏,这里借用它来介绍一下用Gamebuilder+CanTK开发正面跑酷游戏的基本方法. CanTK(C ...

  6. 利用scrapy,短短50行代码下载整站短视频

    一.撕开爬虫的面纱--爬虫是什么,它能做什么 爬虫是什么 爬虫就是一段能够从互联网上高效获取数据的程序. 我们每天都在从互联网上获取数据.当打开浏览器访问百度的时候,我们就从百度的服务器获取数据,当拿 ...

  7. python:利用20行代码爬取网络小说

    文章目录 前言 一.爬虫是什么? 二.实现过程 总结 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 今天,来给大家一个分享一下如何使用20爬虫行代码爬取网络小说(这里我们以龙 ...

  8. 直击面试现场:神级程序员仅100秒,60行代码写出俄罗斯方块,成为全公司焦点!...

    小编我今天逛论坛看到一位HR帖子直播公司面试情况,该公司是做棋牌APP的,现在正在招聘前端工程师和运营人员,HR直播的是前端这块的,有写游戏的也有做网站项目的,写特效的都有很多,但是这位HR却看上了一 ...

  9. python实现50行代码_50行代码实现python计算器主要功能

    实现功能:计算带有括号和四则运算的式子 3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4) 基本思路:使用正则表达式提取出每一层小括 ...

最新文章

  1. EIGRP的AD(管理距离)、AD(宣告距离)、FD(可行距离)
  2. DebugView调试C#程序 学习总结
  3. python字符串与文本处理技巧(3):字符剔除、字符对齐、字符拼接、字符插入变量
  4. win10电脑黑屏只有鼠标箭头_电脑开机进入系统后显示黑屏,只能看到一个鼠标指针,如何解决?...
  5. “约见”面试官系列之常见面试题之第四十九篇之ie6bug的解决办法(建议收藏)
  6. try…finally与嵌套及自定义异常抛出
  7. e5cc温控仪通讯参数设定_产品介绍||DeltaWiFi通讯型多功能电表DPMC520W
  8. linux-索引1909
  9. 并发环境下的缓存容器性能优化(上):不可变的哈希表
  10. linux waitpid子进程,关于waitpid()函数的问题,为什么最后子进程没退出来啊?...
  11. 自信息、信息熵和相对熵
  12. 【数学建模】数学建模学习4---动态规划(例题+matlab代码实现)
  13. 息县装修“茶几的选择”
  14. ERROR: Cannot uninstall ‘llvmlite‘. It is a distutils installed project and thus we cannot accuratel
  15. “Ballerina”可能成为集成的编程语言
  16. 怎么下载老版本android,剪映旧版下载
  17. 测试用例编写练习(二)
  18. 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第 3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后 问第一个人,他说是10岁。请问第
  19. 我对计算机网络技术的理解,对计算机网络技术课程学习几点思考.doc
  20. 一文深度学习建模预测全流程(Python)

热门文章

  1. 华为数通笔记-NAT
  2. vsto clickonce 发布setup.exe失败
  3. 有限差分法matlab两点边值代码,两点边值问题的有限差分法.doc
  4. 基于ThinkPHP6+Layui商城管理系统开发框架
  5. 2011年7月编程语言排行榜,Objective-C将成为年度语言
  6. 基于PHP+MySQL的宠物领养救助社交网站
  7. 转帖 FreeTextBox 工具条
  8. 阿里云产品经理刘宇:Serverless 的前世今生
  9. 点要素生成面要素(Arcgis实操系列)
  10. 高中信息技术知识点归纳总结