查看原文
其他

一言不合就爬虫系列之——爬取小姐姐的秒拍MV

2017-07-12 杜雨 数据小魔方

大连的盛夏实在是热的让人心烦(对于我这种既怕热又怕冷的真的没地呆了)。


再加上令人头疼的毕业论文,这种日子怎能缺少MV来解暑呢。


既然要听,怎么只听一首呢,既然学了爬虫怎么让技能荒废呢。


好吧,烦躁的心情+想听MV的冲动+爬虫技能,今天小魔方教叫你使用R语言批量爬取秒拍小姐姐的清凉MV短片。


http://www.miaopai.com/u/paike_wgleqt8r08




今天要爬的主页是一位叫陶心瑶小姐姐,刷微博偶然听到她翻唱薛之谦的《方圆万里》,感觉蛮有味道的,于是搜了她的秒拍主页。


主页的作品不多,仅有5首,但是因为仅作为爬虫练习只用,五首也够了(毕竟只是构造循环而已,1000首的步骤也是如此,可能需要构造翻页请求)。



MV挺长比较占内存,所以这里就不演示怎么去大批量的爬MV了(刚买的m本内存都快被掏空了)。


爬虫三步走:


第一步:分析网页:


首先是到主页之后分析它的网页结构:




可以看到该主页只有5首mv列表,这时候鼠标随便定位到其中一首(我定位的是第一首),然后右键单击,打开开发者工具。


可以看到该首MV的视频地址存放在:


div.videoCont>

div.videoList>

div.video>

div.MIAOPAI_player>

div.video-player>

video

src




//gslb.miaopai.com/stream/AUTy2nx4l-T~BhG-zX60wSDwwqoWfwpa.mp4


尝试着用这个地址来浏览器中运行:




OK,一切正常,说明这个地址很给力!


随然完整的视频地址仅在video子节点的src属性中存放着,但是其实只要仔细研究就会发现,父节点MIAOPAI_player下的data-scid属性,data-img,子节点video内src,poster属性所存储的名称你图片链接名称中也是含有该视频的信息的。(共享一部分视频链接中的地址)。



事实上网页中展示的视频,最起码会给出三处可用的视频信息,即视频名称、视频封面页、视频的源地址。


(给出这里的解析只是想让大家知道,爬虫不要钻牛角尖,不要以为只有视频原地址的链接一条路可走,玩意节点的链接你抓不出来,那岂不是要哭瞎了)。


第二部:抓取网页:


然后该干嘛呢,当然是抓视频地址了(这里使用rvest包来抓)。


setwd("E:/CloudMusic")

library(tidyverse)

library(rvest)

library(stringr)


(read_html(url,encoding="utf-8")%>%html_nodes("div.videoCont>div.videoList>div.video>div.MIAOPAI_player>div.video-player>video"))


{xml_nodeset (0)}


啊哦,这意味着,软件不想理你,并向给你了个鄙视的眼神(请自己体会)。


抓不到地址很心酸的(自己去网页里面复制那也太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")


[1] "AUTy2nx4l-T~BhG-zX60wSDwwqoWfwpa" "ugJzN6LvH3emoPlSU2b52Cu-SbIQ5LFa" "wJ4AsVMgek6jp6lXDxIpXExCig9cVXo~" "I-J6u~qy7V5CpRIq-FoFA3pYtc6Yr0Sz"

[5] "pCLMPKezqWVWHyhjNHaRyKrX16APCeuw"


OK,完美搞定,接下来该干啥呢(快想快想)。(因为视频数量少,没有换页存储,所以这里不用构造换页请求,整个代码效率都提高了很多)


接下来当然是构造可用的视频地址啦,因为我们刚才抓的并非完整的可直接传递到视频源的地址,仅仅是视频的id而已。


好吧现在我们对比之前手工复制的视频源地址和这次抓到的视频id信息,观察规律。


AUTy2nx4l-T~BhG-zX60wSDwwqoWfwpa

http://gslb.miaopai.com/stream/AUTy2nx4l-T~BhG-zX60wSDwwqoWfwpa.mp4


好吧,这次是不是一看就看明白咋回事儿啦,没错,视频源地址就是在视频id的基础上左侧添加了秒拍服务端的视频流服务器主网址,右侧添加了.MP4的视频格式而已,OK,接下我们的任务就是构造可用的视频下载地址。


baseurl<-"http://gslb.miaopai.com/stream/"

mymvlinks<-paste0(baseurl,mylinks,".mp4")


OK两部搞定,敢不敢相信自己的眼睛哈哈。


[1] "http://gslb.miaopai.com/stream/AUTy2nx4l-T~BhG-zX60wSDwwqoWfwpa.mp4" "http://gslb.miaopai.com/stream/ugJzN6LvH3emoPlSU2b52Cu-SbIQ5LFa.mp4"

[3] "http://gslb.miaopai.com/stream/wJ4AsVMgek6jp6lXDxIpXExCig9cVXo~.mp4" "http://gslb.miaopai.com/stream/I-J6u~qy7V5CpRIq-FoFA3pYtc6Yr0Sz.mp4"

[5] "http://gslb.miaopai.com/stream/pCLMPKezqWVWHyhjNHaRyKrX16APCeuw.mp4"


如果不放心的话,可以使用这个地址再再浏览器中打开看一看,预览下是否可以观看视频。(放心吧我都替你试过了)


现在我们只是获取了视频下载地址,可是没有MV的歌名呀(命名和123最后下载完事你可以需要打开听一听才知道是啥歌,如果使用ID的话一串字母数字组合也很烦人)。


好吧索性再把名字趴下来:


可以看到每首MV下面都有个含歌名的句子,就抓这句文字就行。



myinfo<-read_html(url,encoding="utf-8")%>%html_nodes("div.viedoAbout")%>%html_text(trim = TRUE)


[1] "温暖女声陶心瑶翻唱薛之谦《方圆几里》                                 \n                                #陶心瑶第二自我##纪念青春的那些歌#"    

[2] "陶心瑶首张实体专辑《第二自我》众筹宣传片                                 \n                                #陶心瑶第二自我##纪念青春的那些歌#"

[3] "上课中《丑八怪》"                                                                                                                             

[4] "陶心瑶暖心翻唱JJ《她说》                                 \n                                #陶心瑶##林俊杰的第36页#"                          

[5] "这个《双截棍》也太柔了吧!唱的心都醉啦"   


抓完发现每一个句子里面的歌名都是带有书名号的(特么的中文的书名号怎么匹配内部中文呀,正则不会写~_~)


好吧,技不如人但是我勤快呀,就用字符串匹配函数一个个匹配吧!


mymvname<-c()

for (i in 1:length(myinfo) ){

mymvname[i]<-substr(myinfo[i],regexpr("《",myinfo[i])[1]+1,regexpr("》",myinfo[i])[1]-1)

}


匹配完成之后,把MP4的后缀带上。


mymvname<-paste0(mymvname,".mp4")

[1] "方圆几里.mp4" "第二自我.mp4" "丑八怪.mp4"   "她说.mp4"     "双截棍.mp4"  



都到了这份上了你还想怎样--好吧我只想把小姐姐的视频下载下来而已。


爬虫第三部:构建下载函数:


因为是五个视频文件要下载,所以需要构造循环下载函数:


for (i in 1:length(myinfo)){

download.file(mymvlinks[i],mymvname[i],mode="wb")

}



OK,爬完收工,是不是很简单呀,感觉去找个音乐网站试一下吧,这个夏天,让音乐来的更猛烈一些吧!


ps(最近实在太忙了,下次给小伙伴儿们爬B站哈哈~)




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存