【发布时间】:2021-11-12 16:52:18
【问题描述】:
我正在尝试在 R 中抓取多个 RSS 链接(那些是 +800 篇新闻文章)
我能够通过以下方式抓取单个 URL:
cnn_url <- "http://rss.cnn.com/~r/rss/cnn_travel/~3/-GFuCIsYZgQ/index.html"
cnn_html <- read_html(cnn_url)
cnn_html
cnn_nodes <- cnn_html %>% html_elements(".Article__body")
#look for texts
cnn_texts <- cnn_html %>%
html_elements(".Article__body") %>%
html_text()
cnn_texts[1]
但我试图在 R 中抓取 +800 篇文章(新闻故事的正文),但我无法为每个 URL 运行上述代码,因为我有超过 +800 个链接。所以我使用了代码:
cnn_data <- news_data %>%
filter(media_name == "CNN")
head(cnn_data$url)
head(cnn_data)
urls <- cnn_data[,4] #column with url
url_xml <- try(apply(urls, 1, read_html))
textScraper <- function(x) {
html_text(html_nodes (x, ".Article__body") %>%
html_nodes("p")) %>%
paste(collapse = '')}
cnn_text <- lapply(url_xml, textScraper)
cnn_text[1]
cnn_data$full_article <- cnn_text
head(cnn_data$full_article)
但是当我跑线时:
url_xml <- try(apply(urls, 1, read_html))
我收到一条错误消息:open.connection(x, "rb") 中的错误:HTTP 错误 404。
我认为这可能是因为 URL 链接到 RSS;有什么方法可以使用我拥有的 URL 来抓取这些新闻报道?
仅供参考:数据文件由具有此类链接的行组成--
http://rss.cnn.com/~r/rss/cnn_travel/~3/-GFuCIsYZgQ/index.html
http://rss.cnn.com/~r/rss/cnn_latest/~3/WvpC9ZKjJXo/index.html
http://rss.cnn.com/~r/rss/cnn_latest/~3/przZf_johNY/index.html
http://rss.cnn.com/~r/rss/cnn_latest/~3/TieFj4roU_M/index.html
http://rss.cnn.com/~r/rss/cnn_latest/~3/iqRZ7f8MhzQ/index.html
http://rss.cnn.com/~r/rss/cnn_latest/~3/Uq46bJROhiI/index.html
http://rss.cnn.com/~r/rss/cnn_latest/~3/6u-D9sna6uY/index.html
http://rss.cnn.com/~r/rss/cnn_latest/~3/JNTXgcM1yY0/index.html
http://rss.cnn.com/~r/rss/cnn_latest/~3/WG8UTHcZvwQ/index.html
http://rss.cnn.com/~r/rss/cnn_latest/~3/6YHMwdj6W7s/index.html
【问题讨论】:
-
很可能至少有一个链接无效,从而产生错误。您可能需要单独遍历每个 URL,并使用 Try-Catch 策略来处理 URLS 的任何错误。
-
感谢您的建议!如果我错了,请纠正我——但这就是我使用 try() 的原因。即使有一个“有问题的”链接,如果我使用 try(),加载其余链接应该没有问题。我还尝试了安全(),可能()而不是尝试(),在代码末尾有和没有“silent = TRUE”。但他们没有工作。
-
更新:我的一个朋友告诉我,这里的问题可能是每个 URL 链接的 html 结构略有不同,所以对于第一个链接, .Article__body 有效,但对于第二个链接,它应该是.l-容器。有什么方法可以为正文段落收集所有这些不同的 html 标签并将它们应用到我的代码中?
标签: r web-scraping