繁体   English   中英

readLines() webscraping 无法在 r 中打开连接

[英]readLines() webscraping cannot open connection in r

我正在使用带有 R3.3.1 的 Windows 7。 我有一个名为idsFinal_Attack的数据框,它有两列。

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 组成。 第二列是我希望用下面的代码填写的内容。

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 行,我希望将该数值粘贴到变量“URL”的末尾,然后使用readLines()函数提取网页的一部分,该部分增强了“ URL”变量将我带到,即http://www.fortinet.com/ids/VID40674 我只需要标题为“漏洞”的网页的一小部分以及随后的文本。 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 包进行了简短的试验,但没有任何运气。 有人有什么建议吗?

我相信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  
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM