Webscraping в R: как бороться с перенаправлениями? - PullRequest
1 голос
/ 14 апреля 2020

За последние недели я создал веб-браузер для нескольких новостных сайтов в Швейцарии. Большинство из них работают, но одна страница дает мне много перенаправлений, и я не знаю, что делать.

Это мой код:

library(rvest)
library(tidyverse)
library(dplyr)
api20min<- read_xml('https://api.20min.ch/rss/view/1')
urls_20min <- api20min %>% html_nodes('link') %>% html_text()
urls_20min <- urls_20min[-c(1:2)]
zeit_20min <- api20min %>% html_nodes('pubDate') %>% html_text()
titel_20min <- api20min %>% html_nodes('title') %>% html_text()
titel_20min <- titel_20min[-c(1:2)]
df20min_titel_zeit_link <- data.frame(urls_20min,zeit_20min,titel_20min)
df20min_text <- do.call(rbind, lapply(urls_20min, function(x) {
  paste0(read_html(x) %>% html_nodes('.story_text p') %>% html_text(), collapse = "\n\n")
}))
df_20min <- data.frame(df20min_titel_zeit_link,df20min_text)

Если я запускаю тот же код на других страницах, он работает отлично. На самом деле, я написал это на прошлой неделе, а потом все еще работало. Но теперь R говорит мне:

"Fehler в open.connection (x," rb "): максимум (10) перенаправлений следуют"

Так как я могу go вокруг этих перенаправлений?

Спасибо за помощь, ребята, вы великолепны!

1 Ответ

1 голос
/ 14 апреля 2020

Если вы преобразуете свою сумму в al oop, вы обнаружите, что именно URL в позиции 23 в urls_20min вызывает проблему. Это рекламная ссылка, отсюда и перенаправления. Вы можете просто grepl выводить любые URL-адреса с "промо", и это прекрасно работает:

library(rvest)
library(tidyverse)
library(dplyr)

api20min    <- read_xml('https://api.20min.ch/rss/view/1')
urls_20min  <- api20min %>% html_nodes('link') %>% html_text()
urls_20min  <- urls_20min[-c(1:2)]
no_promo    <- !grepl("promo", urls_20min)
zeit_20min  <- api20min %>% html_nodes('pubDate') %>% html_text()
titel_20min <- api20min %>% html_nodes('title') %>% html_text()
titel_20min <- titel_20min[-c(1:2)]

df20min_titel_zeit_link <- data.frame(urls_20min,zeit_20min,titel_20min)[no_promo,]

df20min_text <- do.call(rbind, 
                        lapply(urls_20min[no_promo], 
                               function(x) {
                                 paste0(read_html(x) %>% 
                                          html_nodes('.story_text p') %>% 
                                          html_text(), 
                                        collapse = "\n\n")}))

df_20min <- data.frame(df20min_titel_zeit_link, df20min_text)

Результат слишком велик, чтобы показать, но вот его структура:

str(df_20min)
#> 'data.frame':    111 obs. of  4 variables:
#>  $ urls_20min  : Factor w/ 112 levels "https://beta.20min.ch/story/269082903107?legacy=true",..: 44 78 93 49 81 76 91 70 95 4 ...
#>  $ zeit_20min  : Factor w/ 111 levels "Fri, 10 Apr 2020 03:00:00 GMT",..: 98 89 61 90 105 99 109 84 82 83 ...
#>  $ titel_20min : Factor w/ 112 levels "  : Die Bilder des Tages",..: 44 48 55 76 16 20 6 17 112 63 ...
#>  $ df20min_text: Factor w/ 87 levels "","\n\n","\n\n(20 Minuten)",..: 62 44 48 71 64 43 83 39 30 1 ...
...