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

作者: jack155861 (蕭)   2017-06-07 08:49:36
來分享一下我的程式碼
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 (蕭)》之銘言:
: ※ 引述《jack155861 (蕭)》之銘言:
: : [問題類型]:
: : 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
: : [軟體熟悉度]:
: : 使用者(已經有用R 做過不少作品)
: : [問題敘述]:
: : 之前爬蟲都是用html網頁型態,最近遇到一個是需要先點選選單才能查詢資料的ASP網頁,
: : 如下
: : http://fhy.wra.gov.tw/ReservoirPage_2011/StorageCapacity.aspx
: : 假設我要載:水庫>2017/6/4 像這樣的資料時,他的網址並不會跟著變動
: : 要使用怎樣的語法會比較恰當
: : 請各位指點一下~"~
: 各位好
: 謝謝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
: 請問各位大大 有哪裡用錯了嗎?
作者: jack155861 (蕭)   2017-06-07 08:53:00
如果有更好的寫法 也可以提出阿補充一點為何需要viewstate 因為每一天的viewstate不Y同,而其他的都相同 所有我就沒有放進去了

Links booklink

Contact Us: admin [ a t ] ucptt.com