摘要:不過因為各個平臺互相挖人的關系,導致關注的一些主播分散到了各個直播平臺,來回切換有點麻煩,所以萌生了做一個視頻聚合站的想法。后續我們會對這三個部分的功能做逐一展開說明。正則處理要求比較高,但是幾乎能應對所有的情況,屬于大殺器。
前言
作為一個爐石傳說玩家,經常有事沒事開著直播網站看看大神們的精彩表演。不過因為各個平臺互相挖人的關系,導致關注的一些主播分散到了各個直播平臺,來回切換有點麻煩,所以萌生了做一個視頻聚合站的想法。
我主要去采集斗魚、熊貓等的爐石區的主播信息。雖然各個站點的人氣信息有水分,但還是做了個簡單的排名。
上圖:
手機上的效果圖:
話不多說,上網站: 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...
請求模擬url = "http://www.douyu.com/directory/game/How" session = requests.Session() 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內容如下:
Django==1.9.7 requests==2.10.0 wheel==0.24.0 gunicorn leancloud-sdk>=1.0.9分析與采集 視頻站內容解析
斗魚爐石區
目標是采集爐石區所有主播的鏈接地址和人氣情況
#### 頁面內容(單個主播的信息)
![](http://upload-images.jianshu.io/upload_images/2485846-20d3cbfd6e33df69.gif?imageMogr2/auto-orient/strip)衣錦夜行:狂野 登頂登頂
爐石傳說衣錦夜行 8.1萬
我們需要采集的有幾部分內容:
直播間url (節點里的href,/yechui)
直播間的標題(節點里的title,衣錦夜行:狂野 登頂登頂)
直播間的截圖(節點里的img標簽的src,https://rpic.douyucdn.cn/a170...)
直播間的人氣(8.1萬)(這里有個注意的地方,斗魚的人氣可能是X萬,需要把這個萬轉化成數值方便排序)
主播名稱(衣錦夜行)
頁面處理與采集所有完整的直播站處理代碼在fetch.py中
#### 命中主播信息節點
re.finditer("([sS]*?)", response.content.decode("utf8")):
簡單的說明一下代碼:
response.content.decode("utf8")
主要是講requests請求的頁面以utf8編碼返回
正則部分就是命中上述的主播節點的內容,截取整個a標簽
解析代碼采集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("").rstrip("")
處理‘萬’字
int(round(float(num.replace("萬", "").replace(" ", "").replace(" ", "")) * 10000))存儲與刷新
采集到的信息需要存儲到lean cloud的存儲中,會調用lean cloud所提供的API
字段設計Chairman
id
直播間的唯一id
name
直播間主播名稱
title
直播間的標題
href
直播間的頁面地址
num
直播間的人氣
img
直播間的截圖
Fetch的接口包含了清空、采集、解析、存儲所有的更新邏輯,設計這個接口的目的主要是方便后面使用云函數進行定時調用,以更新數據,調用邏輯如下(lean cloud不支持全部遍歷,所以用了while循環來遍歷所有,先清空,再采集):
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提供,可以通過分頁的方式展現當前庫中的信息
/chairman/{id}(redis版本才支持)Django-rest-framework提供,可以根據指定id獲取某一個主播的信息
刷新機制lean cloud提供了一種云函數的概念,并且可以像配置cron一樣,定期的去觸發某一個請求,為了能夠定期的更新排行榜,我們會通過配置這個云函數,實現定期的數據刷新
云函數是一個cloud.py文件,內容如下
engine = Engine(get_wsgi_application()) @engine.define def fetch(**params): leancloud.init(LEAN_CLOUD_ID, LEAN_CLOUD_SECRET) # fetch邏輯
在lean cloud中配置定時執行
頁面展示頁面部分比較簡單,以一個列表的形式,展現了主播的排行榜信息,點擊某一個主播,直接跳轉到對應直播網站的目標直播間。因為考慮到在手機上的顯示,所以做了自適應
列表頁列表頁的渲染使用了Django的模板引擎
由于lean cloud的存儲和Django的orm不一樣,所以這里需要將attributes放到列表中,頁面上才能用模板語法進行訪問
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.img }}){{ chairman.name }}{{ chairman.title }}{{ chairman.num }}人
因為部署在了lean cloud上,可以直接使用提供的lean-cli進行部署,
lean-cli的詳細介紹在這里:
https://www.leancloud.cn/docs...部署
這里為了方便直接在頁面上進行配置
配置git庫
配置Deploy Key
設置域名
部署
配置定時任務
整個項目比較簡單,目的是為了練手。如有疑問,歡迎在github上面發issue。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40648.html
摘要:一步一步教你基于搭建自己的個人博客,作為成熟的框架,美觀,方便,插件多,更新頻繁,非常適合個人博客與網站的搭建,適合新手,無需太多的代碼基礎。原文鏈接手把手教你搭建自己的網站購買購買云服務器為了搭建個人網站,首先肯定需要一個云服務器。 一步一步教你基于WordPress搭建自己的個人博客,WordPress作為成熟的CMS框架,美觀,方便,插件多,更新頻繁,非常適合個人博客與網站的搭建...
摘要:箭頭表示數據的流動,負責儲存收藏夾的內容,方便下一次打開應用的時候內容不會丟失,服務器負責根據關鍵字爬取搜狗提供的數據。 只看不贊,或者只收藏不贊的都是耍流氓,放學別走,我找我哥收拾你們。 項目地址:https://github.com/jrainlau/wechat-subscriptor showImg(https://segmentfault.com/img/bVyFVF); s...
閱讀 3469·2023-04-25 21:43
閱讀 3096·2019-08-29 17:04
閱讀 797·2019-08-29 16:32
閱讀 1533·2019-08-29 15:16
閱讀 2142·2019-08-29 14:09
閱讀 2731·2019-08-29 13:07
閱讀 1623·2019-08-26 13:32
閱讀 1320·2019-08-26 12:00