亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

一步一步教你如何搭建自己的視頻聚合站

justjavac / 1686人閱讀

摘要:不過(guò)因?yàn)楦鱾€(gè)平臺(tái)互相挖人的關(guān)系,導(dǎo)致關(guān)注的一些主播分散到了各個(gè)直播平臺(tái),來(lái)回切換有點(diǎn)麻煩,所以萌生了做一個(gè)視頻聚合站的想法。后續(xù)我們會(huì)對(duì)這三個(gè)部分的功能做逐一展開(kāi)說(shuō)明。正則處理要求比較高,但是幾乎能應(yīng)對(duì)所有的情況,屬于大殺器。

前言

作為一個(gè)爐石傳說(shuō)玩家,經(jīng)常有事沒(méi)事開(kāi)著直播網(wǎng)站看看大神們的精彩表演。不過(guò)因?yàn)楦鱾€(gè)平臺(tái)互相挖人的關(guān)系,導(dǎo)致關(guān)注的一些主播分散到了各個(gè)直播平臺(tái),來(lái)回切換有點(diǎn)麻煩,所以萌生了做一個(gè)視頻聚合站的想法。

我主要去采集斗魚(yú)、熊貓等的爐石區(qū)的主播信息。雖然各個(gè)站點(diǎn)的人氣信息有水分,但還是做了個(gè)簡(jiǎn)單的排名。

上圖:

手機(jī)上的效果圖:

話不多說(shuō),上網(wǎng)站: http://lushiba.leanapp.cn/
項(xiàng)目部輸在了leancloud上,比較省心,但有一定的免費(fèi)額度(如果顯示超出限制,需要晚一些來(lái)訪問(wèn),畢竟免費(fèi)的,每天6個(gè)小時(shí)限制)
源碼地址: https://github.com/ieiayaobb/... 歡迎Star

master分支是redis方式存儲(chǔ)實(shí)現(xiàn)

lean分支是基于lean cloud的實(shí)現(xiàn)

基礎(chǔ)介紹

聚合站的思路就是采集目標(biāo)站點(diǎn)的相關(guān)信息,通過(guò)數(shù)據(jù)處理將想要的信息做提取,整理入庫(kù),然后通過(guò)web展示。因?yàn)橹辈テ脚_(tái)數(shù)據(jù)實(shí)時(shí)在變,所以考慮將存儲(chǔ)的數(shù)據(jù)放在緩存中(redis),因?yàn)椴渴鹪诹薼ean cloud上,所以示例就直接存儲(chǔ)在了lean cloud的存儲(chǔ)上。

為了方便講解,我們以斗魚(yú)為目標(biāo)采集的網(wǎng)站,介紹解析和存儲(chǔ)部分的內(nèi)容,其他網(wǎng)站的處理大同小異。

功能說(shuō)明

整體項(xiàng)目就分為數(shù)據(jù)采集解析、數(shù)據(jù)存儲(chǔ)、web展現(xiàn)三大功能。后續(xù)我們會(huì)對(duì)這三個(gè)部分的功能做逐一展開(kāi)說(shuō)明。

技術(shù)選型

語(yǔ)言(Python)

輕量級(jí)的項(xiàng)目,直接就是用了Python來(lái)做,Python在爬蟲(chóng)、web方面都有著不錯(cuò)的庫(kù)支持,而且lean cloud也支持Python部署,所以毫不猶豫的就采用了Python來(lái)做

數(shù)據(jù)采集(requests)

requests的特點(diǎn)就是輕量,且簡(jiǎn)單易用。雖然這是個(gè)爬蟲(chóng)項(xiàng)目,但實(shí)在規(guī)模太小,所以沒(méi)必要上scrapy了

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

請(qǐng)求模擬
url = "http://www.douyu.com/directory/game/How"
session = requests.Session()
response = session.get(url, verify=False)
數(shù)據(jù)解析

解析部分主要有兩種:正則,BeautifulSoup
這里為了通用,直接使用了正則來(lái)解析。
正則處理要求比較高,但是幾乎能應(yīng)對(duì)所有的情況,屬于大殺器。
BeautifulSoup4的詳細(xì)介紹: https://www.crummy.com/softwa...

web框架(Django)

Django是Python比較重量級(jí)的框架,Django自帶了orm的框架,可惜這個(gè)項(xiàng)目中用不到。但是我們會(huì)使用Django的模板引擎,Django的模板引擎也是很方便的一個(gè)特性。Django還提供了django-rest-framework,方便開(kāi)發(fā)RESTful的接口,這個(gè)項(xiàng)目后續(xù)做了個(gè)配搭的React Native的mobile應(yīng)用,所以引入了django-rest-framework。

