如何使用R从多个维基百科页面抓取数据?

问题描述 投票:0回答:1

我对R中的数据抓取是陌生的,但是我想做以下事情。我有一个名人列表,celebs,我想从维基百科获取他们的生日。我知道如何针对每个名人,但我正在尝试使这一过程动起来。

celebs <- c("Tom Hanks", "Tim Cook", "Michael Bloomberg")

我执行以下操作以获取第一位名人Tom Hanks所需的信息。

library(rvest)

wiki <- read_html("https://en.wikipedia.org/wiki/Tom_Hanks")

birth_date <- wiki %>%
  html_nodes(xpath = '//*[@id="mw-content-text"]/div/table/tbody/tr[3]/td/text()') %>%
  html_text()

是否有一种无需手动编辑以上代码即可获取Tim CookMichael Bloomberg所需信息的方法?

谢谢你!

r web-scraping wikipedia
1个回答
0
投票

欢迎来到SO。>>

要重复使用代码执行任何任务,您应该始终寻找建立循环的方法。在构建循环之前,应尝试构建循环的单个迭代。您几乎已经准备就绪,但是缺少一些步骤。

首先,我们应该尝试对代码进行泛化,以便只需从迭代器(名人)的向量中切换一个变量的值就可以使代码起作用。

person <- "Tom Hanks"

现在,使用该代码,我们需要通过代码创建Wikipedia链接。这里有两件事要考虑:

  1. 我们需要在人员姓名之前添加链接;
  2. 我们应该在“ Tom Hanks”中的空格处替换下划线
  3. 我们可以使用以下代码执行此操作:

link <- paste0("https://en.wikipedia.org/wiki/", 
               str_replace_all(person, " ", "_"))

这会创建正确的链接,我们可以将其用于后续步骤。现在,这只是迭代celebs向量的问题。有很多方法可以执行此操作,但是在R中,最合适的方法是使用sapply。为此,我们将创建一个匿名函数,该函数将使用person的名称作为输入,使用已编写的代码查询Wikipedia并提取其生日:

function(person) {
    person <- celebs[1]
    link <- paste0("https://en.wikipedia.org/wiki/", 
                   str_replace_all(person, " ", "_"))

    wiki <- read_html(link)

    birth_date <- wiki %>%
        html_nodes(xpath = '//*[@id="mw-content-text"]/div/table/tbody/tr[3]/td/text()') %>%
        html_text()
    return(birth_date)
}

您现在可以在其周围包装sapply结构:

birthdates <- sapply(celebs, function(person) {
    person <- celebs[1]
    link <- paste0("https://en.wikipedia.org/wiki/", 
                   str_replace_all(person, " ", "_"))

    wiki <- read_html(link)

    birth_date <- wiki %>%
        html_nodes(xpath = '//*[@id="mw-content-text"]/div/table/tbody/tr[3]/td/text()') %>%
        html_text()
    return(birth_date)
})
© www.soinside.com 2019 - 2024. All rights reserved.