Web Scraping Известные имена - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь получить

  • Пол
  • Раса или этническая принадлежность
  • Сексуальная ориентация
  • Профессия
  • Национальность

от каждого сайта, указанного здесь: https://www.nndb.com/lists/494/000063305/

Вот отдельный сайт , чтобы зрители могли видеть одну страницу.

Я пытаюсь смоделировать свой код R после этого сайта , но это сложно, потому что на отдельных сайтах, например, нет заголовков для пола.Может ли кто-нибудь помочь?

library(purrr)
library(rvest)
url_base <- "https://www.nndb.com/lists/494/000063305/"
b_dataset <- map_df(1:91, function(i) {
  page <- read_html(sprintf(url_base, i))
  data.frame(ICOname = html_text(html_nodes(page, ".name")))
})

1 Ответ

1 голос
/ 02 апреля 2019

Я отвезу тебя на полпути: отсюда не так уж сложно разобраться.

library(purrr)
library(rvest)
url_base <- "https://www.nndb.com/lists/494/000063305/"

Во-первых, следующее сгенерирует список URL-адресов списка фамилий A-Z, а затем, следовательно, URL-адреса профиля каждого человека.

## Gets A-Z links
all_surname_urls <- read_html(url_base) %>%
  html_nodes(".newslink") %>%
  html_attrs() %>%
  map(pluck(1, 1))

all_ppl_urls <- map(
  all_surname_urls, 
  function(x) read_html(x) %>%
    html_nodes("a") %>%
    html_attrs() %>%
    map(pluck(1, 1))
) %>% 
  unlist()

all_ppl_urls <- setdiff(
  all_ppl_urls[!duplicated(all_ppl_urls)], 
  c(all_surname_urls, "http://www.nndb.com/")
)

Вы правы - на самом деле не существует отдельных заголовков для пола или любого другого. Вам просто нужно использовать такие инструменты, как SelectorGadget, чтобы увидеть, какие элементы содержат то, что вам нужно. В этом случае это просто p.

all_ppl_urls[1] %>%
  read_html() %>%
  html_nodes("p") %>%
  html_text()

Вывод будет

[1] "AKA Lee William Aaker"
[2] "Born: 25-Sep-1943Birthplace: Los Angeles, CA"
[3] "Gender: MaleRace or Ethnicity: WhiteOccupation: Actor"
[4] "Nationality: United StatesExecutive summary: The Adventures of Rin Tin Tin"
...

Несмотря на то, что выходные данные не чистые, при веб-копировании вещи редко бывают, на самом деле это относительно проще. Вы можете использовать серии grepl и map для подмножества содержимого, которое вам нужно, и сделать из него фрейм данных.

...