【问题标题】:R: How can I open a list of links to scrape the homepage of a news website?R:如何打开链接列表来抓取新闻网站的主页?
【发布时间】:2020-06-25 10:40:27
【问题描述】:

我正在尝试使用 R 构建一个网络抓取工具,以抓取在新闻网站 www.20min.ch 上发布的文章。他们的 api 是可公开访问的,因此我可以创建一个包含标题、网址的数据框、描述和带有 rvest 的时间戳。下一步是访问每个链接并创建文章文本列表并将其与我的数据框结合起来。但是我不知道如何自动访问这些文章。理想情况下,我想读取_html链接1,然后用html节点复制文本,然后继续链接2...

这是我到目前为止写的:

site20min <- read_xml("https://api.20min.ch/rss/view/1")

site20min

url_list <- site20min %>% html_nodes('link') %>% html_text()

df20min <- data.frame(Title = character(),
                      Zeit = character(),
                      Lead = character(),
                      Text = character()
                      )

 for(i in 1:length(url_list)){
      myLink <- url_list[i]
      site20min <- read_html(myLink)
            
      titel20min <- site20min %>% html_nodes('h1 span') %>% html_text()
      zeit20min <- site20min %>% html_nodes('#story_content .clearfix span') %>% html_text()
      lead20min <- site20min %>% html_nodes('#story_content h3') %>% html_text()
      text20min <- site20min %>% html_nodes('.story_text') %>% html_text()  
           
      df20min_a <- data.frame(Title = titel20min)
      df20min_b <- data.frame(Zeit = zeit20min)
      df20min_c <- data.frame(Lead = lead20min)
      df20min_d <- data.frame(Text = text20min)
              }

我需要的是 R 打开每个链接并提取一些信息:

site20min_1 <- read_html("https://www.20min.ch/schweiz/news/story/-Es-liegen-auch-Junge-auf-der-Intensivstation--14630453")

  titel20min_1 <- site20min_1 %>% html_nodes('h1 span') %>% html_text()
  zeit20min_1 <- site20min_1 %>% html_nodes('#story_content .clearfix span') %>% html_text()
  lead20min_1 <- site20min_1 %>% html_nodes('#story_content h3') %>% html_text()
  text20min_1 <- site20min_1 %>% html_nodes('.story_text') %>% html_text()

将它绑定到数据框应该不是什么大问题。但目前我的一些结果是空的。

感谢您的帮助!

【问题讨论】:

    标签: r web web-scraping rvest


    【解决方案1】:

    您在设置数据框方面走在了正确的轨道上。您可以遍历每个链接并将其 rbind 到您现有的数据框结构。

    首先,您可以设置要循环的 url 向量。根据编辑,这里是这样一个向量:

    url_list <- c("http://www.20min.ch/ausland/news/story/14618481",
                  "http://www.20min.ch/schweiz/news/story/18901454",
                  "http://www.20min.ch/finance/news/story/21796077",
                  "http://www.20min.ch/schweiz/news/story/25363072",
                  "http://www.20min.ch/schweiz/news/story/19113494",
                  "http://www.20min.ch/community/social_promo/story/20407354",
                  "https://cp.20min.ch/de/stories/635-stressfrei-durch-den-verkehr-so-sieht-der-alltag-von-busfahrer-claudio-aus")
    

    接下来,您可以设置一个数据框结构,其中包含您要收集的所有内容。

    # Set up the dataframe first
    df20min <- data.frame(Title = character(),
                          Link = character(),
                          Lead = character(),
                          Zeit = character())
    

    最后,您可以遍历列表中的每个 url,并将相关信息添加到您的数据框中。

    # Go through a loop
    for(i in 1:length(url_list)){
      myLink <- url_list[i]
      site20min <- read_xml(myLink)
    
      # Extract the info
      titel20min <- site20min %>% html_nodes('title') %>% html_text()
      link20min <- site20min %>% html_nodes('link') %>% html_text() 
      zeit20min <- site20min %>% html_nodes('pubDate') %>% html_text()
      lead20min <- site20min %>% html_nodes('description') %>% html_text()
    
      # Structure into dataframe
      df20min_a <- data.frame(Title = titel20min, Link =link20min, Lead = lead20min)
      df20min_b <- df20min_a [-(1:2),]
      df20min_c <- data.frame(Zeit = zeit20min)
    
      # Insert into final dataframe
      df20min <- rbind(df20min, cbind(df20min_b,df20min_c))
    }
    

    【讨论】:

    • 没用。我需要打开一个链接列表,而不是修改一个链接。
    • 它同样适用于链接列表——您只需为此进行修改。由于您的问题没有澄清,我认为它正在循环通过所有相似的链接。如果您提供链接列表,我可以对其进行编辑,以便它满足您的需求。否则,你可以自己试试。不是循环 1 到 n,而是循环 1 通过存储在某个向量中的链接数。
    • 已更新。非常感谢您的帮助!自我隔离的欢呼声。
    • 我添加了这个。让我知道这是否适合你。
    • 它仍然无法正常工作,但我们越来越近了。我认为它现在遍历列表,但结果仍然是空的。我会更新我的代码。
    猜你喜欢
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    相关资源
    最近更新 更多