【问题标题】:Scrape multiple RSS links in R在 R 中抓取多个 RSS 链接
【发布时间】: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


【解决方案1】:

您的try() 语句正在测试对apply() 的调用的返回,因此如果有一个错误链接,则应用将出错,然后try 语句将接管。您需要将 try 包裹在 read_html 而不是 apply。
像这样的东西应该可以工作,返回一个网页列表。请注意以上所有链接都有效。

library(rvest)

mylist<-lapply(urls, function(url) {
   #be kind and not attack the server
   Sys.sleep(1)
   print(url)  #debug
   url_xml<-try(read_html(url))
})

是的,可以编写代码来处理不同的页面,但这可能是一个更大的问题需要回答。

【讨论】:

    猜你喜欢
    • 2017-12-24
    • 1970-01-01
    • 2015-04-28
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多