一言不合就爬虫系列之——爬取小姐姐的秒拍MV
大连的盛夏实在是热的让人心烦(对于我这种既怕热又怕冷的真的没地呆了)。
再加上令人头疼的毕业论文,这种日子怎能缺少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站哈哈~)