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

这次用 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


我期望获取的数据包括:

  1. Rank: 排名
  2. Title:电影名称
  3. Runtime:电影时长
  4. Genre:电影类型
  5. Rating:观众评分
  6. Metascore:媒体评分
  7. Description:电影简介
  8. Votes:观众投票支持的票数
  9. 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,分享一个小方法:

  1. 用浏览器(以 Chrome 为例)打开那个网页,然后按 F12 打开开发者工具
  2. 点击开发者工具左上角的箭头去选择那个需要爬取的数据
  3. 对应的那行代码就会在右侧的开发者工具被选中
  4. 对着 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_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。

粗暴地说,上代码:

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 包还有其他有用的函数可以发掘一下的:

  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

Web Scraping with R: How to Fill Missing Value (爬虫:如何处理缺失值)的更多相关文章

  1. 阅读OReilly.Web.Scraping.with.Python.2015.6笔记---Crawl

    阅读OReilly.Web.Scraping.with.Python.2015.6笔记---Crawl 1.函数调用它自身,这样就形成了一个循环,一环套一环: from urllib.request ...

  2. 首部讲Python爬虫电子书 Web Scraping with Python

    首部python爬虫的电子书2015.6pdf<web scraping with python> http://pan.baidu.com/s/1jGL625g 可直接下载 waterm ...

  3. Web Scraping with Python读书笔记及思考

    Web Scraping with Python读书笔记 标签(空格分隔): web scraping ,python 做数据抓取一定一定要明确:抓取\解析数据不是目的,目的是对数据的利用 一般的数据 ...

  4. [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 ...

  5. <Web Scraping with Python>:Chapter 1 & 2

    <Web Scraping with Python> Chapter 1 & 2: Your First Web Scraper & Advanced HTML Parsi ...

  6. 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)

  7. 《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 ...

  8. Web Scraping with Python

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  9. 阅读OReilly.Web.Scraping.with.Python.2015.6笔记---找出网页中所有的href

    阅读OReilly.Web.Scraping.with.Python.2015.6笔记---找出网页中所有的href 1.查找以<a>开头的所有文本,然后判断href是否在<a> ...

随机推荐

  1. Python基础之 一 字符编码及转换

    python2 / python3编码转换 先上图一张: 说明:python编码转换的流程是 先进行decode解码,然后进行encode编码 解释: u'你好'  -->带u表示为unicod ...

  2. SGU 104 Little shop of flowers【DP】

    浪(吃)了一天,水道题冷静冷静.... 题目链接: http://acm.sgu.ru/problem.php?contest=0&problem=104 题意: 给定每朵花放在每个花盆的值, ...

  3. Delphi控件大全

    首先来大体上为控件分一下类,以方便我们后面的讨论.   但因为控件的种类太多,所以就粗略的分为如下几个类别∶   ---界面风格类   ---Shell外观类   ---Editor类   ---Gr ...

  4. 【Java源码】集合类-队列Queue

    一.描述 队列Queue这种数据结构,通常指先进先出(FIFO)这种容器.可以模拟生活中依次排队这种场景. 下面是集合体系继承树: 二.Queue Queue和List一样都是Collection的子 ...

  5. [bzoj4006][JLOI2015]管道连接_斯坦纳树_状压dp

    管道连接 bzoj-4006 JLOI-2015 题目大意:给定一张$n$个节点$m$条边的带边权无向图.并且给定$p$个重要节点,每个重要节点都有一个颜色.求一个边权和最小的边集使得颜色相同的重要节 ...

  6. [Bzoj1034][ZJOJ2008]泡泡堂BNB(贪心)

    1034: [ZJOI2008]泡泡堂BNB Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3482  Solved: 1776[Submit][St ...

  7. Java子类重写父类方法注意问题收集(转)

    子类不能重写父类的静态方法,私有方法.即使你看到子类中存在貌似是重写的父类的静态方法或者私有方法,编译是没有问题的,但那其实是你重新又定义的方法,不是重写.具体有关重写父类方法的规则如下: 重写规则之 ...

  8. Spring的AOP AspectJ切入点语法详解(转)

    一.Spring AOP支持的AspectJ切入点指示符 切入点指示符用来指示切入点表达式目的,在Spring AOP中目前只有执行方法这一个连接点,Spring AOP支持的AspectJ切入点指示 ...

  9. win7 休眠功能的开启与关闭

    1. 打开控制面板得下面目录,编辑计划设置

  10. Maven创建项目时出现Generating project in Interactive mode就一直卡住的解决方案

    使用maven命令在创建项目的时候出现 Generating project in Interactive mode 然后就一直卡住 网上搜做了很多解决方案 有说各种方案的,最后找到了一种.实验成功 ...