【问题标题】:Webscraping with R: How can I tidy my data?使用 R 进行 Web Scraping:如何整理我的数据?
【发布时间】:2020-07-21 23:05:15
【问题描述】:

我正在为瑞士的一些新闻网站构建一个网络爬虫。经过一些试验和错误以及 StackOverflow 的大量帮助(谢谢大家!),我已经到了可以从所有文章中获取文本数据的地步。

#packages instalieren

install.packages("rvest")
install.packages("tidyverse")
install.packages("dplyr")
library(rvest)
library(stringr)

#seite einlesen

apisrf<- read_xml('https://www.srf.ch/news/bnf/rss/1646')

urls_srf <- apisrf %>% html_nodes('link') %>% html_text()
zeit_srf <- apisrf %>% html_nodes('pubDate') %>% html_text()

#data.frame basteln

dfsrf_titel_text <- data.frame(Text = character())

#scrape

for(i in 1:length(urls_srf)) {
  link <- urls_srf[i]
  
  artikel <- read_html(link)
  
  #Informationen entnehmen
  textsrf<- artikel %>% html_nodes('p') %>% html_text()
 
  #In Dataframe strukturieren
  
  dfsrf_text <- data.frame(Text = textsrf)
  
  dfsrf_titel_text <- rbind(dfsrf_titel_text, cbind(dfsrf_text))  
       
}

运行它会给我 dfsrf_titel_text。 (我会在某个时候将它与文章的标题结合起来,但这就是我的问题。)

但是,现在我的数据非常凌乱,我无法真正弄清楚如何以某种方式清理它,以便它适合我。特别令人讨厌的是,来自不同文章的文本并没有真正以这种方式结构化,而是每当文本中有段落时都会换行。我无法合并段落,因为所有文本都有不同的长度。 (从第 3 点开始的第一篇文章非常长,因为它是涵盖电晕危机的实时行情,所以如果您运行我的代码,请不要混淆。)

只有当文本来自新文章(意味着来自新 URL?

感谢您的帮助!

【问题讨论】:

    标签: r web-scraping text data-cleaning


    【解决方案1】:

    您应该在创建数据框本身时更正此问题。在这里,我使用 paste0 在它们之间添加换行符 (\n\n) 将每篇文章的所有数据绑定在一起。

    library(rvest)
    
    for(i in 1:length(urls_srf)) {
        link <- urls_srf[i]
        artikel <- read_html(link)
        #Informationen entnehmen
        textsrf<- paste0(artikel %>% html_nodes('p') %>% html_text(), collapse = "\n\n")
        #In Dataframe strukturieren
        dfsrf_text <- data.frame(Text = textsrf)
        dfsrf_titel_text <- rbind(dfsrf_titel_text, cbind(dfsrf_text))  
    }
    

    但是,在循环中不断增长的数据效率非常低,并且会严重减慢流程,尤其是当您需要像这样抓取大量数据时。尝试使用sapply。

    dfsrf_titel_text <- data.frame(text = sapply(urls_srf, function(x) {
        paste0(read_html(x) %>% html_nodes('p') %>% html_text(), collapse = "\n\n")
    }))
    

    因此,这将为您提供与 urls_srf 长度相同的行数。

    【讨论】:

    • 还有一件事我需要帮助:这段代码直到今天都运行良好,但现在它显示“最多 (10) 次重定向”。有没有办法解决重定向?
    • 我不知道在网页抓取时处理重定向。也许您可以发布一个新问题?
    【解决方案2】:

    您能否提供数据样本?您可以使用 strsplit(string, pattern) 函数,其中您指定的模式仅在文章之间发生。也许是网址?

    strsplit(dfsrf_text,"www.\\w+.ch")
    

    只要找到 .ch 域中的 URL,就会拆分您的文本。您可以使用this regular expression cheat sheet 来帮助您识别分隔文章的模式。

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 1970-01-01
      • 2017-06-28
      • 1970-01-01
      • 2020-06-11
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 2017-05-14
      相关资源
      最近更新 更多