R自动数据收集第一章概述——《List of World Heritage in Danger》
library(stringr)library(XML)library(maps)heritage_parsed <- htmlParse("http://en.wikipedia.org/wiki/List_of_World_Heritage_in_Danger",encoding = "UTF-8")
出现错误
Error: failed to load external entity "
page 2
Credit: Suryapratim Sarkar (2015-06-25)
Wikipedia changed its server communication from HTTP to HTTPS. As a result, the following lines on page 2 return an error:(的确,如果你直接粘贴原http协议的地址,浏览器的地址栏会自动帮你转成https)
heritage_parsed <- htmlParse("http://en.wikipedia.org/wiki/List_of_World_Heritage_in_Danger",
encoding = "UTF-8")
## Error: failed to load external entity "http://en.wikipedia.org/wiki/List_of_World_Heritage_in_Danger"
There are at least two solutions to the problem:
Use
getURL()and specify the location of CA signatures (see Section 9.1.7 of our book).Use Hadley Wickham’s
rvestpackage, which came out after our book was published. It facilitates scraping with R considerably, in particular in such scenarios(情形、脚本). In this specific example, use the following code instead:
library(rvest) # the new package, version 0.3.0
heritage_parsed <- read_html("http://en.wikipedia.org/wiki/List_of_World_Heritage_in_Danger", encoding = "UTF-8") # read_html() from the rvest package is the new htmlParse() from the XML package
tables <- html_table(heritage_parsed, fill = TRUE) # html_table() from the rvest package, which replaces readHTMLTable() from the XML package
From thereon, the rest of the chapter code should work. If you want to learn more about the rvest package, have a look here. We are planning to cover it extensively in the next edition of our book.
heritage_parsed <- read_html("http://en.wikipedia.org/wiki/List_of_World_Heritage_in_Danger", encoding = "UTF-8")# str(heritage_parsed)#我曾经尝试将heritage_parsed写到本地文件,但是失败了#无法将list通过cat()输入到本地,查阅了sof,但是还是没有解决
#从heritage_parsed中取出所有的表格tables <- html_table(heritage_parsed, fill = TRUE)#所以,我怎么知道这是第二个表格呢?danger_table <- tables[[2]]#查看表格的列名names(danger_table)# [1] "Name" "Image" "Location"# [4] "Criteria" "Area\nha (acre)" "Year (WHS)"# [7] "Endangered" "Reason" "Refs"
取出表格中的1, 3, 4, 6, 7列,其含义分别是名字、位置、标准分类、申遗成功时间、何时定为处于危险的时间
#感兴趣的只有表格中的1, 3, 4, 6, 7列#名字、位置、标准分类、申遗成功时间、何时定为处于危险的时间#覆盖掉原来的表格danger_table <- danger_table[, c(1, 3, 4, 6, 7)]#为了更方便,对列重命名,colnames(danger_table) <- c("name", "locn", "crit", "yins", "yend")#取几个遗产的名字查看下danger_table$name[1:3]
#str_detect是stringr包中的函数#用于在前一个参数中按照后一个参数的规则查找是否存在特定字符#返回值是逻辑值向量#对crit列按照自然和人文遗产重新编码#Natural景观遗产编码为nat,否则为culture,即culdanger_table$crit <- ifelse(str_detect(danger_table$crit, "Natural") ==TRUE,"nat","cult")
fruit <- c("apple", "banana", "pear", "pinapple")str_detect(fruit, "a")# [1] TRUE TRUE TRUE TRUE
# 将申遗成功时间转为数值类型danger_table$yins <- as.numeric(danger_table$yins)#按照正则表达式取出(我们只取出濒危时间,去掉横杠,并转化为数值型)yend_clean <- unlist(str_extract_all(danger_table$yend, "[[:digit:]]4$"))
yend_clean1 <- unlist(str_extract_all(danger_table$yend, "\\d{4}-"))yend_clean <- unlist(str_extract_all(yend_clean1, "\\d{4}"))length(yend_clean)length(danger_table$yend)danger_table$yend <- as.numeric(yend_clean)danger_table$yend[1:3]#[1] 2001 1992 2013
shopping_list <- c("apples x4", "bag of flour", "bag of sugar", "milk x2")str_extract(shopping_list, "\\d")# [1] "4" NA NA "2"str_extract(shopping_list, "[a-z]+")# [1] "apples" "bag" "bag" "milk"str_extract_all(shopping_list, "[a-z]+")# [[1]]# [1] "apples" "x"## [[2]]# [1] "bag" "of" "flour"## [[3]]# [1] "bag" "of" "sugar"## [[4]]# [1] "milk" "x"
danger_table$locn[c(1, 3, 5)][1] "EgyAbusir, Egypt30°50′30″N 29°39′50″E / 30.84167°N 29.66389°E / 30.84167; 29.66389 (Abu Mena)"[2] "Syria !Aleppo Governorate, Syria36°14′0″N 37°10′0″E / 36.23333°N 37.16667°E / 36.23333; 37.16667 (Ancient City of Aleppo)"[3] "Syria !Damascus Governorate, Syria33°30′41″N 36°18′23″E / 33.51139°N 36.30639°E / 33.51139; 36.30639 (Ancient City of Damascus)"


