Re: [問題] 相關爬蟲問題

作者: celestialgod (天)   2017-06-07 20:12:26
建議不要用XML,其實你很多程式是可以省下來不用的
用foreach,日後要改平行也可以比較簡單更動
好讀版:https://pastebin.com/xhCkV0Cd
library(data.table)
library(stringi)
library(lubridate)
library(foreach)
library(httr)
library(xml2)
library(rvest)
library(pipeR)
# windows才需要先把locale改成C,並用stringi::stri_conv轉成big5
backupLocale <- Sys.getlocale("LC_COLLATE")
Sys.setlocale("LC_ALL", 'C')
timeVec <- seq(ymd("2003/01/01"), ymd("2003/01/11"), 1)
reservoirUrl <-
"http://fhy.wra.gov.tw/ReservoirPage_2011/StorageCapacity.aspx"
tmp <- foreach(time = timeVec, .final = rbindlist) %do% {
VIEWSTATE <- GET(reservoirUrl) %>>% content %>>%
xml_find_all("//input[@name='__VIEWSTATE']") %>>% xml_attr("value")
postBody <- c(list("所有水庫"),
lapply(c(year, month, day), function(f) f(time)),
list(VIEWSTATE)) %>>%
`names<-`(c(paste0("ctl00$cphMain$",
c("cboSearch", paste0("ucDate$cbo",
c("Year", "Month","Day")))),
"__VIEWSTATE"))
outTbl <- POST(reservoirUrl, body = postBody) %>>% content %>>%
xml_find_first("//table[@id='ctl00_cphMain_gvList']") %>>%
html_table(fill = TRUE) %>>% setDT %>>%
`[`(j = lapply(.SD, stri_conv, from = "UTF-8", to = "Big5"))
setnames(outTbl, stri_conv(names(outTbl), "UTF-8", "Big5"))
fwrite(outTbl, sprintf("result/%s.csv", as.character(time)))
return(NULL)
}
Sys.setlocale(locale = backupLocale)
fwrite(rbindlist(lapply(list.files("result", "\\.csv$"), fread)), "merge.csv")
※ 引述《jack155861 (蕭)》之銘言:
: 來分享一下我的程式碼
: library(magrittr)
: library(httr)
: library(rvest)
: library(XML)
: library(dplyr)
: library(stringr)
: setwd("J:/聖哲/資料運算/spider")
: data<-read.csv("test.csv", header=T, sep=",")
: #http://imgur.com/a/vpizi 我自己先用EXCEL創造出要載的年月日 這用R也可以做啦
: #只是這個EXCEL之後還有其他功能
: for (a in 1:length(data[,1]))
: {
: url="http://fhy.wra.gov.tw/ReservoirPage_2011/StorageCapacity.aspx"
: txt=GET(url)
: viewstate = txt %>% read_html() %>% html_nodes(., css="#__VIEWSTATE") %>%
: html_attr("value")
: #讀取viewstate
: cboSearch="所有水庫"
: cboYear=data[a,2]
: cboMonth=data[a,3]
: cboDay=data[a,4]
: #我的參數
: dados <- list( 'ctl00$cphMain$cboSearch'=cboSearch,
: 'ctl00$cphMain$ucDate$cboYear'=cboYear,
: 'ctl00$cphMain$ucDate$cboMonth'=cboMonth,
: 'ctl00$cphMain$ucDate$cboDay'=cboDay,
: '__VIEWSTATE'=viewstate)
: #此網頁有很多$ list裡面不能直接打$ 要有單引號就沒這問題
: r <- POST(url, body=dados, cookies=unlist(txt$cookies),encode = "form")
: res_text <- content(r, "text", encoding = "UTF-8") %>%
: `Encoding<-`("UTF-8") # Windows encodind issue
: res_text
: #看看資料有無出來
: htmlParse(res_text,encoding = "utf8")
: tables <- readHTMLTable(htmlParse(res_text,encoding =
: "utf8"),stringsAsFactors=FALSE)
: View(tables[[1]])
: #看看TABLE出來的資料有無正確 其實有些有跳欄位問題 但資料都有
: name=tables[[1]][-1,1]
: water_day=tables[[1]][-1,2]
: time_day=paste(cboYear,"-",cboMonth,"-",cboDay,sep = "")
: rain=tables[[1]][-1,4]
: input=tables[[1]][-1,5]
: output=tables[[1]][-1,6]
: difference=tables[[1]][-1,7]
: time_now=tables[[1]][-1,8]
: height_now=tables[[1]][-1,9]
: water_now=tables[[1]][-1,10]
: water_percent_now=tables[[1]][-1,11]
: result=cbind(name,water_day,time_day,rain,input,output,difference,time_now,height_now,water_now,water_percent_now)
: colnames(result) <- c("水庫名稱","水庫基本數據_有效容量",
: "每日蓄水統計_統計時間","每日蓄水統計_集水區降雨量",
: "每日蓄水統計_進水量","每日蓄水統計_出水量",
: "每日蓄水統計_與昨日水位差","即時水情資料_水情時間",
: "即時水情資料_水位","即時水情資料_有效蓄水量",
: "即時水情資料_蓄水量百分比")
: #從table存取我要的資訊
: write.csv(result, paste("./result/",time_day,".CSV",sep = ""))
: #每一天一個CSV檔案 之後可能需要 故先不做合併
: }
: a = list.files("result")
: dir = paste("./result/",a,sep="")
: n = length(dir)
: merge.data = read.csv(file = dir[1],header=T,sep=",")[-54,-1]
: for (i in 2:n){
: new.data = read.csv(file = dir[i], header=T, sep=",")[-54,-1]
: merge.data = rbind(merge.data,new.data)
: }
: write.csv(merge.data,file = "./merge.csv",row.names=F)
: #所有CSV合併成為一個檔案
: ※ 引述《jack155861 (蕭)》之銘言:
: : 各位好
: : 謝謝C大的說明 然後我又在網路上看到一個教學 他這個教學跟我網站的形式有點類似
: : 網址如下:http://leoluyi.logdown.com/posts/406397-crawler-mops-2
: : 我把我要爬蟲的網站 看了他的程式碼 他是屬於form data 如下圖
: : http://imgur.com/a/Vy7mw
: : 依照上面教學網址是要把form data的資料都放到R的函數理頭
: : res <- POST(
: : "http://fhy.wra.gov.tw/ReservoirPage_2011/StorageCapacity.aspx",
: : body = "XXXXX",
: : encode = "form")
: : 但是怎樣跑都跑不出來 跑的都是最新(2017/6/4)的資料
: : 若我body只放以下這些有影響的參數也是如此
: : ctl00$cphMain$cboSearch:防汛重點水庫
: : ctl00$cphMain$ucDate$cboYear:2017
: : ctl00$cphMain$ucDate$cboMonth:6
: : ctl00$cphMain$ucDate$cboDay:2
: : 請問各位大大 有哪裡用錯了嗎?
作者: Wush978 (拒看低質媒體)   2017-06-08 00:22:00
最近我用xml2編輯html文件,結果會爆炸所以最後重回XML的懷抱...
作者: jack155861 (蕭)   2017-06-08 02:19:00
回去參拜~"~
作者: Edster (Edster)   2017-06-09 18:45:00
大大, 好像都只有今天的...postbody name改成 c("cboYear", "cboMonth", "cboDay")我來試試搞成小時的(已經手動抓了 -.-)..小時的在這邊, 前面都一樣 /Statistics.aspx 縮不了網址搞了兩個多小時, table內有無效的超連結, 試不成功.小時尺度原網頁 http://bit.ly/2r3skUr搞定 https://pastebin.com/2t842ppp各種不熟悉. 各種以為可以結果失敗

Links booklink

Contact Us: admin [ a t ] ucptt.com