摘要:不過(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è)主播的信息)
衣錦夜行:狂野 登頂?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
直播間的截圖
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 %}項(xiàng)目部署{% endfor %}{{ chairman.name }}{{ chairman.title }}{{ chairman.num }}人
因?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
摘要:一步一步教你基于搭建自己的個(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)站的搭建...
摘要:箭頭表示數(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...
閱讀 3653·2023-04-25 21:43
閱讀 3165·2019-08-29 17:04
閱讀 867·2019-08-29 16:32
閱讀 1598·2019-08-29 15:16
閱讀 2210·2019-08-29 14:09
閱讀 2803·2019-08-29 13:07
閱讀 1678·2019-08-26 13:32
閱讀 1375·2019-08-26 12:00