1、网站信息及爬虫目标

以b站某up主的视频主页https://space.bilibili.com/2206456/video为例,要爬取该up主的所有视频标题、播放量及评论,主要采用的是动态网页中常用的httr包,现观察我们的网页情况如下:

r语言爬虫东方财富帖子 r语言爬取网页数据_数据

可以看到,相关的信息可以由network里的“search?mid=......"这个接口得到,查看Preview可看到里面有相应的作者,评论,发布动态的描述、视频标题,观看数、分区等信息,我们以评论数、观看数和标题为例。现在看相应的Headers情况:

r语言爬虫东方财富帖子 r语言爬取网页数据_json_02

可以看到相应的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、结果 

 观察结果大致这样:

 

r语言爬虫东方财富帖子 r语言爬取网页数据_r语言爬虫东方财富帖子_03

4、关于第2段代码

第2段代码中我们单独拿一页出来分析看看,content返回的数据是一个列表格式,即:

u1<-GET(url)
  shuju<-content(u1)#返回的是列表格式

以第一页为例,输出的结果是这样的:

r语言爬虫东方财富帖子 r语言爬取网页数据_json_04

 

 

对于这种情况,怎么一次性提取list当中的某部分内容,了解还不多,这里的方法是套用了一个循环,以title为例,第一个视频的title在list当中的路径是:shuju[["data"]][["list"]][["vlist"]][[1]][["title"]] ,而第2个视频只需要把这个标红的1改成2就好,以此类推,套用循环就可以快速处理。之后看看是否有更简单的处理方式。

后续可能研究下其他网址的header,request,response中需要用到的其他信息。