詳細(xì)介紹在此:https://www.djangoproject.com/

存儲(chǔ)(lean cloud的數(shù)據(jù)存儲(chǔ))

既然用了lean cloud,存儲(chǔ)就直接用了lean提供的存儲(chǔ)功能。

詳細(xì)的介紹在這里: https://leancloud.cn/docs/lea...

部署(用了lean cloud的引擎)

參考了lean cloud官方的項(xiàng)目骨架: https://github.com/leancloud/...

前端展示(pureCSS)

pureCss還是為了簡(jiǎn)單,支持響應(yīng)式,并且提供了基礎(chǔ)的UI組件

詳細(xì)介紹在這里: https://purecss.io/

環(huán)境準(zhǔn)備

Python的開(kāi)發(fā)環(huán)境網(wǎng)上比較多,主要是virtualenv的準(zhǔn)備,可以看廖老師的博客了解具體信息:
https://www.liaoxuefeng.com/w...
requirments.txt內(nèi)容如下:

Django==1.9.7
requests==2.10.0
wheel==0.24.0
gunicorn
leancloud-sdk>=1.0.9
分析與采集 視頻站內(nèi)容解析

斗魚(yú)爐石區(qū)
目標(biāo)是采集爐石區(qū)所有主播的鏈接地址和人氣情況

#### 頁(yè)面內(nèi)容(單個(gè)主播的信息)


  
      
      
      
      ![](http://upload-images.jianshu.io/upload_images/2485846-20d3cbfd6e33df69.gif?imageMogr2/auto-orient/strip)
  
  

衣錦夜行:狂野 登頂?shù)琼?/h3> 爐石傳說(shuō)

衣錦夜行 8.1萬(wàn)

我們需要采集的有幾部分內(nèi)容:

直播間url (節(jié)點(diǎn)里的href,/yechui)

直播間的標(biāo)題(節(jié)點(diǎn)里的title,衣錦夜行:狂野 登頂?shù)琼敚?/p>

