专栏名称: 编程派
Python程序员都在看的公众号,跟着编程派一起学习Python,看最新国外教程和资源!
目录
相关文章推荐
Python爱好者社区  ·  国企官网被挂上“码农的钱你也敢吞,还钱” ·  昨天  
Python开发者  ·  DeepSeek 下棋靠忽悠赢了 ... ·  3 天前  
Python爱好者社区  ·  “给我滚出贵大!”郑强出任贵州大学校长,打算 ... ·  4 天前  
Python爱好者社区  ·  DeepSeek 最新中国大学排名 ·  2 天前  
Python开发者  ·  “李飞飞团队50 美元炼出 ... ·  5 天前  
51好读  ›  专栏  ›  编程派

一步一步搭建视频聚合网站

编程派  · 公众号  · Python  · 2017-08-07 11:30

正文

作者:ieiayaobb

来源:https://segmentfault.com/a/1190000010348905

前言

作为一个炉石传说玩家,经常有事没事开着直播网站看看大神们的精彩表演。不过因为各个平台互相挖人的关系,导致关注的一些主播分散到了各个直播平台,来回切换有点麻烦,所以萌生了做一个视频聚合站的想法。

我主要去采集斗鱼、熊猫等的炉石区的主播信息。虽然各个站点的人气信息有水分,但还是做了个简单的排名。

上图:


手机上的效果图:


话不多说,上网站: http://lushiba.leanapp.cn/
项目部输在了 leancloud 上,比较省心,但有一定的免费额度(如果显示超出限制,需要晚一些来访问,毕竟免费的,每天 6 个小时限制)
源码地址: https://github.com/ieiayaobb/... 欢迎 Star

  • master 分支是 redis 方式存储实现

  • lean 分支是基于 lean cloud 的实现

基础介绍

聚合站的思路就是采集目标站点的相关信息,通过数据处理将想要的信息做提取,整理入库,然后通过 web 展示。因为直播平台数据实时在变,所以考虑将存储的数据放在缓存中(redis),因为部署在了 lean cloud 上,所以示例就直接存储在了 lean cloud 的存储上。

为了方便讲解,我们以斗鱼为目标采集的网站,介绍解析和存储部分的内容,其他网站的处理大同小异。

功能说明

整体项目就分为数据采集解析、数据存储、web 展现三大功能。后续我们会对这三个部分的功能做逐一展开说明。

技术选型

  • ### 语言(Python)

轻量级的项目,直接就是用了 Python 来做,Python 在爬虫、web 方面都有着不错的库支持,而且 lean cloud 也支持 Python 部署,所以毫不犹豫的就采用了 Python 来做

  • ### 数据采集(requests)

requests 的特点就是轻量,且简单易用。虽然这是个爬虫项目,但实在规模太小,所以没必要上 scrapy 了

requests 的介绍地址:http://docs.python-requests.o...

请求模拟

  1. url = 'http://www.douyu.com/directory/game/How'

  2. session = requests.Session()

  3. response = session.get(url, verify=False)

数据解析

解析部分主要有两种:正则,BeautifulSoup
这里为了通用,直接使用了正则来解析。
正则处理要求比较高,但是几乎能应对所有的情况,属于大杀器。
BeautifulSoup4 的详细介绍: https://www.crummy.com/softwa...

  • ### web 框架(Django)

Django 是 Python 比较重量级的框架,Django 自带了 orm 的框架,可惜这个项目中用不到。但是我们会使用 Django 的模板引擎,Django 的模板引擎也是很方便的一个特性。Django 还提供了 django-rest-framework,方便开发 RESTful 的接口,这个项目后续做了个配搭的 React Native 的 mobile 应用,所以引入了 django-rest-framework。

详细介绍在此:https://www.djangoproject.com/

  • ### 存储(lean cloud 的数据存储)

既然用了 lean cloud,存储就直接用了 lean 提供的存储功能。

详细的介绍在这里: https://leancloud.cn/docs/lea...

  • ### 部署(用了 lean cloud 的引擎)

参考了 lean cloud 官方的项目骨架: https://github.com/leancloud/...

  • ### 前端展示(pureCSS)

pureCss 还是为了简单,支持响应式,并且提供了基础的 UI 组件

详细介绍在这里: https://purecss.io/

环境准备

Python 的开发环境网上比较多,主要是 virtualenv 的准备,可以看廖老师的博客了解具体信息:
https://www.liaoxuefeng.com/w...
requirments.txt 内容如下:

  1. Django==1.9.7

  2. requests==2.10.0

  3. wheel==0.24.0

  4. gunicorn

  5. leancloud-sdk>=1.0.9

分析与采集

