最近工作之余会听听评书,但主流门户收费加广告着实让人烦躁。作为IT人,怎能如此顺应别人家的产品规则。

下面以 python + taro 为例,写一个爬虫 + 小程序的播放应用:

最终实现的效果如下:

1132488286.jpg

原本听的喜马拉雅,但是资源有限。找到了个简陋的听书站点,资源是有了,但是广告一堆、交互生硬,谈不上用户体验了。

所以,爬它

爬虫

脚本不多,大概说下步骤:

获取全本的播放页面链接

循环页面链接获取每回的实际播放链接

重新组织数据结构打印输出

最终要的就是打印的 这个数据

完整脚本如下:

# -*-coding:utf-8-*-

import requests

from bs4 import BeautifulSoup

session = requests.session()

headers = {

'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0',

'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',

'accept-language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',

'accept-encoding': 'gzip, deflate, br',

}

def getHrefs(url):

r = session.get(url,headers=headers, verify=False)

r.encoding = 'GBK'

soup = BeautifulSoup(r.text, 'lxml')

rich_media_content = soup.find_all('div', class_='player')

playDatas = []

for item in rich_media_content:

playData = item.find("a").attrs['href']

playData = playData.replace('//','http://')

playData = playData.replace('play','playdata')

playDatas.append({

'playData': playData,

'title': item.find("a").text

})

return playDatas

def getPlayUrls(bookTitle, playDatas):

if len(playDatas) == 0:

return

playUrls = []

for index, item in enumerate(playDatas):

r = session.post(item['playData'], headers=headers, verify=False)

resp = r.json()

playUrls.append({

'playUrl': resp['urlpath'].replace('flv','mp3'),

'title': '{bookTitle}-{title}'.format(bookTitle=bookTitle, title=item['title']),

'id': index,

'played': 0,

})

return playUrls

if __name__ == "__main__":

bookTitle = 'xxxx第六部'

playDatas = getHrefs('http://xxxx.xxxx.xxx/xxxxx/')

playUrls = getPlayUrls(bookTitle, playDatas)

print(playUrls)

小程序

既然是给自己用的,就没必要搞的太复杂了。直接把爬到的数据放应用本地吧,加上一个播放列表,一个播放详情页面即可。

我本身用react较顺手,选择了Taro框架写小程序,顺便用了下Taro-UI组件库。

列表页面

...

componentDidShow () {

const songId = Taro.getStorageSync('songId')

const songList = Taro.getStorageSync('songList')

if (songList) {

this.setState({listData: songList})

}else {

Taro.setStorageSync('songList', this.state.listData)

}

if (songId) {

this.setState({ songId })

}

}

...

{listData && listData.map((item,index) => (

title={item.title}

arrow='right'

extraText={this.getExtraText(songId,item)}

onClick={()=>this.handleClick(index)}

/>

))}

详情页面

详情页面主要做的是:获取从列表来的ID,播放这个回目,播放控制,自动下一首,记录当前播放的回目及时间。

核心代码如下

...

startPlay = (itemIndex) => {

const songId = Taro.getStorageSync('songId')

let playTime = 0

if (songId && songId.toString() === itemIndex.toString()) {

playTime = Taro.getStorageSync('playTime')

}

const {listData} = this.state;

const musicInfo = {

name: listData[itemIndex].title,

playUrl: listData[itemIndex].playUrl,

itemIndex: parseInt(itemIndex),

playTime: playTime

}

this.setState({

musicInfo,

}, () => {

Taro.setNavigationBarTitle({title: listData[itemIndex].title})

this.autoPlay(musicInfo)

})

}

...

autoPlay = (musicInfo) => {

const bgMusic = Taro.getBackgroundAudioManager();

this.setState({

myAudio: bgMusic

},() => {

const songList = Taro.getStorageSync('songList')

songList[musicInfo.itemIndex].played = 1;

Taro.setStorageSync('songList', songList)

})

Taro.setStorageSync('songId', musicInfo.itemIndex)

bgMusic.src = musicInfo.playUrl

bgMusic.title = musicInfo.name

if (musicInfo.playTime > 0) {

bgMusic.startTime = musicInfo.playTime

}else {

bgMusic.startTime = 0

}

bgMusic.onTimeUpdate(() => {

this.setState({

timeLenght: bgMusic.duration,

playTime: bgMusic.currentTime

}, () => {

Taro.setStorageSync('playTime', bgMusic.currentTime)

})

})

bgMusic.onEnded(() => {

this.next();

})

bgMusic.onError(() => {

Taro.atMessage({

'message': '播放错误,自动播放下一首',

'type': 'error',

'duration': 1500

})

setTimeout(() => {

this.next();

}, 2000)

})

}

ok, 打开微信开发者工具,加载打包文件,扫个体验码,自嗨去吧~~

