coderLMN / AutomatedDataCollectionWithR

《基于 R 语言的自动化数据采集技术》读者讨论区
28 stars 10 forks source link

《基于 R 语言的自动化数据采集技术》讨论区 #1

Open coderLMN opened 9 years ago

coderLMN commented 9 years ago

欢迎读者参与讨论,谢谢大家。

lgdxx commented 9 years ago

为了你,我专门来注册,很赞成你的观点,以后编程更加工具化,工具只是为了思想而存在的

songhp commented 9 years ago

好多年前看过R,想不到现在这么火了

yngcan commented 8 years ago

正在阅读您翻译的大作,此前断断续续读过一些英文版,但没有读很透,您这次贡献真不小。该书对R中国的作用是巨大的,尤其在数据方面,解释了很多新的东西。

coderLMN commented 8 years ago

@yngcan 谢谢你的鼓励。作为译者,没有什么能比读者反馈书有用更令我开心的了。

yngcan commented 8 years ago

由于书写的比较早,我最近发现原书的有些代码可能存在一些问题。

  1. 206页的地址无法访问。
  2. 213页天气预测的也变化啦,现在需要API-KEY了,所以代码可能需要调整;
  3. 187页的透明国际的网页,现在也改为https了,所以,代码可能也需要调整。 楼主如果能帮我们调整一下就万分感谢啦。
coderLMN commented 8 years ago

@yngcan

  1. 我手头还没有拿到样书,不知道206页的地址是什么,请给我一个链接看看;
  2. Yahoo 天气 API 现在需要 Oauth 认证,可以参考 “9.1.11 用 OAuth 进行身份验证(Authentication)”;
  3. https 的链接可以参考 “9.1.7 通过 HTTPS 进行的连接”。 因为我手头还正在赶另一本“Mastering Predictive Analytics with R”的翻译,如果这几个问题需要我给出代码的话,估计要五一之后才行。
yngcan commented 8 years ago

感谢,理解我自己也翻译过图书。没事,正如所言,其实书上该讲的地方已经说到了,需要自己调整一下就行。

,很期待您的又一本翻译力作呀。哈哈,很想第一时间读到呀。
coderLMN commented 8 years ago

谢谢理解。从翻译完到出版差不多八九个月时间,不少网页都改版了。根据原理调整代码也是一种练习 👍

coderLMN commented 8 years ago

刚拿到样书,你说的206页网址是不是:www.r-datacollection.com/materials/selenium/dbQuery.html ?我这里能打开,估计你可能把最后那个dbQuery.html里的Q变成小写q了。 @yngcan

sunkrock commented 8 years ago

