经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » R语言 » 查看文章
Web Scraping with R: How to Fill Missing Value (爬虫:如何处理缺失值)
来源:cnblogs  作者:yukiwu  时间:2019/6/6 8:54:20  对本文有异议

网络上有大量的信息与数据。我们可以利用爬虫技术来获取这些巨大的数据资源。

这次用 IMDb 网站的2018年100部最欢迎的电影 来练练手,顺便总结一下 R 爬虫的方法。

Preparation

感谢 Hadley Wickham 大大,我们有 rvest 包可以用。因此爬虫前先安装并加载 rvest 包。

  1. #install package
  2. install.package('rvest')
  3. #loading library
  4. library('rvest')
Downloading and parsing HTML file

指定网页地址并且使用 read_html() 函数将网页转为 XML 对象。

  1. url <- 'https://www.imdb.com/search/title?count=100&release_date=2018-01-01,2018-12-31&view=advanced'
  2. webpage <- read_html(url)
Extracting Nodes

我期望获取的数据包括:
1) Rank: 排名
2) Title:电影名称
3) Runtime:电影时长
4) Genre:电影类型
5) Rating:观众评分
6) Metascore:媒体评分
7) Description:电影简介
8) Votes:观众投票支持的票数
9) Gross:电影票房

IDMb Movie

使用 html_nodes() 函数可以提取 XML 对象中的元素。其中该函数利用 CSS 选择器来匹配吻合的元素。

  1. #Using CSS selectors to extract node
  2. rank_data_html <- html_nodes(webpage, '.text-primary')
  3. #Converting the node to text
  4. rank_data <- html_text(rank_data_html)
  5. #Converting text value to numeric value
  6. rank_data <- as.numeric(rank_data)

因为需要利用 CSS 选择器, 所以这个部分或许需要一点 HTML/CSS 的基础知识。如果不熟悉 HTML/CSS,分享一个小方法:
1) 用浏览器(以 Chrome 为例)打开那个网页,然后按 F12 打开开发者工具
2) 点击开发者工具左上角的箭头去选择那个需要爬取的数据
3) 对应的那行代码就会在右侧的开发者工具被选中
4) 对着 CSS 选择器的文档查查就知道该怎么写了

IDMb Webpage

接着用类似的 Script 提取其他元素的数据。

Handling Missing Values

爬取元素后,如果仔细检查每组元素的长度,就会发现其实某些元素是有缺失值的。比如说 Metascore

  1. metascore_data_html <- html_nodes(webpage,'.metascore')
  2. metascore_data <- html_text(metascore_data_html)
  3. length(metascore_data)

怎么将网页中不存在的相应值用 NA 表示呢?

这里要了解一下 html_nodehtml_nodes 的区别了。运行 ?html_node 查看帮助文档:

html_node is like [[ it always extracts exactly one element. When given a list of nodes, html_node will always return a list of the same length, the length of html_nodes might be longer or shorter.

所以简单地说,就是我们可以先提取一组没有缺失值的父级 DOM,然后从这组 DOM 中逐个提取所需的子级 DOM。

粗暴地说,上代码:

  1. metascore_data_html <- html_node(html_nodes(webpage, '.lister-item-content'), '.metascore')
  2. metascore_data <- html_text(metascore_data_html)
  3. length(metascore_data)
Making a Data Frame

等所有数据都爬取完毕,就可以将其组合成 data frame 用于后续的分析了。

  1. movies <- data.frame(
  2. rank = rank_data,
  3. title = title_data,
  4. description = description_data,
  5. runtime = runtime_data,
  6. genre = genre_data,
  7. rating = rating_data,
  8. metascorre = metascore_data,
  9. votes = votes_data,
  10. gross = gross_data
  11. )
Exporting CSV File

如果不想马上开始分析工作,还可以存为 csv 文件以后用。

  1. write.csv(movies, file = file.choose(new = TRUE), row.names = FALSE)

搞定爬虫后,现在网络上已经有很多数据资源等我们用咯。

Notes

rvest 包还有其他有用的函数可以发掘一下的:

1) html_tag(): 提取DOM 的 tag name
2) html_attr(): 提取DOM 的 一个属性
3) html_attrs(): 提取DOM 的 所有属性
4) guess_encoding() and repair_encoding(): 检测编码和修复编码 (爬取中文网页的时候会用的到的~)
5) jump_to(), follow_link(), back(), forward(): 爬取多页面网页的时候或许会用到

Sample Code

download here

原文链接:http://www.cnblogs.com/yukiwu/p/10972342.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号