1、网站信息及爬虫目标
以b站某up主的视频主页https://space.bilibili.com/2206456/video为例,要爬取该up主的所有视频标题、播放量及评论,主要采用的是动态网页中常用的httr包,现观察我们的网页情况如下:
可以看到,相关的信息可以由network里的“search?mid=......"这个接口得到,查看Preview可看到里面有相应的作者,评论,发布动态的描述、视频标题,观看数、分区等信息,我们以评论数、观看数和标题为例。现在看相应的Headers情况:
可以看到相应的URL和请求方式,多看几个页面的URL我们就可以知道,这里的pn=1表示的是视频主页的第一页,该up主总共5页视频,因此要得到所有视频情况,只需要将pn=1至pn=5套用循环就好了。而请求方式是选择了GET方式。这些信息是一个开放的api,因此不需要其他信息也可进行访问。
2、代码
首先清理所有数据,并加载相应的包,定义我们之后要用的数据类型:
rm(list=ls())
library(httr)
titles<-numeric()#为某一页的所有视频的标题向量
play<-numeric()#为某一页的所有视频的播放数向量
comments<-numeric()#为某一页的所有视频的评论数向量
result<-data.frame()#为某一页的所有视频信息的数据框
nresult<-data.frame()#为最后的结果数据框
接着,采用循环一页页输出结果:
for(i in 1:5)
{
url<-str_c("https://api.bilibili.com/x/space/arc/search?mid=2206456&ps=30&tid=0&pn=",i,"&keyword=&order=pubdate&jsonp=jsonp")
u1<-GET(url)
shuju<-content(u1)#返回的是列表格式
for(j in 1:30 )
{
ntitles<-shuju[["data"]][["list"]][["vlist"]][[j]][["title"]]#某一个视频的标题
titles<-c(titles,ntitles)#某一页的视频标题(向量形式)
nplay<-shuju[["data"]][["list"]][["vlist"]][[j]][["play"]]#某一个视频的播放量
play<-c(play,nplay)#某一页的视频播放量(向量形式)
ncomments<-shuju[["data"]][["list"]][["vlist"]][[j]][["comment"]]#某一个视频的评论数
comments<-c(comments,ncomments)#某一页的视频评论数(向量形式)
}
pages<-rep(i,30)
nresult<-cbind(pages,titles,play,comments)
result<-rbind(result,nresult)
}
3、结果
观察结果大致这样:
4、关于第2段代码
第2段代码中我们单独拿一页出来分析看看,content返回的数据是一个列表格式,即:
u1<-GET(url)
shuju<-content(u1)#返回的是列表格式
以第一页为例,输出的结果是这样的:
对于这种情况,怎么一次性提取list当中的某部分内容,了解还不多,这里的方法是套用了一个循环,以title为例,第一个视频的title在list当中的路径是:shuju[["data"]][["list"]][["vlist"]][[1]][["title"]] ,而第2个视频只需要把这个标红的1改成2就好,以此类推,套用循环就可以快速处理。之后看看是否有更简单的处理方式。
后续可能研究下其他网址的header,request,response中需要用到的其他信息。