您好,本书第13章半结构化数据获取,数据源从ftp改变成了http协议,请问如何访问文件列表?(现数据源网址http://www.wcc.nrcs.usda.gov/ftpref/data/climate/table/temperature/history/california/) @coderLMN

coderLMN commented 8 years ago

从 DOM 树看,这个页面的文件列表就是一组 <a> 标签,因此可以用 XPath 来提取。文件列表前面还有几个其他链接:Name, Last modified, Size, Description, Parent Directory,因此文件链接是从第 6 个开始,可以用表达式 a[position()>5] 表示这个条件。我们要提取的是链接中的文件名,所以可以用 xmlGetAttr 提取每个节点中的 href 属性值。

提取文件列表的代码如下:

> doc <- htmlParse('http://www.wcc.nrcs.usda.gov/ftpref/data/climate/table/temperature/history/california/')
> filelist <- xpathSApply(doc, "/html/body/pre/a[position()>5]", xmlGetAttr, "href")

取得文件列表后,再把组织完整 URL 的 urlsavg 那一条赋值代码中 str_c 串接操作用到的 ftp 变量替换为现在的 http 网址,原书中的后续提取代码就可以照常执行了。@sunkrock

urdaddy85 commented 8 years ago

您好,在实践中遇到一个问题,就是使用htmlParse解析中文网页的时候经常会出现乱码,请问有没有好的解决方案:

path <- "http://www.sina.com.cn/"
lpda <- getURL(path, .encoding="utf-8")  # 这步没有乱码
lpda <- htmlParse(lpda, encoding="utf-8") # 这步乱码了
coderLMN commented 8 years ago

@urdaddy85 我在我自己的环境里执行这三行代码得到的结果没有乱码,是正常的。我在 stack overflow 上看到有人说这种编码问题是和 XML 组件版本有关的,你可以看看自己的 XML 组件版本是否需要更新。

urdaddy85 commented 8 years ago

@coderLMN 感谢回复;我的XML组件是最新的,我用的是WIN10的操作系统,网上说用Linux出现乱码的情况会少很多,不知是否是这个原因。 PS:虽然用htmlParse解析后是乱码,但是使用xpathSApply提取节点值得到的又是正常的,有点奇怪。

coderLMN commented 8 years ago

@urdaddy85 会不会是 R 语言开发环境的问题?我觉得这个可能性比较大。

dayushan commented 7 years ago

@coderLMN 老师,P211从API检索数据,Yahoo 现在开启OAuth认证,我参照这个网址 (https://developer.yahoo.com/oauth/guide/oauth-requesttoken.html )的说明,写html文件如下: <!DOCTYPE html>

YahooTest

我的YDN Apps的Callback Domain 设置为http://fb.ezencart.com ,然后点开上述html文件后并不能获取oauth_token、oauth_token_secret等 是什么原因呢

coderLMN commented 7 years ago

我打开 http://fb.ezencart.com 的结果是无法访问:

This site can’t be reached

fb.ezencart.com’s server DNS address could not be found.

关于回调域名参数,YDN 是这样说明的:

Yahoo redirects Users to this URL after they authorize access to their private data. If your application does not have access to a browser, you must specify the callback as oob (out of bounds).

我不太了解你这个网站的用途和设计,也许你应该设置 oob 回调?

VSNC commented 6 years ago

这本书的数据和代码地址:http://www.r-datacollection.com/bookmaterials.html 刚买到这本书,一起学习!

we0530 commented 6 years ago

Page298

# path to data on ftp
ftp  <- "ftp://ftp.wcc.nrcs.usda.gov/data/climate/table/temperature/history/california/"

# gen folder for data
if(!file.exists("Data")) dir.create("Data")

# get list of files from ftp
filelist <- getURL(ftp, dirlistonly = TRUE )
运行不出来
Error in function (type, msg, asError = TRUE)  : 
  Could not resolve host: ftp.wcc.nrcs.usda.gov

请大神指教,多谢!

谁能分享一下能下载有关气温数据txt文挡的网址,不胜感激

coderLMN commented 6 years ago

从错误信息:Could not resolve host: ftp.wcc.nrcs.usda.gov 可以判断是这个 FTP 网站无法访问了。

我自己去试了一下,这个数据确实找不到了。现在有两个办法:

  1. 搜索一下看看其他地方是否有这个数据的备份,如果有,就可以把它抓下来用,后面的代码不变;
  2. 如果这个数据没有了,可以搜索其他的类似数据,并且根据数据格式的变化修改书中的示例代码。

两种情况其实各有利弊,前者可以节约时间,但是后者可以更贴近实战。

coderLMN commented 6 years ago

可以在 write.csv() 函数里加上参数 , append = T,这样可以添加进去而不是覆盖了。

write.csv(buildings_2,"building.csv",row.names = F, append = T)
we0530 commented 6 years ago

@coderLMN

for(i in 1:9){
  urls<-paste0('https://yt.fang.lianjia.com/loupan/pg',i,'/')
  html_form <- getURL(url = urls)
  parsed_form <- htmlParse(html_form)
  name   <- xpathSApply(parsed_form,"//div[@class = 'resblock-name']/a[@class='name']",xmlValue)
  name   <- name[-11:-12]
  area   <- xpathSApply(parsed_form,"//div[@class = 'resblock-area']/span",xmlValue) 
  area   <- area[-11]
  status <- xpathSApply(parsed_form, "//div[@class='resblock-name']/span[@class='sale-status']",xmlValue)
  status <- status[-11]
  type   <- xpathSApply(parsed_form, "//div[@class='resblock-name']/span[@class='resblock-type']",xmlValue)
  type   <- type[-11]
  price  <- xpathSApply(parsed_form, "//div[@class='main-price']/span[@class='number']",xmlValue)
  price  <- price[-11:-12]
  building <- cbind(name,area, status,type,price)
  buildings <- as.data.frame(building)
  buildings_1 <- separate(data=buildings,col=area,into=c("a1","area"),sep=" ")
  buildings_1$a1 <- NULL
  buildings_2 <- separate(data=buildings_1,col=area,into=c("area","a"),sep="㎡")
  buildings_2$a <- NULL
  write.csv(buildings_2,"building.csv",row.names = F,append=T)
}

老师,这个写入还是不行,每一步我都看了,都没问题,就write写入,不能循环写入,不知道怎么解决。

coderLMN commented 6 years ago

你写入的内容是什么样的,贴出来看看

we0530 commented 6 years ago

t

we0530 commented 6 years ago

@coderLMN 截图我传上去了,它只写入了第9页的内容

coderLMN commented 6 years ago

那你就改用 write.table() 函数吧:

write.table(buildings_2,"building.csv",row.names = F,append=T)
woshiisp commented 4 years ago

从 DOM 树看,这个页面的文件列表就是一组 <a> 标签,因此可以用 XPath 来提取。文件列表前面还有几个其他链接:Name, Last modified, Size, Description, Parent Directory,因此文件链接是从第 6 个开始,可以用表达式 a[position()>5] 表示这个条件。我们要提取的是链接中的文件名,所以可以用 xmlGetAttr 提取每个节点中的 href 属性值。

提取文件列表的代码如下:

> doc <- htmlParse('http://www.wcc.nrcs.usda.gov/ftpref/data/climate/table/temperature/history/california/')
> filelist <- xpathSApply(doc, "/html/body/pre/a[position()>5]", xmlGetAttr, "href")

取得文件列表后,再把组织完整 URL 的 urlsavg 那一条赋值代码中 str_c 串接操作用到的 ftp 变量替换为现在的 http 网址,原书中的后续提取代码就可以照常执行了。@sunkrock

您好,给出的代码执行是有问题的。无法解析。 doc <- getURL(url = myurl) Error in function (type, msg, asError = TRUE) : error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version 看到是https,加上参数也是一样的,产生错误。

doc <- getURL(url = myurl,ssl.verifypeer = FALSE, encoding = 'UTF-8') Error in function (type, msg, asError = TRUE) : error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version

采用这样的代码是可以成功下载的 z<-c('19l03','19l05','19l06','19l07','19l08','19l13','19l17','19l19','19l24','19l38','19l39','19l40', '19l41','19l42','19l43','19l44','19l45','20h02','20h06','20h12','20h13','20k03','20k04','20k05', '20k13','20k25','20k27','20k30','20k31','20l02','20l06','20l10') for(i in 1:length(z)){ dizhi<-paste('https://www.wcc.nrcs.usda.gov/ftpref/data/climate/table/temperature/history/california/',z[i],'s_tavg.txt',sep="") x<-basename(dizhi) download.file(dizhi,paste(x,".txt")) }

我就是想弄明白,为什么采用RCurl解析的方法就是不行,产生报错呢?!! 原因到底在什么地方???????????????????? 感谢!!!!!!!!!!

woshiisp commented 4 years ago

已经找到原因,需要使用xml2的read_html函数读取,可以正常取出。 doc <- read_html(myurl,encoding = "utf-8") a <- htmlParse(doc)

filelist <- xpathSApply(a,"/html/body/pre/a[position()>5]",xmlGetAttr,"href") filelist [1] "19l03s_tavg.txt" "19l03s_tmax.txt" "19l03s_tmin.txt" [4] "19l05s_tavg.txt" "19l05s_tmax.txt" "19l05s_tmin.txt" [7] "19l06s_tavg.txt" "19l06s_tmax.txt" "19l06s_tmin.txt" [10] "19l07s_tavg.txt" "19l07s_tmax.txt" "19l07s_tmin.txt" [13] "19l08s_tavg.txt" "19l08s_tmax.txt" "19l08s_tmin.txt" [16] "19l13s_tavg.txt" "19l13s_tmax.txt" "19l13s_tmin.txt" [19] "19l17s_tavg.txt" "19l17s_tmax.txt" "19l17s_tmin.txt" [22] "19l19s_tavg.txt" "19l19s_tmax.txt" "19l19s_tmin.txt" [25] "19l24s_tavg.txt" "19l24s_tmax.txt" "19l24s_tmin.txt" [28] "19l38s_tavg.txt" "19l38s_tmax.txt" "19l38s_tmin.txt" [31] "19l39s_tavg.txt" "19l39s_tmax.txt" "19l39s_tmin.txt" [34] "19l40s_tavg.txt" "19l40s_tmax.txt" "19l40s_tmin.txt" [37] "19l41s_tavg.txt" "19l41s_tmax.txt" "19l41s_tmin.txt" [40] "19l42s_tavg.txt" "19l42s_tmax.txt" "19l42s_tmin.txt" [43] "19l43s_tavg.txt" "19l43s_tmax.txt" "19l43s_tmin.txt" [46] "19l44s_tavg.txt" "19l44s_tmax.txt" "19l44s_tmin.txt" [49] "19l45s_tavg.txt" "19l45s_tmax.txt" "19l45s_tmin.txt" [52] "20h02s_tavg.txt" "20h02s_tmax.txt" "20h02s_tmin.txt" [55] "20h06s_tavg.txt" "20h06s_tmax.txt" "20h06s_tmin.txt" [58] "20h12s_tavg.txt" "20h12s_tmax.txt" "20h12s_tmin.txt" [61] "20h13s_tavg.txt" "20h13s_tmax.txt" "20h13s_tmin.txt" [64] "20k03s_tavg.txt" "20k03s_tmax.txt" "20k03s_tmin.txt" [67] "20k04s_tavg.txt" "20k04s_tmax.txt" "20k04s_tmin.txt" [70] "20k05s_tavg.txt" "20k05s_tmax.txt" "20k05s_tmin.txt" [73] "20k13s_tavg.txt" "20k13s_tmax.txt" "20k13s_tmin.txt" [76] "20k25s_tavg.txt" "20k25s_tmax.txt" "20k25s_tmin.txt" [79] "20k27s_tavg.txt" "20k27s_tmax.txt" "20k27s_tmin.txt" [82] "20k30s_tavg.txt" "20k30s_tmax.txt" "20k30s_tmin.txt" [85] "20k31s_tavg.txt" "20k31s_tmax.txt" "20k31s_tmin.txt" [88] "20l02s_tavg.txt" "20l02s_tmax.txt" "20l02s_tmin.txt" [91] "20l06s_tavg.txt" "20l06s_tmax.txt" "20l06s_tmin.txt" [94] "20l10s_tavg.txt" "20l10s_tmax.txt" "20l10s_tmin.txt"

coderLMN commented 4 years ago

是不是因为接口升级了?

woshiisp commented 4 years ago

是不是因为接口升级了?

是的,因为接口升级,需要XML2,read_html读取。