本文較功利,旨在快速解決問(wèn)題
參考書(shū)籍:《基于R語(yǔ)言的自動(dòng)數(shù)據(jù)收集》
人大經(jīng)濟(jì)論壇下載,中/英文
相關(guān)的庫(kù)
XML、rvest、httr、Rselenium、rdom(神器)、 RCurl
輔助庫(kù):tidyverse
基本流程
- 首先嘗試靜態(tài)網(wǎng)頁(yè)抓取(rvest)
- 如果搞不定,那就是javascript搞的鬼,可以用rdom解決之
- 先爬一個(gè)網(wǎng)頁(yè),找出規(guī)律,再構(gòu)造通用架構(gòu)。注意爬蟲(chóng)并不快...
靜態(tài)網(wǎng)頁(yè)
url <- "http://jnwater.jinan.gov.cn/col/col22802/index.html?
Fuid=56254&pageNum=2"
#這個(gè)網(wǎng)頁(yè)有濟(jì)南的泉水?dāng)?shù)據(jù),最后一個(gè)參數(shù)是js生成的換頁(yè)參數(shù)
webpage <- read_html(url, encoding="utf-8")
#讀取頁(yè)面內(nèi)容,編碼這里不一定,視實(shí)際情況決定
data_html <- html_nodes(webpage, '.bt-neirong')
#在眾多節(jié)點(diǎn)中返回我們要的那個(gè)(些)
x <- html_text(data_html)
#讓它說(shuō)人話(huà)
接下來(lái)我們可以用正則表達(dá)式愉快地提取內(nèi)容了
Tips
這里介紹兩個(gè)常用的技巧
- 用谷歌瀏覽器,按F12進(jìn)入開(kāi)發(fā)者模式閱讀源碼。
- 安裝SelectorGadget,可以實(shí)現(xiàn)指哪打哪。(有時(shí)候也不好用)
這里是為了找到html_nodes(webpage, '.bt-neirong')那個(gè)第二個(gè)參數(shù)。
問(wèn)題
經(jīng)過(guò)篩選,我們拿到了一頁(yè)的數(shù)據(jù)。然而,問(wèn)題并沒(méi)有結(jié)束。事實(shí)上,我們拿到的是第一頁(yè)的數(shù)據(jù),即http://jnwater.jinan.gov.cn/col/col22802/index.html?Fuid=56254&pageNum=1的。不管我們?cè)趺锤淖儏?shù),我們的爬蟲(chóng)能看見(jiàn)的也就只有這一頁(yè)。但是瀏覽器卻能看到,這是為什么呢?
原因在于這個(gè)參數(shù)是javascript生成的,我們直接爬多半搞不定。
動(dòng)態(tài)網(wǎng)頁(yè)
接上面的問(wèn)題,我千辛萬(wàn)苦終于發(fā)現(xiàn)了一個(gè)庫(kù):rdom
這個(gè)庫(kù)很厲害,基本包打天下。但是有一點(diǎn)需要注意,這個(gè)庫(kù)需要安裝無(wú)頭瀏覽器phantomjs無(wú)頭瀏覽器。我們下載瀏覽器,解壓后是個(gè)文件夾,在\bin里有個(gè)exe文件,就是它了。這時(shí)我們需要配置環(huán)境變量,i.e. 在path里面添加一個(gè)路徑(到\bin就可以)。
環(huán)境變量簡(jiǎn)介
至于什么是環(huán)境變量,也就是一個(gè)程序快速啟動(dòng)的索引。我們不愿意在打開(kāi)任何程序時(shí)都先進(jìn)入它的工作路徑,但是一般來(lái)說(shuō)你不這樣就打不開(kāi)。于是我們把路徑添加到環(huán)境變量里去,在執(zhí)行命令時(shí)電腦會(huì)搜索當(dāng)前工作環(huán)境以及系統(tǒng)變量指示的路徑,這就可以高枕無(wú)憂(yōu)了。
rdom
一切準(zhǔn)備就緒后,安裝rdom。只能從github上安裝。
stopifnot(Sys.which("phantomjs") != "")
# 檢測(cè)系統(tǒng)路徑中是否含有phantomjs,若未下載,或已下載但未添加系統(tǒng)路徑都會(huì)導(dǎo)致報(bào)錯(cuò)。什么也沒(méi)發(fā)生就成功了。
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)
#后面那個(gè)函數(shù)是XML里面的
y <- x[[3]] %>% .[2:16, 1:3]
M[[j]] <- y
}
程序跑的挺慢的,大約一個(gè)半小時(shí)才完成?,F(xiàn)在列表中已經(jīng)存好了泉水水位數(shù)據(jù)。
基本上這個(gè)套路可以解決絕大多數(shù)問(wèn)題了,但是這畢竟是個(gè)功利的玩法。想打好內(nèi)力還是得看書(shū),學(xué)TCP/IP這里。