亲爱的 Stackoverflow 用户,
我正在使用 R 从《今日心理学》中抓取一些心理治疗师的资料;这样做是为了锻炼和学习更多有关网络抓取的知识。
我是 R 新手,我必须接受这种紧张的培训,这将有助于我完成未来的项目。这意味着我可能并不确切地知道我现在在做什么(例如,我可能无法很好地解释脚本或来自 R 的错误消息),但我必须完成它。因此,对于可能存在的误解或不准确之处,敬请谅解。
简而言之,情况如下。
我创建了一个函数,通过它我可以从心理治疗师个人资料的 2 个节点中抓取信息;该功能显示在此堆栈溢出帖子 https://stackoverflow.com/questions/58054707/web-scraping-and-looping-through-pages-with-r/58055188.
然后我创建一个循环,在一些心理治疗师的个人资料上使用该函数;该循环也在上面的帖子中,但我在下面报告它,因为这是脚本中产生一些问题的部分(除了我在上面提到的帖子中解决的问题之外)。
j <- 1
MHP_codes <- c(150140:150180) #therapist identifier
df_list <- vector(mode = "list", length(MHP_codes))
for(code1 in MHP_codes) {
URL <- paste0('https://www.psychologytoday.com/us/therapists/illinois/', code1)
#Reading the HTML code from the website
URL <- read_html(URL)
df_list[[j]] <- tryCatch(getProfile(URL),
error = function(e) NA)
j <- j + 1
}
当循环完成时,我将来自不同配置文件的信息绑定到一个数据帧中并保存它。
final_df <- rbind.fill(df_list)
save(final_df,file="final_df.Rda")
该函数 (getProfile) 在个人配置文件上运行良好。
它也适用于小范围的配置文件 (c(150100:150150))。
请注意,我不知道实际分配的心理治疗师 ID 是什么;因此,该范围内的许多 URL 都不存在。
不过一般来说tryCatch应该可以解决这个问题。当 URL 不存在时(因此 ID 不与任何心理治疗师关联),2 个节点中的每一个(以及我的数据框中的 2 个相应变量中的每一个)都是空的(即数据框在相应的单元格)。
然而,在某些 ID 范围内,可能会出现两个问题。
首先,我收到一条错误消息,如下所示:
open.connection(x, "rb") 中的错误:HTTP 错误 404。
因此,尽管我正在使用 try Catch 并且它通常看起来有效(至少在错误消息出现之前),但这种情况还是发生了。
此外,在循环停止并且 R 运行该行之后:
final_df <- rbind.fill(df_list)
出现第二条错误消息:
警告信息:
在 df[[var]] 中:
关闭未使用的连接 3 (https://www.psychologytoday.com/us/therapys/illinois/150152 https://www.psychologytoday.com/us/therapists/illinois/150152)
该空 URL 似乎存在特定问题。
事实上,当我更改 ID 范围时,尽管 URL 不存在,循环仍能正常工作:一方面,当 URL 存在时,将从网站中抓取信息;另一方面,当 URL 不存在时,这两个变量与该 URL(以及该心理治疗师 ID)相关联的用户会得到 NA。
如果 URL 为空,是否可以告诉 R 跳过该 URL?不记录任何东西?
这个解决方案非常好,因为它会将数据帧缩小到现有的 URL,但我不知道该怎么做,也不知道它是否能解决我的问题。
谁能帮我解决这个问题?