Web Scraping with R: How to Fill Missing Value (爬虫:如何处理缺失值)
网络上有大量的信息与数据。我们可以利用爬虫技术来获取这些巨大的数据资源。
这次用 IMDb 网站的2018年100部最欢迎的电影 来练练手,顺便总结一下 R 爬虫的方法。
##### >> Preparation
感谢 Hadley Wickham 大大,我们有 rvest
包可以用。因此爬虫前先安装并加载 rvest
包。
#install package
install.package('rvest')
#loading library
library('rvest')
##### >> Downloading and parsing HTML file
指定网页地址并且使用 read_html()
函数将网页转为 XML 对象。
url <- 'https://www.imdb.com/search/title?count=100&release_date=2018-01-01,2018-12-31&view=advanced'
webpage <- read_html(url)
##### >> Extracting Nodes
我期望获取的数据包括:
- Rank: 排名
- Title:电影名称
- Runtime:电影时长
- Genre:电影类型
- Rating:观众评分
- Metascore:媒体评分
- Description:电影简介
- Votes:观众投票支持的票数
- Gross:电影票房
使用 html_nodes()
函数可以提取 XML 对象中的元素。其中该函数利用 CSS 选择器来匹配吻合的元素。
#Using CSS selectors to extract node
rank_data_html <- html_nodes(webpage, '.text-primary')
#Converting the node to text
rank_data <- html_text(rank_data_html)
#Converting text value to numeric value
rank_data <- as.numeric(rank_data)
因为需要利用 CSS 选择器, 所以这个部分或许需要一点 HTML/CSS 的基础知识。如果不熟悉 HTML/CSS,分享一个小方法:
- 用浏览器(以 Chrome 为例)打开那个网页,然后按 F12 打开开发者工具
- 点击开发者工具左上角的箭头去选择那个需要爬取的数据
- 对应的那行代码就会在右侧的开发者工具被选中
- 对着 CSS 选择器的文档查查就知道该怎么写了
接着用类似的 Script 提取其他元素的数据。
##### >> Handling Missing Values
爬取元素后,如果仔细检查每组元素的长度,就会发现其实某些元素是有缺失值的。比如说 Metascore
metascore_data_html <- html_nodes(webpage,'.metascore')
metascore_data <- html_text(metascore_data_html)
length(metascore_data)
怎么将网页中不存在的相应值用 NA 表示呢?
这里要了解一下 html_node
和 html_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。
粗暴地说,上代码:
metascore_data_html <- html_node(html_nodes(webpage, '.lister-item-content'), '.metascore')
metascore_data <- html_text(metascore_data_html)
length(metascore_data)
##### >> Making a Data Frame
等所有数据都爬取完毕,就可以将其组合成 data frame 用于后续的分析了。
movies <- data.frame(
rank = rank_data,
title = title_data,
description = description_data,
runtime = runtime_data,
genre = genre_data,
rating = rating_data,
metascorre = metascore_data,
votes = votes_data,
gross = gross_data
)
##### >> Exporting CSV File
如果不想马上开始分析工作,还可以存为 csv 文件以后用。
write.csv(movies, file = file.choose(new = TRUE), row.names = FALSE)
搞定爬虫后,现在网络上已经有很多数据资源等我们用咯。
##### >> Notes
rvest
包还有其他有用的函数可以发掘一下的:
html_tag()
: 提取DOM 的 tag namehtml_attr()
: 提取DOM 的 一个属性html_attrs()
: 提取DOM 的 所有属性guess_encoding()
andrepair_encoding()
: 检测编码和修复编码 (爬取中文网页的时候会用的到的~)jump_to()
,follow_link()
,back()
,forward()
: 爬取多页面网页的时候或许会用到
##### >> Sample Code
Web Scraping with R: How to Fill Missing Value (爬虫:如何处理缺失值)的更多相关文章
- 阅读OReilly.Web.Scraping.with.Python.2015.6笔记---Crawl
阅读OReilly.Web.Scraping.with.Python.2015.6笔记---Crawl 1.函数调用它自身,这样就形成了一个循环,一环套一环: from urllib.request ...
- 首部讲Python爬虫电子书 Web Scraping with Python
首部python爬虫的电子书2015.6pdf<web scraping with python> http://pan.baidu.com/s/1jGL625g 可直接下载 waterm ...
- Web Scraping with Python读书笔记及思考
Web Scraping with Python读书笔记 标签(空格分隔): web scraping ,python 做数据抓取一定一定要明确:抓取\解析数据不是目的,目的是对数据的利用 一般的数据 ...
- [Node.js] Web Scraping with Pagination and Advanced Selectors
When web scraping, you'll often want to get more than just one page of data. Xray supports paginatio ...
- <Web Scraping with Python>:Chapter 1 & 2
<Web Scraping with Python> Chapter 1 & 2: Your First Web Scraper & Advanced HTML Parsi ...
- Web scraping with Python (part II) « Jean, aka Sig(gg)
Web scraping with Python (part II) « Jean, aka Sig(gg) Web scraping with Python (part II)
- 《Web Scraping With Python》Chapter 2的学习笔记
You Don't Always Need a Hammer When Michelangelo was asked how he could sculpt a work of art as mast ...
- Web Scraping with Python
Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...
- 阅读OReilly.Web.Scraping.with.Python.2015.6笔记---找出网页中所有的href
阅读OReilly.Web.Scraping.with.Python.2015.6笔记---找出网页中所有的href 1.查找以<a>开头的所有文本,然后判断href是否在<a> ...
随机推荐
- 组队训练2 回放(转载至cxhscst2's blog)
2017/3/4 12:00-17:00 Solve 9 / 13 Penalty 717 练习赛过程回放: 开场5分中J题签到(cst) 12分钟时qw签到A 这时qw继续开写M,WA,检查代码. ...
- http_load分析(转)
http://www.cnblogs.com/xuning/p/3954057.html 一.前言 http_load是一款测试web服务器性能的开源工具,从下面的网址可以下载到最新版本的http_l ...
- 实现浏览器兼容的innerText
今天学习到了FF不支持innerText,而IE.chrome.Safari.opera均支持innerText. 为了各个浏览器能兼容innerText,必须对js做一次封装. 为啥能实现兼容呢?原 ...
- redis 实际应用中的缓存作用(转)
有人说互联网用户是用脚投票的,这句话其实也从侧面说明了,用户体验是多么的重要:这就要求在软件架构设计时,不但要注重可靠性.安全性.可扩展性以及可维护性等等的一些指标,更要注重用户的体验,用户体验分很多 ...
- 使用mysql-connector-java.jar连接MySql时出现:Error while retrieving metadata for procedure columns: java.sql.SQLException: Parameter/Column name pattern can not be NULL or empty.
错误如下: 程序实现的功能是调用一个存储过程,但是不认这个存储过程的参数. 原因是版本太高了,由于使用的是6.0.6版本的,改成5.1.38即可. POM配置如下: <!-- mysql-con ...
- ZXing 二维码解析生成工具类
原文:http://www.open-open.com/code/view/1455848023292 import com.google.zxing.*; import com.google.zxi ...
- C# DataGridView,右键单击RowHeader时显示右键菜单怎么做?
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) { ...
- 学习LaTex
MarkDown+Latex 本来想学习latex编辑公式的,在博客园内置的MarkDown编辑器已经支持Latex公式解析了,如下: $$x=\frac{-b\pm\sqrt{b^2-4ac}}{2 ...
- HadoopMapReduce运行机制
1.map方法读取一个文件的一行记录进行分析, 输入:LongWritable(当前读取的文件位置), Text(内容) 2.map将读取到的信息进行分类,输入Context (键值对) ;作为 ...
- 在linux命令行中编译和运行java文件
同时加载编译多个jar包和java文件 在个人平常使用或者当我们把代码部署到linux服务器上的时候,我们经常需要通过命令行编译和运行java文件,网上关于这个的方法大多是通过 javac -cp f ...