reg_y <- "[/][ -]*[[:digit:]]*[.]*[[:digit:]]*[;]"reg_x <- "[;][ -]*[[:digit:]]*[.]*[[:digit:]]*"
第一段:以反斜杠/开头,或者以空格和横杠-开头,
y_coords <- str_extract(danger_table$locn, reg_y)y_coords[1] "/ 30.84167;" "/ 18.283;" "/ 36.23333;"[4] "/ 32.51806;" "/ 33.51139;" "/ 36.33417;"[7] "/ 32.82500;" "/ 32.63833;" "/ 32.80528;"[10] "/ 35.45667;" "/ 42.26222;" "/ 17.317;"[13] "/ -8.11111;" "/ 31.70444;" "/ 9.167;"[16] "/ 11.417;" "/ 34.78167;" "/ 34.83194;"[19] "/ -11.68306;" "/ 25.317;" "/ 9.55389;"[22] "/ 4.000;" "/ 35.58806000;" "/ 39.05000;"[25] "/ 14.200;" "/ -20.20833;" "/ -2.500;"[28] "/ 53.40667;" "/ 9.000;" "/ 34.39667;"[31] "/ 42.66111;" "/ 7.600;" "/ 6.83972;"[34] "/ 13.000;" "/ 2.000;" "/ 31.77667;"[37] "/ 15.35556;" "/ 30.13333;" "/ 13.90639;"[40] "/ 15.92694000;" "/ -14.467;" "/ 15.74444;"[43] "/ 24.83333;" "/ -8.95778;" "/ -2.000;"[46] "/ 34.200;" "/ 13.183;" "/ 34.55417;"[49] "/ 16.77333;" "/ 16.2893333;" "/ 0.32917;"[52] "/ -2.500;" "/ 0.917;" "/ 31.71972;"
负纬度表示位于南半球(S)的位置而负经度表示西半球(W)的位置.
y_coords <- as.numeric(str_sub(y_coords, 3, -2))danger_table$y_coords <- y_coords
x_coords <- str_extract(danger_table$locn, reg_x)x_coords <- as.numeric(str_sub(x_coords, 3, -1))danger_table$x_coords <- x_coordsdanger_table$locn <- NULLnames(danger_table)# [1] "name" "crit" "yins" "yend" "y_coords"# [6] "x_coords"round(danger_table$y_coords, 2)[1:3]round(danger_table$x_coords, 2)[1:3]
round(danger_table$y_coords, 2)的作用是取小数点后两位,这里只是起到了查看的作用,并没有影响表中的数据
#查看维度dim(danger_table)head(danger_table)
#对人文和自然景观设置不同的点的形状pch <- ifelse(danger_table$crit == "nat", 10, 11)#对分属人文和自然景观的遗产设置不同的颜色参数cols <- ifelse(danger_table$crit == "nat", 'deepskyblue4', 'brown1')#嗯,输入到本地文件,免得RStudio的绘图窗口太小#注意宽高的调整png("d:\\map.png",width = 1300, height = 720)map("world", col = "maroon",lwd = 0.5,mar = c(0.1, 0.1, 0.1, 0.1),bg='seashell')points(danger_table$x_coords,danger_table$y_coords,pch = pch,col=cols,cex=1.2,lwd=1.3)#添加图例#leg.txt中设置的是图例文本leg.txt <- c("Natural", "Cultural")#当取x=0,y=0的时候是位于图正中央#text.col设置图例文字颜色#cex设置图例区域大小legend("topright", leg.txt, horiz = TRUE,pch=c(10, 11),col = c('deepskyblue4', 'brown1'),text.col=c('deepskyblue4', 'brown1'),cex =2.3)#box是边框,其样式lty的参数有点意思哈box(lty='1373', lwd =5,col = 'red')#关闭输出设备dev.off()
table(danger_table$crit)## cult nat# 37 17
library(RColorBrewer)cols1=brewer.pal(8,'Set3')par(bg='lightcyan')hist(danger_table$yend,freq = TRUE,xlab = "Year when site was put on the list of endangered sites",col=cols1,border = cols1,main = "")
#奇怪的样式
cols2=brewer.pal(8,'Paired')par(bg='lightcyan')hist(danger_table$yend,freq = TRUE,density = TRUE,xlab = "Year when site was put on the list of endangered sites",col=cols2,main = "")
唉呀,我岂不是可以用来抓取淘宝的商品评论,进行评价分析?
R自动数据收集第一章概述——《List of World Heritage in Danger》的更多相关文章
- R自动数据收集第二章HTML笔记1(主要关于handler处理器函数和帮助文档所有示例)
本文知识点: 1潜在畸形页面使用htmlTreeParse函数 2startElement的用法 3闭包 4handler函数的命令和函数体主要写法 5节点的丢弃,取出,取出标签名称.属性.属 ...
- R自动数据收集第二章HTML笔记2(主要关于htmlTreeParse函数)
包含以下几个小的知识点 1htmlTreeParse函数源码和一些参数 2hander的写法 3关于missing函数 4关于if-else语句中else语句的花括号问题 5关于checkHandle ...
- 【译文连载】 理解Istio服务网格(第一章 概述)
书籍英文版下载链接为 https://developers.redhat.com/books/introducing-istio-service-mesh-microservices/,作者 Burr ...
- TCP/IP详解 卷1 第一章概述
第一章概述 1.2 分层 网络编程通常分不同层次进行开发,每一层负责不同的通信功能. 一个协议族比如TCP/IP,通常是一组不同层次上多个协议的组合.一般可以认为是是四层协议系统: 链路层:有时也称作 ...
- perl5 第一章 概述
第一章 概述 by flamephoenix 一.Perl是什么?二.Perl在哪里?三.运行四.注释 一.Perl是什么? Perl是Practical Extraction and Re ...
- 计算机网络课程优秀备考PPT之第一章概述(一)
为了记录自己从2016.9~2017.1的<计算机网络>助教生涯,也为了及时梳理和整写笔记! 以上,是<计算机网络>课程的第一章概述.
- CentOS6安装各种大数据软件 第一章:各个软件版本介绍
相关文章链接 CentOS6安装各种大数据软件 第一章:各个软件版本介绍 CentOS6安装各种大数据软件 第二章:Linux各个软件启动命令 CentOS6安装各种大数据软件 第三章:Linux基础 ...
- Camel In Action 阅读笔记 第一部分概述 + 第一章概述 认识Camel
第一部分: 最开始的一小步 Apache Camel 是一个开源集成框架,其目的是让系统集成变得更加简便,在本书的第一章中,我们会为您介绍它并向您展示它是如何在大型企业应用中做好集成工作.您也会了解到 ...
- htt p第一章概述
http的概述 1 web客户端与服务器是如何通信 2 web资源来自的何方 3 web事务是怎样的工作的 4 http通信所使用的报文结构 5 底层tcp的传输的结构 6不同的http协议体 什么是 ...
随机推荐
- 如何在github上下载单个文件夹?
作者:ce ge链接:https://www.zhihu.com/question/25369412/answer/96174755来源:知乎著作权归作者所有,转载请联系作者获得授权. Git1.7. ...
- 【GSM】GTM900C的应用——短信
虽说GSM已经很老旧,但其低廉的价格,非常适合一些需要小数据上网传输和短信等功能的应用场合. 不知道GSM能否像51单片机一样,在低端应用中长久不衰.GTM900C发送短信,支持两种模式,TXT和PD ...
- 如何快速清除ZBrush画布中多余图像
ZBrush是一款数字雕刻与绘画软件,它以强大的功能和直观的工作流程彻底改变了整个三维行业.它的简洁化.智能化和人性化的设计无不让众多用户所折服.刚接触它的用户可能会因为找不到相关命令或不熟悉而觉得它 ...
- excel基本
1,换行:control+option(alt)+enter
- [No00008F]PLSQL自动登录,记住用户名密码&日常使用技巧
配置启动时的登录用户名和密码 这是个有争议的功能,因为记住密码会给带来数据安全的问题. 但假如是开发用的库,密码甚至可以和用户名相同,每次输入密码实在没什么意义,可以考虑让PLSQL Develope ...
- github如何删除一个(repository)仓库
GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub.作为开源代码库以及版本控制系统,Github拥有140多万开发者用户.随着越 ...
- 通过form表单的形式下载文件。
在项目中遇到问题,要求动态拼接uri下载文件.但是由于项目的安全拦截导致window.location.href 和 window.open等新建窗口的方法都不行. 无意间百度到了通过form表单来下 ...
- codevs 2879 堆的判断
codevs 2879 堆的判断 http://codevs.cn/problem/2879/ 题目描述 Description 堆是一种常用的数据结构.二叉堆是一个特殊的二叉树,他的父亲节点比两个儿 ...
- [LeetCode] Search in Rotated Sorted Array II 在旋转有序数组中搜索之二
Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...
- .NET WebAPI 实现图片上传(包括附带参数上传图片)
博主的项目,客户端是APP,考虑到以后也可能会应用到微信端.网站等,图片上传方法就需要兼容多端,并且以目前的设计,不允许非登录用户上传图片,就得在上传时解决附带参数上传图片的问题. 先来看看后台方法( ...