2016-10-05 15 views
1

私はR3.3.1でWindows 7を使用しています。私はidsFinal_Attackという2つの列を持つデータフレームを持っています。readLines()ウェブスクレイピングがrで接続を開くことができません

Attack Type 
1             40674 
2 Netcore.Netis.Devices.Hardcoded.Password.Security.Bypass 
3         DNS.Invalid.Size.Attack 
4      Acunetix.Web.Vulnerability.Scanner 
5         SIPVicious.SIP.Scanner 
6             17799 
New 
1         SIPVicious.SIP.Scanner 
2 Netcore.Netis.Devices.Hardcoded.Password.Security.Bypass 
3         DNS.Invalid.Size.Attack 
4      Acunetix.Web.Vulnerability.Scanner 
5         SIPVicious.SIP.Scanner 
6        MS.SMBv2.Infinite.Loop.DoS 

最初は、文字IDと数値IDの両方からなる「攻撃タイプ」です。 2番目の列は、以下のコードで記入したいものです。文字列が含まれている「攻撃タイプ」の行のために

URL = 'http://www.fortinet.com/ids/VID' 
idsFinal_Attack$New = character(length = nrow(idsFinal_Attack)) 

for (i in 1:nrow(idsFinal_Attack)) { 
    if (is.na(as.numeric(idsFinal_Attack$`Attack Type`[i]))) { 
      idsFinal_Attack$New[i] = idsFinal_Attack$`Attack Type`[i] 
    } else { 
      fortinetPage = readLines(paste0(URL, idsFinal_Attack$`Attack Type`[i])) 
      fortinetPage = grep("id=\"ency_title\">Vulnerability:", fortinetPage, 
           value = TRUE) 
      idsFinal_Attack$New[i] = 
        gsub("<h1 id=\"ency_title\">Vulnerability: |</h1>", "", fortinetPage) 
    } 
} 

、私はコラム「新」の隣接するセルにその文字列をコピー&ペーストしたいです。行1のような数字の入った行の "Attack Type"の行については、その数値を変数 "URL"の最後に貼り付けてから、readLines()関数を使用して、拡張された "URL"変数は私を、すなわちhttp://www.fortinet.com/ids/VID40674に連れて行きます。私は、Webページの「脆弱性」というタイトルの小さなセクションだけを、後続のテキストとともに必要とします。 readLines()はウェブページからすべてのテキストを返し、grepとgsubを使って目的のセクションを取得できます。データフレームidsFinal_Attackには145行があり、そのうち67行は数値で、readLines()コマンドが必要です。以下のコードは、その約半分で動作し、以下に示すエラーがスローされます。

Error in readLines(url(paste0(URL, idsFinal_Attack$`Attack Type`[i]), 
: cannot open the connection 

これは私の最初の試みであり、コードを簡潔にすることができます。私はちょうど実際のバージョンを手に入れたいと思った。私は簡単にXMLとrvestパッケージを試しましたが、幸運なことはありませんでした。誰か提案はありますか?

+0

正規表現でHTMLを解析しないでください。 'rvest'や' XML'のようなHTMLパーサーを使いましょう。 – alistaire

答えて

1

readLinesはリダイレクトを適切に処理しない可能性があります。 Fortinetがリダイレクトするので、問題が発生する可能性があります。

rvestを使用すると、readLinesを使用すると透過的です。例えば

、再現性の例は次のとおりです。

library(readr) 
library(rvest) 

sample.data <- "Attack Type New 
40674 SIPVicious.SIP.Scanner 
Netcore.Netis.Devices.Hardcoded.Password.Security.Bypass Netcore.Netis.Devices.Hardcoded.Password.Security.Bypass 
DNS.Invalid.Size.Attack DNS.Invalid.Size.Attack 
Acunetix.Web.Vulnerability.Scanner Acunetix.Web.Vulnerability.Scanner 
SIPVicious.SIP.Scanner SIPVicious.SIP.Scanner 
17799 MS.SMBv2.Infinite.Loop.DoS 
127 MS.SMBv2.Infinite.Loop.DoS" 

idsFinal_Attack <- read_tsv(sample.data) 

URL = 'http://www.fortinet.com/ids/VID' 
idsFinal_Attack$New = character(length = nrow(idsFinal_Attack)) 

for (i in 1:nrow(idsFinal_Attack)) { 
    attack.type <- idsFinal_Attack$`Attack Type`[i] 
    not.fortinet.id <- is.na(as.numeric(attack.type)) 
    if (not.fortinet.id) { 
    idsFinal_Attack$New[i] = attack.type 
    } else { 
    fortinet.url <- paste0(URL, attack.type) 
    fortinet.page <- try(read_html(fortinet.url)) 
    if ("try-error" %in% class(fortinet.page)){ 
     idsFinal_Attack$New[i] <- NA 
     next; 
    } 
    title <- fortinet.page %>% 
     html_node(xpath = ".//*[@id='ency_title']") %>% 
     html_text() 
    title.clean <- gsub("^\\w+:\\s+", "", title) 
    idsFinal_Attack$New[i] <- title.clean 
    } 
} 
+0

は、最初に投稿した "idsFinal_Attack"データフレームを再作成するはずの "read_tsv"関数ですか? –

+0

はい、そうです。 –

+0

オリジナルのidsFinal_Attackデータフレームを使用すると、WebページにマップされたすべてのURLが完全に機能しました。しかし、次のエラーが発生したものがありました(http://www.fortinet.com/ids/VID127)。 "open.connection(x、" rb ")のエラー:HTTPエラー404です。"その理由は、「The Page Was Not Found」のためだと思います。これはコード実行の途中で起こり、80行を残してコードの実行を停止させました。これを回避する方法があるので、コードが実行され続け、 "解決されていない"のようなメッセージがWebデータがなくなったはずのセルに置かれますか? –

関連する問題