直播間的截圖(節(jié)點(diǎn)里的img標(biāo)簽的src,https://rpic.douyucdn.cn/a170...)

直播間的人氣(8.1萬(wàn))(這里有個(gè)注意的地方,斗魚(yú)的人氣可能是X萬(wàn),需要把這個(gè)萬(wàn)轉(zhuǎn)化成數(shù)值方便排序)

主播名稱(衣錦夜行)

頁(yè)面處理與采集

所有完整的直播站處理代碼在fetch.py中
#### 命中主播信息節(jié)點(diǎn)

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

簡(jiǎn)單的說(shuō)明一下代碼:

response.content.decode("utf8")

主要是講requests請(qǐng)求的頁(yè)面以u(píng)tf8編碼返回

正則部分就是命中上述的主播節(jié)點(diǎn)的內(nèi)容,截取整個(gè)a標(biāo)簽

解析代碼

采集href信息(主播房間鏈接)

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

采集標(biāo)題信息

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("")

采集人氣數(shù)量信息

num = re.search("").rstrip("")

處理‘萬(wàn)’字

int(round(float(num.replace("萬(wàn)", "").replace("
", "").replace("
", "")) * 10000))
存儲(chǔ)與刷新

采集到的信息需要存儲(chǔ)到lean cloud的存儲(chǔ)中,會(huì)調(diào)用lean cloud所提供的API

字段設(shè)計(jì)

Chairman

id
直播間的唯一id

name
直播間主播名稱

title
直播間的標(biāo)題

href
直播間的頁(yè)面地址

num
直播間的人氣

img
直播間的截圖

接口設(shè)計(jì) /fetch

Fetch的接口包含了清空、采集、解析、存儲(chǔ)所有的更新邏輯,設(shè)計(jì)這個(gè)接口的目的主要是方便后面使用云函數(shù)進(jìn)行定時(shí)調(diào)用,以更新數(shù)據(jù),調(diào)用邏輯如下(lean cloud不支持全部遍歷,所以用了while循環(huán)來(lái)遍歷所有,先清空,再采集):

leancloud.init(LEAN_CLOUD_ID, LEAN_CLOUD_SECRET)
query = leancloud.Query("Chairman")
allDataCompleted = False
batch = 0
limit = 1000
while not allDataCompleted:
    query.limit(limit)
    query.skip(batch * limit)
    query.add_ascending("createdAt")
    resultList = query.find()
    if len(resultList) < limit:
        allDataCompleted = True
        leancloud.Object.destroy_all(resultList)
    batch += 1

fetcher = Fetcher()
fetcher.fetch_douyu()
/chairmans(redis版本才支持)

Django-rest-framework提供,可以通過(guò)分頁(yè)的方式展現(xiàn)當(dāng)前庫(kù)中的信息

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

Django-rest-framework提供,可以根據(jù)指定id獲取某一個(gè)主播的信息

刷新機(jī)制

lean cloud提供了一種云函數(shù)的概念,并且可以像配置cron一樣,定期的去觸發(fā)某一個(gè)請(qǐng)求,為了能夠定期的更新排行榜,我們會(huì)通過(guò)配置這個(gè)云函數(shù),實(shí)現(xiàn)定期的數(shù)據(jù)刷新
云函數(shù)是一個(gè)cloud.py文件,內(nèi)容如下

engine = Engine(get_wsgi_application())

@engine.define
def fetch(**params):
    leancloud.init(LEAN_CLOUD_ID, LEAN_CLOUD_SECRET)
    # fetch邏輯

在lean cloud中配置定時(shí)執(zhí)行

頁(yè)面展示

頁(yè)面部分比較簡(jiǎn)單,以一個(gè)列表的形式,展現(xiàn)了主播的排行榜信息,點(diǎn)擊某一個(gè)主播,直接跳轉(zhuǎn)到對(duì)應(yīng)直播網(wǎng)站的目標(biāo)直播間。因?yàn)榭紤]到在手機(jī)上的顯示,所以做了自適應(yīng)

列表頁(yè)

列表頁(yè)的渲染使用了Django的模板引擎
由于lean cloud的存儲(chǔ)和Django的orm不一樣,所以這里需要將attributes放到列表中,頁(yè)面上才能用模板語(yǔ)法進(jìn)行訪問(wèn)
view部分代碼:

def get_index(request):
    leancloud.init(LEAN_CLOUD_ID, LEAN_CLOUD_SECRET)

    query = leancloud.Query("Chairman")
    chairmans = []

    for chairman in query.add_descending("num").find():
        chairmans.append(chairman.attributes)

    return render_to_response("index.html", locals(),
                              context_instance=RequestContext(request))

頁(yè)面部分代碼:

{% for chairman in chairmans %}
    
        
![]({{ chairman.img }})
{{ chairman.name }}
{{ chairman.title }}
{{ chairman.num }}人
{% endfor %}
項(xiàng)目部署

因?yàn)椴渴鹪诹薼ean cloud上,可以直接使用提供的lean-cli進(jìn)行部署,
lean-cli的詳細(xì)介紹在這里:
https://www.leancloud.cn/docs...部署
這里為了方便直接在頁(yè)面上進(jìn)行配置

配置git庫(kù)

配置Deploy Key

設(shè)置域名

部署

配置定時(shí)任務(wù)

后言

整個(gè)項(xiàng)目比較簡(jiǎn)單,目的是為了練手。如有疑問(wèn),歡迎在github上面發(fā)issue。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/40648.html

相關(guān)文章

  • 手把手教你基于WordPress搭建自己個(gè)人博客

    摘要:一步一步教你基于搭建自己的個(gè)人博客,作為成熟的框架,美觀,方便,插件多,更新頻繁,非常適合個(gè)人博客與網(wǎng)站的搭建,適合新手,無(wú)需太多的代碼基礎(chǔ)。原文鏈接手把手教你搭建自己的網(wǎng)站購(gòu)買購(gòu)買云服務(wù)器為了搭建個(gè)人網(wǎng)站,首先肯定需要一個(gè)云服務(wù)器。 一步一步教你基于WordPress搭建自己的個(gè)人博客,WordPress作為成熟的CMS框架,美觀,方便,插件多,更新頻繁,非常適合個(gè)人博客與網(wǎng)站的搭建...

    vpants 評(píng)論0 收藏0
  • 步一教你用 Vue.js + Vuex 制作專門收藏微信公眾號(hào) app

    摘要:箭頭表示數(shù)據(jù)的流動(dòng),負(fù)責(zé)儲(chǔ)存收藏夾的內(nèi)容,方便下一次打開(kāi)應(yīng)用的時(shí)候內(nèi)容不會(huì)丟失,服務(wù)器負(fù)責(zé)根據(jù)關(guān)鍵字爬取搜狗提供的數(shù)據(jù)。 只看不贊,或者只收藏不贊的都是耍流氓,放學(xué)別走,我找我哥收拾你們。 項(xiàng)目地址:https://github.com/jrainlau/wechat-subscriptor showImg(https://segmentfault.com/img/bVyFVF); s...

    aboutU 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<