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

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

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

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

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

小姐姐主页

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

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

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

爬虫三步走:

第一步:分析网页:

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

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

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

1
2
3
4
5
6
7
div.videoCont>
div.videoList>
div.video>
div.MIAOPAI_player>
div.video-player>
video
src

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

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

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

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

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

第二部:抓取网页:

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

1
2
3
4
5
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属性)。

1
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,接下我们的任务就是构造可用的视频下载地址。

1
2
baseurl<-"http://gslb.miaopai.com/stream/"
mymvlinks<-paste0(baseurl,mylinks,".mp4")

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

1
2
3
#[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下面都有个含歌名的句子,就抓这句文字就行。

1
2
3
4
5
6
7
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] "这个《双截棍》也太柔了吧!唱的心都醉啦"

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

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

1
2
3
4
mymvname<-c()
for (i in 1:length(myinfo) ){
mymvname[i]<-substr(myinfo[i],regexpr("《",myinfo[i])[1]+1,regexpr("》",myinfo[i])[1]-1)
}

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

1
2
mymvname<-paste0(mymvname,".mp4")
[1] "方圆几里.mp4" "第二自我.mp4" "丑八怪.mp4" "她说.mp4" "双截棍.mp4"

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

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

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

1
2
3
for (i in 1:length(myinfo)){
download.file(mymvlinks[i],mymvname[i],mode="wb")
}



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

接下来做一个完整的代码汇总:

第一步:分析网页:

第二部:爬取网页:

1
2
3
4
5
6
7
8
9
10
11
12
13
setwd("E:/CloudMusic")
library(tidyverse)
library(rvest)
library(stringr)
mylinks<-read_html(url,encoding="utf-8")%>%html_nodes("div.videoCont>div.videoList>div.video>div.MIAOPAI_player")%>%html_attr("data-scid")#爬取视频ID:
baseurl<-"http://gslb.miaopai.com/stream/"
mymvlinks<-paste0(baseurl,mylinks,".mp4") #构造视频链接:
myinfo<-read_html(url,encoding="utf-8")%>%html_nodes("div.viedoAbout")%>%html_text(trim = TRUE)#爬取评论文本
mymvname<-c()
for (i in 1:length(myinfo) ){
mymvname[i]<-substr(myinfo[i],regexpr("《",myinfo[i])[1]+1,regexpr("》",myinfo[i])[1]-1)
}#提取视频名称
mymvname<-paste0(mymvname,".mp4")#构造视频名称(带格式)

第三步:构造下载函数:

1
2
3
for (i in 1:length(myinfo)){
download.file(mymvlinks[i],mymvname[i],mode="wb")
}


联系方式:
wechat:ljty1991
Mail:578708965@qq.com
个人公众号:数据小魔方(datamofang)
团队公众号:EasyCharts
qq交流群:[魔方学院]298236508

个人简介:
杜雨
财经专业研究僧;
伪数据可视化达人;
文科背景的编程小白;
喜欢研究商务图表与地理信息数据可视化,爱倒腾PowerBI、SAP DashBoard、Tableau、R ggplot2、Think-cell chart等诸如此类的数据可视化软件,创建并运营微信公众号“数据小魔方”。
Mail:578708965@qq.com


备注信息:
知识共享许可协议
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。

坚持原创技术分享,您的支持将鼓励我继续创作!