緣起:家里有兩臺PC,1臺MAC,1臺MINI,一臺筆記本,2手機。下載大量學(xué)習(xí)資料,都在一臺機器上,不方便學(xué)習(xí)。故準備搭建基于內(nèi)網(wǎng)的影院系統(tǒng),方便各種終端自由瀏覽學(xué)習(xí)資料。
需求:要有上次訪問記錄。支持模糊查詢。資源統(tǒng)計。全格式播放。支持外掛字幕。
2022-10-26更新:從0開始
準備搭建硬盤陣列。工欲善其事,必先利其器。準備了一個硬盤柜和機械硬盤,共計26T。陣列模式選擇:RAID5。該模式會將我的幾塊硬盤合并為一個完整的具有容災(zāi)功能的硬盤。哪怕將來有哪塊硬盤損壞,直接關(guān)閉電源替換硬盤就可以。
2022-11-02更新:陣列搭建完成。
比想象的配置簡單,因為不喜歡圖形化界面的配置,就選擇很粗暴的機械配置,就是硬盤柜后面的按鈕組合,組合成RAID5的陣列模式。經(jīng)過長期的文件傳輸,美劇及電影已經(jīng)就位。接下來是基礎(chǔ)技術(shù)選型和技術(shù)架構(gòu)。我最開始的設(shè)想是,因為本人是純java程序猿,所以第一反應(yīng)永遠是希望用java去解決問題。
技術(shù)架構(gòu)原始設(shè)想:
1,底層識別硬盤文件夾及視頻,獲取縮略信息
2,nginx做反向代理,將服務(wù)映射到整個家庭網(wǎng)絡(luò)。
3,thymeleaf做框架頁面模板,將視頻及全部的目錄結(jié)構(gòu)展現(xiàn)成網(wǎng)頁,以實現(xiàn)成一個完整的家庭影院系統(tǒng)。
4,最后用java寫的爬蟲,去根據(jù)我目錄里的電影名稱,去獲取豆瓣的電影簡介/演員/年份/評分/封面海報,最終展現(xiàn)在網(wǎng)頁上。
家庭影院系統(tǒng),實現(xiàn)的功能點有:
- 電影要想各大院線app一樣,通過點擊封面的形式播放,而不是一個文字列表
- 要現(xiàn)實我上次的播放記錄,以免看完電視劇,下次不記得看到哪集
- 將我最近下載的電影單獨列出來,比如有一個選項,最近更新(一兩周之內(nèi)的),最近播放。
- 可以不做實時同步,設(shè)計一個按鍵,點擊,則更新最新下載電影的海報等豆瓣信息
實際問題:java并不能很好的解析現(xiàn)在網(wǎng)頁。大概就是因為VUE等這種技術(shù)的出現(xiàn),傳統(tǒng)java的爬蟲主要是獲取全部的網(wǎng)頁字符流,根據(jù)字符匹配。但是現(xiàn)在的網(wǎng)頁與瀏覽器的行為交互較多,會導(dǎo)致獲取的字符流并不是最終網(wǎng)頁呈現(xiàn)的樣子。而java模擬瀏覽器行為再去爬,可就費勁了。干脆,拋棄原有模式。核心思想一句話,讓它去干它擅長的事情。
爬蟲部分,改為Python。前端部分改為VUE。后端待定。
Python需要具備以下幾個功能,并且逐一開發(fā),嘗試。(現(xiàn)學(xué)現(xiàn)賣,面向搜索引擎編程)
- 可以獲取目錄結(jié)構(gòu),并且獲取到最近兩周內(nèi)更新的電影。
- 爬取豆瓣的影評,評分,封面,根據(jù)本地電影名匹配
- 將封面存儲于電影文件夾下的單獨目錄中,統(tǒng)一命名。
- 將其他信息存儲于txt文件中,方便前端讀取
實現(xiàn)根據(jù)電影名搜索信息,功能拆分兩部分,第一部分通過搜索,定位硬盤列表,并根據(jù)title匹配同名電影,給出鏈接。第二部分根據(jù)鏈接獲取詳細的信息。
根據(jù)搜索定位詳情頁面
卡住了,豆瓣的網(wǎng)頁里,div的class每次刷新都會變,干不會了
獲取詳細信息:
from lxml import etree
url='https://movie.douban.com/subject/26363254/'
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36'
}
#請求結(jié)果的數(shù)據(jù)
resp=requests.get(url=url,headers=headers)
#轉(zhuǎn)換為HTML格式
data=etree.HTML(resp.text)
#定義電影數(shù)據(jù)對象
MovieList={}
#定義一個大盒子,裝電影的詳細數(shù)據(jù)
MoveInfoList=data.xpath('//div[@class="subjectwrap clearfix"]')
for infos in MoveInfoList:
#獲取海報鏈接
#獲取海報鏈接
poster=infos.xpath('div[@class="subject clearfix"]/div[@id="mainpic"]/a/img/@src')[0]
#獲取電影名
name=infos.xpath('div[@class="subject clearfix"]/div[@id="mainpic"]/a/img/@alt')[0]
#獲取電影類型
movieType=infos.xpath('div[@class="subject clearfix"]/div[@id="info"]/span[@property="v:genre"]/text()')
#獲取電影評分
score=infos.xpath('div[@id="interest_sectl"]/div[@class="rating_wrap clearbox"]/div[@class="rating_self clearfix"]/strong/text()')[0]
#將數(shù)據(jù)放入字典
MovieList['poster']=poster
MovieList['name']=name
MovieList['movieType']=movieType
MovieList['score']=score
print(MovieList)