【发布时间】:2012-08-18 19:26:57
【问题描述】:
我有一个问题需要帮助。我需要创建一段可以加载到 csv 文件中的 R 代码。 csv 文件包含一个名为“Link”的列,每个 i(Row) 都有一个链接,代码需要从该链接下载链接的内容并将其放在单独的 csv 文件中。到目前为止,我已经设法找到并修改了下面显示的代码。 (感谢 Christopher Gandrud 和合著者)
library(foreign)
library(RCurl)
addresses <- read.csv(">>PATH TO CSV FILE<<")
for (i in addresses) full.text <- getURL(i)
text <- data.frame(full.text)
outpath <-">>PATH TO SPECIFIED FOLDER<<"
x <- 1:nrow(text)
for(i in x) {
write(as.character(text[i,1]), file = paste(outpath,"/",i,".txt",sep=""))
}
实际上代码运行良好,但问题是我的请求使服务器超载,所以在从 100-150 个链接下载了正确的内容后,文件只是空的。我知道这是问题所在,因为我已经多次测试它,但链接数量正在减少。其实如果我当时只下载100个链接是没有问题的。超过 100 就开始成为问题。尽管如此,我需要在这段代码中实现一些东西,让它成为这个特定任务的一个很好的爬虫。
我把我的问题一分为二,因为解决一个问题应该暂时解决这个问题。
我想为每 100 次下载使用 Sys.Sleep 功能。因此,代码为前 100 个链接触发 100 个请求,然后在触发下一个 100 个请求之前暂停 x 秒...
对我的数据集/csv 文件中的所有行/链接完成此操作后,我需要它来检查每个 csv 文件的两个条件。它们不能为空,也不能包含服务器在某些特殊情况下给我的特定错误消息。如果这两个条件之一为真,则需要将文件名(链接号)保存到我可以从那里使用的向量中。
哇,这个问题突然变得很长了。我意识到这是一个很大的问题,我问了很多。这是我的硕士论文,不是关于 R 编程的,但我需要从很多我可以访问的网站下载内容。接下来我要分析内容,这就是我的论文的内容。欢迎任何建议/cmets。
library(foreign)
library(RCurl)
addresses <- read.csv("~/Dropbox/Speciale/Mining/Input/Extract post - Dear Lego n(250).csv")
for (i in addresses) {
+ if(i == 50) {
+ print("Why wont this work?")
+ Sys.sleep(10)
+ print(i)
+ }
+ else {
+ print(i)
+ }
+ }
“然后是加载的链接的完整列表。没有“为什么这不起作用”在 i == 50”后跟
警告信息
In if (i == 100) {:
the condition has length > 1 and only the first element will be used
full.text <- getURL(i)
text <- data.frame(full.text)
outpath <-"~/Dropbox/Speciale/Mining/Output"
x <- 1:nrow(text)
for(i in x) {
write(as.character(text[i,1]), file = paste(outpath,"/",i,".txt",sep=""))}
能帮我更多吗?
【问题讨论】:
-
我建议将其分成两个问题。至于你的第一个,你为什么不放一个条件来检查你的迭代器是否是 100 的倍数,即
if i%%100 == 0 then Sys.sleep(yourTimeHere)... -
我同意这两个问题(我是新手,会尝试调整)。可以看到有人提议改变我的问题。我会尝试解决你提出的问题,我会尽快发布解决方案。我的基本问题是具有 VBA 编程的基本技能,但刚开始使用 R。所以我不知道不同的循环是如何工作的,以及如何为我制作一个“计数器”,就像我在 VBA 中很容易做到的那样。跨度>
-
基本结构或多或少是相同的,尽管我会在 R 中自动递增...为了测试这一点,请执行
for (i in 1:10) {print(i)}
标签: r if-statement for-loop web-crawler