一言不合就爬蟲系列之——爬取小姐姐的秒拍MV
大連的盛夏實在是熱的讓人心煩(對於我這種既怕熱又怕冷的真的沒地呆了)。
再加上令人頭疼的畢業論文,這種日子怎能缺少MV來解暑呢。
既然要聽,怎麼只聽一首呢,既然學了爬蟲怎麼讓技能荒廢呢。
好吧,煩躁的心情+想聽MV的衝動+爬蟲技能,今天小魔方教你使用R語言批量爬取秒拍小姐姐的MV視頻短片。
http://www.miaopai.com/u/paike_wgleqt8r08n
今天要爬的主頁是一位叫陶心瑤小姐姐,刷微博偶然聽到她翻唱薛之謙的《方圓萬里》,感覺蠻有味道的,於是搜了她的秒拍主頁。
主頁的作品不多,僅有5首,但是因為僅作為爬蟲練習只用,五首也夠了(畢竟只是構造循環而已,1000首的步驟也是如此,可能需要構造翻頁請求)。
MV挺長比較占內存,所以這裡就不演示怎麼去大批量的爬MV了(剛買的m本內存都快被掏空了)。
爬蟲三步走:
第一步:分析網頁:
首先是到主頁之後分析它的網頁結構:
可以看到該主頁只有5首mv列表,這時候滑鼠隨便定位到其中一首(我定位的是第一首),然後右鍵單擊,打開開發者工具。
可以看到該首MV的視頻地址存放在:
div.videoCont>ndiv.videoList>ndiv.video>ndiv.MIAOPAI_player>ndiv.video-player>nvideonsrcn//gslb.miaopai.com/stream/AUTy2nx4l-T~BhG-zX60wSDwwqoWfwpa.mp4n
嘗試著用這個地址來瀏覽器中運行:
OK,一切正常,說明這個地址很給力!
隨然完整的視頻地址僅在video子節點的src屬性中存放著,但是其實只要仔細研究就會發現,父節點MIAOPAI_player下的data-scid屬性,data-img,子節點video內src,poster屬性所存儲的名稱你圖片鏈接名稱中也是含有該視頻的信息的。(共享一部分視頻鏈接中的地址)。
事實上網頁中展示的視頻信息,最起碼會給出三處可用的視頻信息,即視頻名稱、視頻封面頁、視頻的源地址。
(給出這裡的解析只是想讓大家知道,爬蟲不要鑽牛角尖,不要以為只有視頻原地址的鏈接一條路可走,萬一節點的鏈接你抓不出來,那豈不是要哭瞎了)。
第二部:抓取網頁:
然後該幹嘛呢,當然是抓視頻地址了(這裡使用rvest包來抓)
setwd("E:/CloudMusic")nlibrary(tidyverse)nlibrary(rvest)nlibrary(stringr)n(read_html(url,encoding="utf-8")%>%html_nodes("div.videoCont>div.videoList>div.video>div.MIAOPAI_player>div.video-player>video"))n{xml_nodeset (0)}n
啊哦,這意味著,軟體不想理你,並向給你了個鄙視的眼神(請自己體會)。
抓不到地址很心酸的(自己去網頁裡面複製那也太low啦)。
腫么辦,腫么辦,腫么辦???
之前已經說過了,視頻地址鏈接並非唯一的手段,因為視頻的中的id在好幾個屬性值裡面都有包含,所有我們只需任意抓一個屬性值,通過觀察原始視頻地址進行鏈接的拼接即可。
如果不想做複雜的字元串處理,那就抓最原始的名稱吧。(這次目標是父節點MIAOPAI_player下的data-scid屬性)。
mylinks<-read_html(url,encoding="utf-8")%>%html_nodes("div.videoCont>div.videoList>div.video>div.MIAOPAI_player")%>%html_attr("data-scid")n[1] "AUTy2nx4l-T~BhG-zX60wSDwwqoWfwpa" "ugJzN6LvH3emoPlSU2b52Cu-SbIQ5LFa" "wJ4AsVMgek6jp6lXDxIpXExCig9cVXo~" "I-J6u~qy7V5CpRIq-FoFA3pYtc6Yr0Sz"n[5] "pCLMPKezqWVWHyhjNHaRyKrX16APCeuw"n
OK,完美搞定,接下來該幹啥呢(快想快想)。(因為視頻數量少,沒有換頁存儲,所以這裡不用構造換頁請求,整個代碼效率都提高了很多)
接下來當然是構造可用的視頻地址啦,因為我們剛才抓的並非完整的可直接傳遞到視頻源的地址,僅僅是視頻的id而已。
好吧現在我們對比之前手工複製的視頻源地址和這次抓到的視頻id信息,觀察規律。
AUTy2nx4l-T~BhG-zX60wSDwwqoWfwpanhttp://gslb.miaopai.com/stream/AUTy2nx4l-T~BhG-zX60wSDwwqoWfwpa.mp4
好吧,這次是不是一看就看明白咋回事兒啦,沒錯,視頻源地址就是在視頻id的基礎上左側添加了秒拍服務端的視頻流伺服器主網址,右側添加了.MP4的視頻格式而已,OK,接下我們的任務就是構造可用的視頻下載地址。
baseurl<-"http://gslb.miaopai.com/stream/"nmymvlinks<-paste0(baseurl,mylinks,".mp4")n
OK兩部搞定,敢不敢相信自己的眼睛哈哈。
[1] "http://gslb.miaopai.com/stream/AUTy2nx4l-T~BhG-zX60wSDwwqoWfwpa.mp4" "http://gslb.miaopai.com/stream/ugJzN6LvH3emoPlSU2b52Cu-SbIQ5LFa.mp4"n[3] "http://gslb.miaopai.com/stream/wJ4AsVMgek6jp6lXDxIpXExCig9cVXo~.mp4" "http://gslb.miaopai.com/stream/I-J6u~qy7V5CpRIq-FoFA3pYtc6Yr0Sz.mp4"n[5] "http://gslb.miaopai.com/stream/pCLMPKezqWVWHyhjNHaRyKrX16APCeuw.mp4"n
如果不放心的話,可以使用這個地址再再瀏覽器中打開看一看,預覽下是否可以觀看視頻。(放心吧我都替你試過了)
現在我們只是獲取了視頻下載地址,可是沒有MV的歌名呀(命名和123最後下載完事你可以需要打開聽一聽才知道是啥歌,如果使用ID的話一串字母數字組合也很煩人)。
好吧索性再把名字趴下來:
可以看到每首MV下面都有個含歌名的句子,就抓這句文字就行。
myinfo<-read_html(url,encoding="utf-8")%>%html_nodes("div.viedoAbout")%>%html_text(trim = TRUE)n
[1] "溫暖女聲陶心瑤翻唱薛之謙《方圓幾里》 n #陶心瑤第二自我##紀念青春的那些歌#" n[2] "陶心瑤首張實體專輯《第二自我》眾籌宣傳片 n #陶心瑤第二自我##紀念青春的那些歌#"n[3] "上課中《醜八怪》" n[4] "陶心瑤暖心翻唱JJ《她說》 n #陶心瑤##林俊傑的第36頁#" n[5] "這個《雙截棍》也太柔了吧!唱的心都醉啦" n
抓完發現每一個句子裡面的歌名都是帶有書名號的(特么的中文的書名號怎麼匹配內部中文呀,正則不會寫~_~)
好吧,技不如人但是我勤快呀,就用字元串匹配函數一個個匹配吧!
mymvname<-c()nfor (i in 1:length(myinfo) ){nmymvname[i]<-substr(myinfo[i],regexpr("《",myinfo[i])[1]+1,regexpr("》",myinfo[i])[1]-1)n}n
匹配完成之後,把MP4的後綴帶上。
mymvname<-paste0(mymvname,".mp4")n[1] "方圓幾里.mp4" "第二自我.mp4" "醜八怪.mp4" "她說.mp4" "雙截棍.mp4" n
都到了這份上了你還想怎樣--好吧我只想把小姐姐的視頻下載下來而已。
爬蟲第三部:構建下載函數:
因為是五個視頻文件要下載,所以需要構造循環下載函數:
for (i in 1:length(myinfo)){ndownload.file(mymvlinks[i],mymvname[i],mode="wb")n}n
OK,爬完收工,是不是很簡單呀,感覺去找個視頻網站試一下吧,這個夏天,讓音樂來的更猛烈一些吧!
接下來做一個完整的代碼匯總:
#第一步:分析網頁:
#第二部:爬取網頁:
setwd("E:/CloudMusic")nlibrary(tidyverse)nlibrary(rvest)nlibrary(stringr)nmylinks<-read_html(url,encoding="utf-8")%>%html_nodes("div.videoCont>div.videoList>div.video>div.MIAOPAI_player")%>%html_attr("data-scid")#爬取視頻ID:nbaseurl<-"http://gslb.miaopai.com/stream/"nmymvlinks<-paste0(baseurl,mylinks,".mp4") #構造視頻鏈接:nmyinfo<-read_html(url,encoding="utf-8")%>%html_nodes("div.viedoAbout")%>%html_text(trim = TRUE)#爬取評論文本nmymvname<-c()nfor (i in 1:length(myinfo) ){nmymvname[i]<-substr(myinfo[i],regexpr("《",myinfo[i])[1]+1,regexpr("》",myinfo[i])[1]-1)n}#提取視頻名稱nmymvname<-paste0(mymvname,".mp4")#構造視頻名稱(帶格式)n
#第三步:構造下載函數:
for (i in 1:length(myinfo)){ndownload.file(mymvlinks[i],mymvname[i],mode="wb")n}n
ps(最近實在太忙了,下次給小夥伴兒們爬B站哈~)
聯繫方式:
微信:ljty1991
博客主頁:raindu&amp;#x27;s home
個人公眾號:數據小魔方(datamofang)
團隊公眾號:EasyCharts
qq交流群:[魔方學院]298236508
推薦閱讀:
※【譯文】用R語言做網頁爬蟲和文本分析-Part3
※如何在神箭手上快速開發爬蟲——第二課 如何爬取JS動態生成的數據【豌豆莢遊戲排行榜】
※矽谷之路45:如何設計Crawler(二)多線程並發設計
※[R]利用R Markdown生成爬蟲分析報告