本文较功利,旨在快速解决问题
参考书籍:《基于R语言的自动数据收集》
人大经济论坛下载,中/英文
相关的库
XML、rvest、httr、Rselenium、rdom(神器)、 RCurl
辅助库:tidyverse
基本流程
- 首先尝试静态网页抓取(rvest)
- 如果搞不定,那就是javascript搞的鬼,可以用rdom解决之
- 先爬一个网页,找出规律,再构造通用架构。注意爬虫并不快...
静态网页
url <- "http://jnwater.jinan.gov.cn/col/col22802/index.html?
Fuid=56254&pageNum=2"
#这个网页有济南的泉水数据,最后一个参数是js生成的换页参数
webpage <- read_html(url, encoding="utf-8")
#读取页面内容,编码这里不一定,视实际情况决定
data_html <- html_nodes(webpage, '.bt-neirong')
#在众多节点中返回我们要的那个(些)
x <- html_text(data_html)
#让它说人话
接下来我们可以用正则表达式愉快地提取内容了
Tips
这里介绍两个常用的技巧
- 用谷歌浏览器,按F12进入开发者模式阅读源码。
- 安装SelectorGadget,可以实现指哪打哪。(有时候也不好用)
这里是为了找到html_nodes(webpage, '.bt-neirong')那个第二个参数。
问题
经过筛选,我们拿到了一页的数据。然而,问题并没有结束。事实上,我们拿到的是第一页的数据,即http://jnwater.jinan.gov.cn/col/col22802/index.html?Fuid=56254&pageNum=1的。不管我们怎么改变参数,我们的爬虫能看见的也就只有这一页。但是浏览器却能看到,这是为什么呢?
原因在于这个参数是javascript生成的,我们直接爬多半搞不定。
动态网页
接上面的问题,我千辛万苦终于发现了一个库:rdom
这个库很厉害,基本包打天下。但是有一点需要注意,这个库需要安装无头浏览器phantomjs无头浏览器。我们下载浏览器,解压后是个文件夹,在\bin里有个exe文件,就是它了。这时我们需要配置环境变量,i.e. 在path里面添加一个路径(到\bin就可以)。
环境变量简介
至于什么是环境变量,也就是一个程序快速启动的索引。我们不愿意在打开任何程序时都先进入它的工作路径,但是一般来说你不这样就打不开。于是我们把路径添加到环境变量里去,在执行命令时电脑会搜索当前工作环境以及系统变量指示的路径,这就可以高枕无忧了。
rdom
一切准备就绪后,安装rdom。只能从github上安装。
stopifnot(Sys.which("phantomjs") != "")
# 检测系统路径中是否含有phantomjs,若未下载,或已下载但未添加系统路径都会导致报错。什么也没发生就成功了。
devtools::install_github("cpsievert/rdom")
# 安装rdom
library(rdom)
library(XML)
library(tidyverse)
M <- list()
for (j in 1:164) {
url <- 'http://jnwater.jinan.gov.cn/col/col22802/index.html?uid=56254&pageNum='
url <- paste(url, j, sep = '')
x <- rdom(url) %>% readHTMLTable(header = T)
#后面那个函数是XML里面的
y <- x[[3]] %>% .[2:16, 1:3]
M[[j]] <- y
}
程序跑的挺慢的,大约一个半小时才完成。现在列表中已经存好了泉水水位数据。
基本上这个套路可以解决绝大多数问题了,但是这毕竟是个功利的玩法。想打好内力还是得看书,学TCP/IP这里。
网友评论