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