爬虫爬评书吧_爬虫 + 小程序 自定义开发一个听书程序相关推荐

  1. 爬虫爬评书吧_爬虫学习:xpath爬取评书网

    在家闲着,想找点评书听,但找了很久都没找到方便打包下载的地方.于是就拿起自学的python爬虫,自己动手丰衣足食. 运行环境:Windows7,python3.7 操作步骤: 1.打开选好的评书主页面 ...

  2. 爬虫爬评书吧_python scrapy+Mongodb爬取蜻蜓FM,酷我及懒人听书

    1.初衷:想在网上批量下载点听书.脱口秀之类,资源匮乏,大家可以一试 2.技术:wireshark scrapy jsonMonogoDB 3.思路:wireshark分析移动APP返回的各种连接分类 ...

  3. 爬虫爬评书吧_200行代码实现一个有声听书网爬虫下载器

    [Python] 纯文本查看 复制代码""" @author:qh @datetime:2019-3-5 @mood: """ import ...

  4. 图片链接用src不能被爬虫爬到吗_爬虫:带你一键爬取王者荣耀英雄皮肤壁纸

    一.前言 王者荣耀这款手游,想必大家都玩过或听过,游戏里英雄有各式各样的皮肤,制作得很精美,有些拿来做电脑壁纸它不香吗.本文带你利用Python爬虫一键下载王者荣耀英雄皮肤壁纸. 1. 目标 创建一个 ...

  5. python爬虫爬当当网_爬虫实战一:爬取当当网所有 Python 书籍

    本文转载自微信公众号[ 极客猴 ],作者知乎主页 此前错误标注来源导致侵权,在此表示歉意. 我们已经学习 urllib.re.BeautifulSoup 这三个库的用法.但只是停留在理论层面上,还需实 ...

  6. python爬虫爬取豆瓣_爬虫,从爬取豆瓣开始

    1 爬虫概述 当初第一次接触python,听的最多的就是爬虫爬虫,搞得我一脸蒙蔽,因为我从来都没听过这么新颖的词,而且我还天真的以为是不是python长得像一条小虫子,所以才叫爬虫. 直到后来经过不断 ...

  7. python爬虫爬微信红包_爬虫之微博抢红包

    先让大家看下最终效果... 1,使用的工具及包 google浏览器 User-Agent Switcher for Google Chrome 这是一个能自定义浏览器头的Google浏览器插件 req ...

  8. python 爬虫爬不出来_爬虫爬不进下一页了,怎么办

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #-*- coding: UTF-8 -*- import scrapy from hoho.items import HohoItem import r ...

  9. python爬虫爬取微信公众号小程序信息

    python爬虫爬取微信公众号小程序信息 爬取内容 某汽车维修信息提供的维修店名称,地点以及电话(手机)号码 爬取步骤 啥也别管,先抓包看看,在这里,博主使用的抓包软件是charles 抓包:将网络传 ...

最新文章

  1. 2020年Java程序员不得不学习的10大技术
  2. 敏捷结果30天之第六天:周五回顾,找到三件做的好以及三件需要改善的事情...
  3. python中字符串格式化%与.format
  4. XDP/eBPF — 基于 eBPF 的 Linux Kernel 可观测性
  5. 程序员 - 爱的表白
  6. springmvc 的 @PathVariable
  7. 一个非常棒的jQuery 评分插件--好东西要分享
  8. (第二课)python学习之数据类型
  9. 安卓学习笔记40:基于套接字网络编程
  10. 目标检测——阅读代码需要了解的内容
  11. cmd mysql utf8_MySQL中UTF8编码的数据在cmd下乱码
  12. uCOS-II的学习笔记(共九期)和例子(共六个)
  13. Debian, Ubuntu 和 Linux Mint 中安装WPS
  14. 360se html怎么删除,如何卸载360浏览器?怎么彻底删除360浏览器?
  15. ANSYS——模态分析的载荷施加问题以及约束的施加问题
  16. 求虐,我还想再拓展一次
  17. 503 Service Temporarily Unavailable
  18. Lubuntu下启用Compiz
  19. 2.6 zio入门——对比Future
  20. 对List集合属性进行模糊查找

热门文章

  1. 利用PCB引脚封装向导画BGA封装
  2. linux下glew例子,ubuntu 下编译glew (opengl扩展库)
  3. 个人读书思维导图笔记之mysql-innodb之changebuff
  4. 红包拓客生意宝修改记录
  5. 领图(一款给力的开源离线地图解决方案)
  6. 【日精进】2017-12-22 天气:晴
  7. 智慧工地安全帽识别检测算法 yolov5
  8. 基于低保真产品原型实战的Axure学习
  9. 获取某年某月的最后一天
  10. 前端找工作真的那么难吗?