Почему моя функция создает дубликаты? - PullRequest
0 голосов
/ 10 мая 2018

Я написал функцию, которая перебирает URL-адреса и удаляет нужные мне данные с каждой страницы.

library(xml2)
library(rvest)

Ниже приведен вектор соответствующих URL:

tripadvisor_urls <- c()

for (n in seq(0, 80, 10)) {
    url <- paste('https://www.tripadvisor.co.uk/Attraction_Review-g186306-d9756771-Reviews-or',n,
           '-Suckerpunch_St_Albans-St_Albans_Hertfordshire_England.html', sep = "")
    tripadvisor_urls <- c(tripadvisor_urls, url)
    }

И вот эта функция, которую я написал:

all_pages <- function(x) {
id_v <- c()
rating_v <- c()
headline_quote_v <- c()
date_v <- c()
review_v <- c()
for (url in x) {
        reviews <- url %>%
          read_html() %>%
          html_nodes("#REVIEWS .innerBubble")

        id <- reviews %>%
          html_node(".quote a") %>%
          html_attr("id")
        id_v <- c(id_v, id)

        headline_quote <- reviews %>%
          html_node(".quote span") %>%
          html_text()
        headline_quote_v <- c(headline_quote_v, headline_quote)

        rating_wrong <- url %>%
          read_html() %>%
          html_nodes("#REVIEWS .ui_bubble_rating") %>%
          as.character() %>%
          substr(38,39) %>%
          as.numeric()
        rating <- rating_wrong/10
        rating_v <- c(rating_v, rating)

        date <- reviews %>%
          html_node(".rating .ratingDate") %>%
          html_attr("title") %>%
          as.Date('%d %B %Y')
        date_v <- c(date_v, date)

        review <- reviews %>%
          html_node(".entry .partial_entry") %>%
          html_text()
        review_v <- c(review_v, review)
    }
tripadvisor <<- data.frame(id_v, headline_quote_v, rating_v, date_v, review_v)
}

all_pages(tripadvisor_urls)

Когда я смотрю насгенерированный фрейм данных, я вижу, что есть дубликаты:

duplicated(tripadvisor)

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

ПРИМЕЧАНИЕ. Я запросил разрешение у TripAdvisor, поэтому не нарушаю их условия обслуживания.

1 Ответ

0 голосов
/ 10 мая 2018

Кажется, это происходит, потому что вы читаете с URL дважды.Если вы удалите код, который создает rating_list и последующие ссылки на него, вы получите 82 записи в tripadvisor фрейме данных.

Если вы запустите это на своем объекте, вы получите:

which( tripadvisor$id_list %in% "rn576426120")
#[1] 1 83

Если вы последуете моему предложению, вы получите только 1.Вы можете дополнительно подтвердить эту теорию и, возможно, увидеть, где происходит дублирование, вставив эту строку отладки вне цикла:

; lapply( list(id_list, headline_quote_list, date_list, rating_list, review_list), function(x) print(length(x)))

Вызов allpages() теперь производит:

> all_pages(tripadvisor_urls)
[1] 82
[1] 82
[1] 82
[1] 164
[1] 82
...