0

助けてほしい問題があります。csv ファイルにロードできる R コードを作成する必要があります。csv ファイルには「リンク」という名前の列が 1 つ含まれており、各 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を超えると問題になり始めます。とはいえ、この特定のタスクに適したクローラーになるためには、このコードにいくつか実装する必要があります。

問題1を解決すると一時的にケースが解決するはずなので、問題を2つに分割しました。

  1. ダウンロード100回ごとにSys.Sleep機能を使いたい。したがって、コードは最初の 100 個のリンクに対して 100 個のリクエストを発行し、次の 100 個のリクエストを発行する前に x 秒間一時停止します...

  2. データセット/csv ファイルのすべての行/リンクでそれを行った後、各 csv ファイルを 2 つの条件でチェックする必要があります。それらを空にすることはできず、サーバーがいくつかの特別なケースで私に与える特定のエラーメッセージを含めることはできません. これらの 2 つの条件のいずれかが true の場合、ファイル名 (リンク番号) をベクトルに保存して、そこから作業できるようにする必要があります。

うわー、この質問は突然かなり長くなりました。私はそれが大きな問題であることを理解しており、私は多くのことを尋ねています. これは私の修士論文であり、R プログラミングに関するものではありませんが、アクセス権を与えられた多くの Web サイトからコンテンツをダウンロードする必要があります。次に、内容を分析する必要があります。これが私の論文の目的です。提案/コメントは大歓迎です。


 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=""))}  

もっと私を助けることができますか?

4

2 に答える 2

0

最終的解決:

> library(RCurl)  
> library(foreach)  
> library(foreign)

> z <- nrow(links)  
> outpath <-"SPECIFIC PATH"

> foreach(i=1:z) %do% {    
+  text <- getURL(links[i,])    
+  write(as.character(text), file = paste(outpath,"/",i,".txt",sep=""))}
于 2012-09-01T22:45:01.333 に答える
0

私のコメントをフォローアップするには、ループの途中で Sys.sleep に入れる基本的な概念を次に示します。

for (i in 1:10) { 
  if(i == 5) {
      print("halfwayhome")
      Sys.sleep(5)
      print(i)
  }
  else { 
      print(i)
  }
}

結果:

[1] 1
[1] 2
[1] 3
[1] 4
[1] "halfwayhome"
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10

私は RCurl や HTML ページの解析の経験がないので、あなたのタスクのその部分を都合よく避けました。ただし、アドレスのリストを正常に生成し、ダウンロードしてreadLines()書き戻すことができました。私はSys.sleep()それぞれの後に電話をかけましたが、物事は桃色に機能しているようです.

links <- c("http://news.lugnet.com/dear-lego/?n=1",
           "http://news.lugnet.com/dear-lego/?n=2",
           "http://news.lugnet.com/dear-lego/?n=3",
           "http://news.lugnet.com/dear-lego/?n=4",
           "http://news.lugnet.com/dear-lego/?n=5",
           "http://news.lugnet.com/dear-lego/?n=6",
           "http://news.lugnet.com/dear-lego/?n=7",
           "http://news.lugnet.com/dear-lego/?n=8",
           "http://news.lugnet.com/dear-lego/?n=9",
           "http://news.lugnet.com/dear-lego/?n=10"
           )

for (j in 1:length(links)){
  dat <- readLines(links[j])
  write.table(dat, paste0("outfile",j,"txt"))
  Sys.sleep(5)
  cat("Finished file", j)
}

これらの HTML ページを解析する必要がある場合、またはそれらからより有用なものを取得する必要がある場合は、新しい/別の質問をしますが、おそらくその面ではあまり役に立ちません。

これが役に立てば幸いです - チェイス

于 2012-08-20T21:18:17.910 に答える