緣起:家里有兩臺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)