
前言
作为一个炉石传说玩家,经常有事没事开着直播网站看看大神们的精彩表演。不过因为各个平台互相挖人的关系,导致关注的一些主播分散到了各个直播平台,来回切换有点麻烦,所以萌生了做一个视频聚合站的想法。
我主要去采集斗鱼、熊猫等的炉石区的主播信息。虽然各个站点的人气信息有水分,但还是做了个简单的排名。
上图:

手机上的效果图:

话不多说,上网站: http://lushiba.leanapp.cn/
项目部输在了leancloud上,比较省心,但有一定的免费额度(如果显示超出限制,需要晚一些来访问,毕竟免费的,每天6个小时限制)
源码地址: https://github.com/ieiayaobb/… 欢迎Star
master分支是redis方式存储实现
lean分支是基于lean cloud的实现
基础介绍
聚合站的思路就是采集目标站点的相关信息,通过数据处理将想要的信息做提取,整理入库,然后通过web展示。因为直播平台数据实时在变,所以考虑将存储的数据放在缓存中(redis),因为部署在了lean cloud上,所以示例就直接存储在了lean cloud的存储上。
为了方便讲解,我们以斗鱼为目标采集的网站,介绍解析和存储部分的内容,其他网站的处理大同小异。
功能说明
整体项目就分为数据采集解析、数据存储、web展现三大功能。后续我们会对这三个部分的功能做逐一展开说明。
技术选型
requests的介绍地址:http://docs.python-requests.o…
请求模拟

数据解析
解析部分主要有两种:正则,BeautifulSoup
这里为了通用,直接使用了正则来解析。
正则处理要求比较高,但是几乎能应对所有的情况,属于大杀器。
BeautifulSoup4的详细介绍: https://www.crummy.com/softwa…
详细介绍在此:https://www.djangoproject.com/
详细的介绍在这里: https://leancloud.cn/docs/lea…
详细介绍在这里: https://purecss.io/
环境准备
Python的开发环境网上比较多,主要是virtualenv的准备,可以看廖老师的博客了解具体信息:
https://www.liaoxuefeng.com/w…
requirments.txt内容如下:

分析与采集
视频站内容解析
#### 页面内容(单个主播的信息)

衣锦夜行:狂野 登顶登顶
炉石传说
衣锦夜行 8.1万
我们需要采集的有几部分内容:
直播间url (节点里的href,/yechui)
直播间的标题(节点里的title,衣锦夜行:狂野 登顶登顶)
直播间的截图(节点里的img标签的src,https://rpic.douyucdn.cn/a170…)
直播间的人气(8.1万)(这里有个注意的地方,斗鱼的人气可能是X万,需要把这个万转化成数值方便排序)
主播名称(衣锦夜行)
页面处理与采集
所有完整的直播站处理代码在fetch.py中
#### 命中主播信息节点
re.finditer('([\s\S]*?)', response.content.decode('utf8')):
简单的说明一下代码:
response.content
.decode('utf8')
采集href信息(主播房间链接)
href = re.search('href=".*?"', group).group().lstrip
('href="').rstrip('"')
采集标题信息
title = re.search('title=".*?"', group).group().lstrip(
'title="').rstrip('"')
采集截图信息
img = re.search('data-original=".*?"', group).group().lstrip('data-original="').
rstrip('"')
采集主播名称
name = re.search('.*?', group).group().lstrip('').rstrip
('')
采集人气数量信息
num = re.search(', group).group().lstrip('').rstrip(''
)
处理‘万’字
int(round(float(num.replace('万', '').replace('\r', '').
replace('\n', '')) * 10000))
存储与刷新
采集到的信息需要存储到lean cloud的存储中,会调用lean cloud所提供的API
字段设计
Chairman
id
直播间的唯一id
name
直播间主播名称
title
直播间的标题
href
直播间的页面地址
num
直播间的人气
img
直播间的截图
接口设计
/fetch
Fetch的接口包含了清空、采集、解析、存储所有的更新逻辑,设计这个接口的目的主要是方便后面使用云函数进行定时调用,以更新数据,调用逻辑如下(lean cloud不支持全部遍历,所以用了while循环来遍历所有,先清空,再采集):

/chairmans(redis版本才支持)
Django-rest-framework提供,可以通过分页的方式展现当前库中的信息
/chairman/{id}(redis版本才支持)
Django-rest-framework提供,可以根据指定id获取某一个主播的信息
刷新机制
lean cloud提供了一种云函数的概念,并且可以像配置cron一样,定期的去触发某一个请求,为了能够定期的更新排行榜,我们会通过配置这个云函数,实现定期的数据刷新
云函数是一个cloud.py文件,内容如下

在lean cloud中配置定时执行
页面展示
页面部分比较简单,以一个列表的形式,展现了主播的排行榜信息,点击某一个主播,直接跳转到对应直播网站的目标直播间。因为考虑到在手机上的显示,所以做了自适应
列表页
列表页的渲染使用了Django的模板引擎
由于lean cloud的存储和Django的orm不一样,所以这里需要将attributes放到列表中,页面上才能用模板语法进行访问
view部分代码:

页面部分代码:

项目部署
因为部署在了lean cloud上,可以直接使用提供的lean-cli进行部署,
lean-cli的详细介绍在这里:
https://www.leancloud.cn/docs…部署
这里为了方便直接在页面上进行配置
配置git库

配置Deploy Key

设置域名

部署
配置定时任务

后言
整个项目比较简单,目的是为了练手。如有疑问,欢迎在github上面发issue。
作者:伯乐在线
来源:http://python.jobbole.com/88188/
————开班喜讯————
温馨提醒:马哥教育Python自动化开发班将于8月28日在北京海淀上地开班,小班制魔鬼式授课,钜惠限时抢位中。
马哥教育2017年Python自动化运维开发实战班,
马哥联合BAT、豆瓣等一线互联网Python开发达人,根据目前企业需求的Python开发人才进行了深度定制,加入了大量一线互联网公司:大众点评、饿了么、腾讯等生产环境真是项目,课程由浅入深,从Python基础到Python高级,让你融汇贯通Python基础理论,手把手教学让你具备Python自动化开发需要的前端界面开发、Web框架、大监控系统、CMDB系统、认证堡垒机、自动化流程平台六大实战能力,让你从0开始蜕变成Hold住年薪20万的Python自动化开发人才。

—
Python学习免费交流QQ群:475035830(千人群)
—
