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