![](/img/trans.png)
[英]Knitr intermittently fails to execute readLines on URLs, throws Error in file(con, "r") : cannot open the connection to <URL>
[英]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.