Re: [问题] 抓取气象局网页资料

楼主: celestialgod (天)   2016-05-02 14:29:49
※ 引述《corel (可罗)》之铭言:
:
: ctrl + y 可以删除一整行,请将不需要的内容删除
: 文章分类提示:
: - 问题: 当你想要问问题时,请使用这个类别
:
: [问题类型]:
:
: 程式咨询(我想用R 做某件事情,但是我不知道要怎么用R 写出来)
:
: [软件熟悉度]:
: 请把以下不需要的部份删除
: 入门(写过其他程式,只是对语法不熟悉)
: [问题叙述]:
: 想撷取 http://www.cwb.gov.tw/V7/climate/monthlyData/mD.htm
: 天气资料,但由于天气的资料会依网页上所选取的下拉式选单的值而有所变化
: 想请问各位先进,要如何让R自动会带值选取对应的资料?
: 例如: 2013年3月阿里山的平均温度为9.9度
: 2013年4月阿里山的平均温度为11.3度
: 谢谢
: [环境叙述]:
:
: 请提供 sessionInfo() 的输出结果,
: 里面含有所有你使用的作业系统、R 的版本和套件版本资讯,
: 让版友更容易找出错误
:
: R version 3.2.4 Revised (2016-03-16 r70336)
: Platform: x86_64-w64-mingw32/x64 (64-bit)
: Running under: Windows 7 x64 (build 7601) Service Pack 1
: locale:
: [1] LC_COLLATE=Chinese (Traditional)_Taiwan.950 LC_CTYPE=Chinese
: (Traditional)_Taiwan.950 LC_MONETARY=Chinese (Traditional)_Taiwan.950
: [4] LC_NUMERIC=C LC_TIME=Chinese
: (Traditional)_Taiwan.950
: attached base packages:
: [1] stats graphics grDevices utils datasets methods base
: loaded via a namespace (and not attached):
: [1] httr_1.1.0 magrittr_1.5 R6_2.1.1 tools_3.2.4
: RCurl_1.95-4.8 yaml_2.1.13 rappdirs_0.3 memoise_0.2.1 crayon_1.3.1
: swirl_2.3.1-2
: [11] stringi_1.0-1 stringr_1.0.0 digest_0.6.8 testthat_0.11.0
: bitops_1.0-6
好读版:http://pastebin.com/DYaWwFQ2
library(stringi)
library(stringr)
library(xml2)
library(pipeR)
library(purrr)
dat <-
read_html("http://www.cwb.gov.tw/V7/climate/monthlyData/Data/mD201512.htm",
"UTF-8") %>>%
xml_find_all('//table[@class="Form00"]/tr') %>>%
map(~ when(.,
identical(class(try({xml_find_one(., 'td')})), "try-error") ~
xml_find_all(., 'th'),
~ xml_find_all(., 'td')
) %>>% xml_text %>>%
when(
identical(.Platform$OS.type, "windows") ~ stri_conv(., "UTF-8", "BIG5"),
~ .
) %>>%
str_replace_all("\\s", "")
)
# 最上面的表头
dat[[1]]
# [1] "项目" "温度(℃)" "雨量"
# [4] "风速(公尺/秒)/风向(360°)/日期" "相对溼度(%)" "测站气压"
# [7] "降水日数>=0.1毫米" "日照时数"
# 下面的表格
do.call(rbind, dat[2:length(dat)])
## 印出部分
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] "测站" "平均" "最高/日期" "最低/日期" "(毫米)" "最大十分钟风"
# [2,] "阿里山" "9.8" "18.0/5" "2.8/29" "56.8" "4.8/340.0/26"
# [3,] "鞍部" "12.3" "23.7/22" "2.5/17" "245.7" "14.3/350.0/10"
# [4,] "板桥" "18.8" "29.9/22" "11.1/17" "80.6" "7.1/70.0/19"
# [5,] "成功" "21.1" "27.8/21" "14.5/17" "86.4" "9.8/30.0/31"
# [6,] "嘉义" "19.8" "30.2/24" "10.4/19" "31.4" "8.4/20.0/10"
不再建议使用XML做parse XML的工具,尽量转到xml2去
xml2至少有20%以上的效率提升,并且XML有一些memory leak的问题
函数说明:
stri_conv 转换编码 (这个函数是在stringi里面)
xml_find_all 用xpath找node (xml2)
read_html 读网页 (xml2)
when (purrr) 每一个是一个input是一个条件跟对应的output
例如:
row %>>% when(
identical(class(try({xml_find_one(., 'td')})), "try-error") ~
xml_find_all(., 'th')
~ xml_find_all(., 'td')
)
当identical(class(try({xml_find_one(., 'td')})), "try-error")成立就回传
xml_find_all(row, 'th')
没有条件的话就当成else,回传xml_find_all(row, 'td')
里面的.都是第一个input (就是%>>%左边传入的变量)
这个函数算是ifelse的强化版(ifelse不能输出block),可以直接在pipe里面用
不需要再存暂存变量中断pipe了 (我可能已经是pipe到走火入魔了)
map (purrr) 等同于lapply,是hadley跟rstudio另外用C++重写的
str_replace_all 等同于gsub,只是第三个input改到第一个,方便pipe
(这函数在stringr)
%>>% 大体上与%>%一样,但是有一些比较好用的新功能,此处没用上就不说明了
另外,作者也宣称不会像%>%有时候会有input模糊的问题 (自行GOOGLE)
作者: corel (可罗)   2016-05-02 14:45:00
感谢,R真是一个神奇的语言....

Links booklink

Contact Us: admin [ a t ] ucptt.com