摘要:不過因為各個平臺互相挖人的關(guān)系,導(dǎo)致關(guān)注的一些主播分散到了各個直播平臺,來回切換有點麻煩,所以萌生了做一個視頻聚合站的想法。后續(xù)我們會對這三個部分的功能做逐一展開說明。正則處理要求比較高,但是幾乎能應(yīng)對所有的情況,屬于大殺器。
前言
作為一個爐石傳說玩家,經(jīng)常有事沒事開著直播網(wǎng)站看看大神們的精彩表演。不過因為各個平臺互相挖人的關(guān)系,導(dǎo)致關(guān)注的一些主播分散到了各個直播平臺,來回切換有點麻煩,所以萌生了做一個視頻聚合站的想法。
我主要去采集斗魚、熊貓等的爐石區(qū)的主播信息。雖然各個站點的人氣信息有水分,但還是做了個簡單的排名。
上圖:
手機上的效果圖:
話不多說,上網(wǎng)站: http://lushiba.leanapp.cn/
項目部輸在了leancloud上,比較省心,但有一定的免費額度(如果顯示超出限制,需要晚一些來訪問,畢竟免費的,每天6個小時限制)
源碼地址: https://github.com/ieiayaobb/... 歡迎Star
master分支是redis方式存儲實現(xiàn)
lean分支是基于lean cloud的實現(xiàn)
基礎(chǔ)介紹聚合站的思路就是采集目標(biāo)站點的相關(guān)信息,通過數(shù)據(jù)處理將想要的信息做提取,整理入庫,然后通過web展示。因為直播平臺數(shù)據(jù)實時在變,所以考慮將存儲的數(shù)據(jù)放在緩存中(redis),因為部署在了lean cloud上,所以示例就直接存儲在了lean cloud的存儲上。
為了方便講解,我們以斗魚為目標(biāo)采集的網(wǎng)站,介紹解析和存儲部分的內(nèi)容,其他網(wǎng)站的處理大同小異。
功能說明整體項目就分為數(shù)據(jù)采集解析、數(shù)據(jù)存儲、web展現(xiàn)三大功能。后續(xù)我們會對這三個部分的功能做逐一展開說明。
技術(shù)選型語言(Python)
輕量級的項目,直接就是用了Python來做,Python在爬蟲、web方面都有著不錯的庫支持,而且lean cloud也支持Python部署,所以毫不猶豫的就采用了Python來做
數(shù)據(jù)采集(requests)
requests的特點就是輕量,且簡單易用。雖然這是個爬蟲項目,但實在規(guī)模太小,所以沒必要上scrapy了
requests的介紹地址:http://docs.python-requests.o...
請求模擬url = "http://www.douyu.com/directory/game/How" session = requests.Session() response = session.get(url, verify=False)數(shù)據(jù)解析
解析部分主要有兩種:正則,BeautifulSoup
這里為了通用,直接使用了正則來解析。
正則處理要求比較高,但是幾乎能應(yīng)對所有的情況,屬于大殺器。
BeautifulSoup4的詳細(xì)介紹: https://www.crummy.com/softwa...
web框架(Django)
Django是Python比較重量級的框架,Django自帶了orm的框架,可惜這個項目中用不到。但是我們會使用Django的模板引擎,Django的模板引擎也是很方便的一個特性。Django還提供了django-rest-framework,方便開發(fā)RESTful的接口,這個項目后續(xù)做了個配搭的React Native的mobile應(yīng)用,所以引入了django-rest-framework。
詳細(xì)介紹在此:https://www.djangoproject.com/
存儲(lean cloud的數(shù)據(jù)存儲)
既然用了lean cloud,存儲就直接用了lean提供的存儲功能。
詳細(xì)的介紹在這里: https://leancloud.cn/docs/lea...
部署(用了lean cloud的引擎)
參考了lean cloud官方的項目骨架: https://github.com/leancloud/...
前端展示(pureCSS)
pureCss還是為了簡單,支持響應(yīng)式,并且提供了基礎(chǔ)的UI組件
詳細(xì)介紹在這里: https://purecss.io/
環(huán)境準(zhǔn)備Python的開發(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)容解析
斗魚爐石區(qū)
目標(biāo)是采集爐石區(qū)所有主播的鏈接地址和人氣情況
#### 頁面內(nèi)容(單個主播的信息)
衣錦夜行:狂野 登頂?shù)琼?/h3> 爐石傳說
衣錦夜行 8.1萬
我們需要采集的有幾部分內(nèi)容:
直播間url (節(jié)點里的href,/yechui)
直播間的標(biāo)題(節(jié)點里的title,衣錦夜行:狂野 登頂?shù)琼敚?/p>
直播間的截圖(節(jié)點里的img標(biāo)簽的src,https://rpic.douyucdn.cn/a170...)
直播間的人氣(8.1萬)(這里有個注意的地方,斗魚的人氣可能是X萬,需要把這個萬轉(zhuǎn)化成數(shù)值方便排序)
主播名稱(衣錦夜行)
頁面處理與采集所有完整的直播站處理代碼在fetch.py中
#### 命中主播信息節(jié)點
re.finditer("([sS]*?)", response.content.decode("utf8")):
簡單的說明一下代碼:
response.content.decode("utf8")
主要是講requests請求的頁面以utf8編碼返回
正則部分就是命中上述的主播節(jié)點的內(nèi)容,截取整個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("")
處理‘萬’字
int(round(float(num.replace("萬", "").replace(" ", "").replace(" ", "")) * 10000))存儲與刷新
采集到的信息需要存儲到lean cloud的存儲中,會調(diào)用lean cloud所提供的API
字段設(shè)計Chairman
id
直播間的唯一id
name
直播間主播名稱
title
直播間的標(biāo)題
href
直播間的頁面地址
num
直播間的人氣
img
直播間的截圖
Fetch的接口包含了清空、采集、解析、存儲所有的更新邏輯,設(shè)計這個接口的目的主要是方便后面使用云函數(shù)進(jìn)行定時調(diào)用,以更新數(shù)據(jù),調(diào)用邏輯如下(lean cloud不支持全部遍歷,所以用了while循環(huán)來遍歷所有,先清空,再采集):
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提供,可以通過分頁的方式展現(xiàn)當(dāng)前庫中的信息
/chairman/{id}(redis版本才支持)Django-rest-framework提供,可以根據(jù)指定id獲取某一個主播的信息
刷新機制lean cloud提供了一種云函數(shù)的概念,并且可以像配置cron一樣,定期的去觸發(fā)某一個請求,為了能夠定期的更新排行榜,我們會通過配置這個云函數(shù),實現(xiàn)定期的數(shù)據(jù)刷新
云函數(shù)是一個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中配置定時執(zhí)行
頁面展示頁面部分比較簡單,以一個列表的形式,展現(xiàn)了主播的排行榜信息,點擊某一個主播,直接跳轉(zhuǎn)到對應(yīng)直播網(wǎng)站的目標(biāo)直播間。因為考慮到在手機上的顯示,所以做了自適應(yīng)
列表頁列表頁的渲染使用了Django的模板引擎
由于lean cloud的存儲和Django的orm不一樣,所以這里需要將attributes放到列表中,頁面上才能用模板語法進(jì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))
頁面部分代碼:
{% for chairman in chairmans %}項目部署{% endfor %}{{ chairman.name }}{{ chairman.title }}{{ chairman.num }}人
因為部署在了lean cloud上,可以直接使用提供的lean-cli進(jìn)行部署,
lean-cli的詳細(xì)介紹在這里:
https://www.leancloud.cn/docs...部署
這里為了方便直接在頁面上進(jìn)行配置
配置git庫
配置Deploy Key
設(shè)置域名
部署
配置定時任務(wù)
整個項目比較簡單,目的是為了練手。如有疑問,歡迎在github上面發(fā)issue。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/40648.html
摘要:一步一步教你基于搭建自己的個人博客,作為成熟的框架,美觀,方便,插件多,更新頻繁,非常適合個人博客與網(wǎng)站的搭建,適合新手,無需太多的代碼基礎(chǔ)。原文鏈接手把手教你搭建自己的網(wǎng)站購買購買云服務(wù)器為了搭建個人網(wǎng)站,首先肯定需要一個云服務(wù)器。 一步一步教你基于WordPress搭建自己的個人博客,WordPress作為成熟的CMS框架,美觀,方便,插件多,更新頻繁,非常適合個人博客與網(wǎng)站的搭建...
摘要:箭頭表示數(shù)據(jù)的流動,負(fù)責(zé)儲存收藏夾的內(nèi)容,方便下一次打開應(yīng)用的時候內(nèi)容不會丟失,服務(wù)器負(fù)責(zé)根據(jù)關(guān)鍵字爬取搜狗提供的數(shù)據(jù)。 只看不贊,或者只收藏不贊的都是耍流氓,放學(xué)別走,我找我哥收拾你們。 項目地址:https://github.com/jrainlau/wechat-subscriptor showImg(https://segmentfault.com/img/bVyFVF); s...
閱讀 3556·2023-04-25 21:43
閱讀 3126·2019-08-29 17:04
閱讀 828·2019-08-29 16:32
閱讀 1567·2019-08-29 15:16
閱讀 2174·2019-08-29 14:09
閱讀 2773·2019-08-29 13:07
閱讀 1657·2019-08-26 13:32
閱讀 1346·2019-08-26 12:00