视频站内容解析

  • 斗鱼炉石区
    目标是采集炉石区所有主播的链接地址和人气情况

页面内容(单个主播的信息)

  1. class="play-list-link" data-rid='48699' data-tid='2' data-sid='167' data-rpos="0" data-sub_rt ="0" href="/yechui" title="衣锦夜行:狂野 登顶登顶"

  2.  target="_blank">

  3.   class="imgbox">

  4.       class="imgbox-corner-mark">

  5.      

  6.       class="black">

  7.      ![](http://img2.jintiankansha.me/get6?src=http://upload-images.jianshu.io/upload_images/2485846-20d3cbfd6e33df69.gif?imageMogr2/auto-orient/strip)

  8.  

  9.  

    class="mes">
  10.      

    class="mes-tit">
  11.          

    class="ellipsis">衣锦夜行:狂野 登顶登顶

  12.           class="tag ellipsis">炉石传说

  13.      

  • class = "dy-name ellipsis fl" > 衣锦夜行

  • class = "dy-num fr" > 8.1 万

  • 我们需要采集的有几部分内容:

    • 直播间 url (节点里的 href,/yechui)

    • 直播间的标题(节点里的 title,衣锦夜行:狂野 登顶登顶)

    • 直播间的截图(节点里的 img 标签的 src,https://rpic.douyucdn.cn/a170...)

    • 直播间的人气(8.1 万)(这里有个注意的地方,斗鱼的人气可能是 X 万,需要把这个万转化成数值方便排序)

    • 主播名称(衣锦夜行)

    页面处理与采集

    所有完整的直播站处理代码在 fetch.py 中

    命中主播信息节点

    1. re.finditer('([sS]*?)', response.content.decode('utf8')):

    简单的说明一下代码:

    1. response.content.decode('utf8')

    • 主要是讲 requests 请求的页面以 utf8 编码返回

    • 正则部分就是命中上述的主播节点的内容,截取整个 a 标签

    解析代码

    采集 href 信息(主播房间链接)

    1. href = re.search('href=".*?"', group).group().lstrip('href="').rstrip('"')

    采集标题信息

    1. title = re.search('title=".*?"', group).group().lstrip('title="').rstrip('"')

    采集截图信息

    1. img = re.search('data-original=".*?"', group).group().lstrip('data-original="').rstrip('"')

    采集主播名称

    1. name = re.search('.*?', group).group().lstrip('').rstrip('')

    采集人气数量信息

    1. num = re.search( ', group).group().lstrip('').rstrip('')

    处理'万'字

    1. 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 循环来遍历所有,先清空,再采集):

    1. leancloud.init(LEAN_CLOUD_ID, LEAN_CLOUD_SECRET)

    2. query = leancloud.Query('Chairman')

    3. allDataCompleted = False

    4. batch = 0

    5. limit = 1000

    6. while not allDataCompleted:

    7.    query.limit(limit)

    8.    query.skip(batch * limit)

    9.    query.add_ascending('createdAt')

    10.    resultList = query.find()

    11.    if len(resultList) < limit:

    12.        allDataCompleted = True

    13.        leancloud.Object.destroy_all(resultList)

    14.    batch   = 1

    15. fetcher = Fetcher()

    16. fetcher.fetch_douyu()

    /chairmans(redis 版本才支持)

    Django-rest-framework 提供,可以通过分页的方式展现当前库中的信息

    /chairman/{id}(redis 版本才支持)

    Django-rest-framework 提供,可以根据指定 id 获取某一个主播的信息

    刷新机制

    lean cloud 提供了一种云函数的概念,并且可以像配置 cron 一样,定期的去触发某一个请求,为了能够定期的更新排行榜,我们会通过配置这个云函数,实现定期的数据刷新
    云函数是一个 cloud.py 文件,内容如下

    1. engine = Engine(get_wsgi_application())

    2. @engine.define

    3. def fetch(**params):

    4.    leancloud.init(LEAN_CLOUD_ID, LEAN_CLOUD_SECRET)

    5.    # fetch 逻辑

    在 lean cloud 中配置定时执行

    页面展示

    页面部分比较简单,以一个列表的形式,展现了主播的排行榜信息,点击某一个主播,直接跳转到对应直播网站的目标直播间。因为考虑到在手机上的显示,所以做了自适应

    列表页

    列表页的渲染使用了 Django 的模板引擎
    由于 lean cloud 的存储和 Django 的 orm 不一样,所以这里需要将 attributes 放到列表中,页面上才能用模板语法进行访问
    view 部分代码:

    1. def get_index(request):

    2.    leancloud.init(LEAN_CLOUD_ID, LEAN_CLOUD_SECRET)

    3.    query =







    请到「今天看啥」查看全文