1 数据获取

腾讯视频的网站中隐含的是一个非结构化的数据。R语言的“XML”包中htmlParse和getNodeSet非常强大,通过htmlParse可以抓取页面数据并形成树状结构,getNodeSet可以对抓取的数据根据XPath语法来选取特定的节点集合。“revst”包的html_nodes与html_attr可以分别获得节点和属性。
下面是爬取腾讯视频网站中电影数据的一部分关键代码:

1.1加载一些包

library(rvest)
library(XML)
library(dplyr)

1.2 读取页面

腾讯视频中热门电影的显示情况为每页显示30条数据,据此设置要爬取的每个网页的URL依次访问,read_html函数读取网页信息。

num = seq(from=0,by=30,to = 4980)
urls = paste0("http://v.qq/x/list/movie?pay=-1&offset=",num)
url_html = read_html(url)

1.3 获取节点信息

用%>%符号进行层级划分。web就是之前存储网页信息的变量,通过分析网页源码的CSS结构通过html_nodes()函数获取网页里的相应节点。最后用html_text()函数获取文本信息,否则返回整个标签。

#获得电影名
getmoviename = function(url_html){
moviename = url_html %>% html_nodes("div[class='figure_title_score'] strong a") %>% html_text
return(moviename)
}

1.4 提取属性

这里用getNodeSet函数获取满足条件的所有节点,再通过循环用xmlGetAttr函数把所有电影节点中的“herf”属性提取出来。

#获得视频的播放地址
getmovie_url =function(pagetree){
  get_url=NULL
  data=getNodeSet(pagetree,path = "//li[@class='list_item']/a")
  for( i in 1:length(data)){
    a = xmlGetAttr(data[[i]],name = "href")
    get_url = c(get_url,a)
  }
  return (get_url)
}

1.5 字符串处理

由于每部电影不一定都有导演和演员数据,直接爬取会导致数据错乱,因此,我们通过每部电影的URL判断是否含有导演和演员,对数据进行扩充。以下是爬取演员和导演数据并对获得的字符串做处理。

director_actor = html_data %>% html_nodes("div[class='director']") %>% html_text
process_datas = process_data(director_actor)
#处理演员导演字符串
process_data =function(rawdata){
  data = NULL
  for(i in 1:length(rawdata)){
    data[i] = strsplit(rawdata[i],"演员:")
    data[[i]]=sub("导演:","",data[[i]])
    data[[i]]=sub("\n","",data[[i]])
    data[[i]]=gsub(" ","",data[[i]])
  }
  return(data)
}

2 数据清洗

由于数据是通过爬虫从网络上爬下来的,有可能因为数据缺失,重复等,因此需要对数据做清洗。

2.1 筛选重复数据

#去掉重复的数据
rawmovie=unique(rawmovie)

2.2 筛选缺失值

movie_new=movie_dir_act[!is.na(movie_dir_act$actor),]

对于某些数据条的格式不正确等通过Excel筛选删除,比如电视剧经常会出DVD版,花絮版,纪录片版等,通过关键字,删除重复的数据。

结果

爬取具体数据如下:


更多推荐

爬取腾讯视频网站数据