RVest: выскабливание текста сайта с ограниченным доступом - PullRequest
1 голос
/ 08 февраля 2020

В настоящее время я создаю сайт новостей, используя rvest. Скребок работает, но на новостном сайте я получил ограниченный доступ к эксклюзивным статьям, перечисленным там. Следовательно, мне нужен рабочий l oop, который не останавливается при столкновении со случаем недоступности определенных селекторов.

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

library(rvest)
sz_webp <- read_html ("https://www.sueddeutsche.de/news?search=Corona&sort=date&all%5B%5D=dep&all%5B%5D=typ&all%5B%5D=sys&all%5B%5D=time")

# TITLE

title <- sz_webp %>% 
  html_nodes("a em") %>%   
  html_text()

df <- data.frame(title)

# TIME

time <- sz_webp %>% 
  html_nodes("div time") %>%   
  html_text() 

df$time <- time

url <- sz_webp %>% 
  html_nodes("a") %>% html_attr('href')

url <- url[which(regexpr('https://www.sueddeutsche.de/', url) >= 1)]
N <- 58
n_url <- tail(url, -N)

n_url <- head(n_url,-17)

View(n_url)

df$url <- n_url

# LOOP THAT DOESNT WORK (not the right selector and it cancels when facing the problem)

results_df <- lapply(n_url, function(u) { 
  message(u) 

  aktuellerlink <- read_html(u) # liest die jeweilige URL ein

  text <- aktuellerlink %>% # liest das Baujahr aus
    html_nodes("div p") %>%
    html_text()

  } %>%

bind_rows()
)
df$text <- results_df

View(df)

Большое спасибо заранее.

1 Ответ

2 голосов
/ 08 февраля 2020

Я не знаком с веб-сайтом. Я тоже не умею читать по-немецки. Насколько я вижу ваш код, вы пытаетесь очистить заголовки, время и URL с помощью sz_webp. Затем для каждого URL вы пытаетесь очистить тексты. Я думаю, что вы можете улучшить свой код, сосредоточившись на указанных c частях в ссылке. Если вы посмотрите на исходную страницу, вы можете определить местоположение. У вас есть определенные c позиции, которые нужно очистить.

livrary(rvest)
library(tidyverse)

map_dfc(.x = c("em.entrylist__title", "time.entrylist__time"),
        .f = function(x) {read_html("https://www.sueddeutsche.de/news?search=Corona&sort=date&all%5B%5D=dep&all%5B%5D=typ&all%5B%5D=sys&all%5B%5D=time") %>% 
                          html_nodes(x) %>% 
                          html_text()}) %>% 
bind_cols(url = read_html("https://www.sueddeutsche.de/news?search=Corona&sort=date&all%5B%5D=dep&all%5B%5D=typ&all%5B%5D=sys&all%5B%5D=time") %>% 
                html_nodes("a.entrylist__link") %>% 
                html_attr("href")) %>% 
setNames(nm = c("title", "time", "url")) -> temp

temp выглядит следующим образом. Если хочешь, тебе нужно убрать time. Это все еще грязно.

   title                                       time              url                                                                  
   <chr>                                       <chr>             <chr>                                                                
 1 "Immer mehr Corona-Infektionen in China"    "\n    13:23\n"   https://www.sueddeutsche.de/politik/immer-mehr-corona-infektionen-in~
 2 "US-Amerikaner an Corona-Virus gestorben"   "\n    08:59\n"   https://www.sueddeutsche.de/panorama/virus-infektion-us-amerikaner-a~
 3 "Frau eines weiteren Webasto-Mitarbeiters ~ "\n    07.02.202~ https://www.sueddeutsche.de/bayern/coronavirus-bayern-newsblog-muenc~
 4 "Digitale Revolte"                          "\n    07.02.202~ https://www.sueddeutsche.de/politik/china-digitale-revolte-1.4788941 
 5 "Nachrichten kompakt - die Übersicht für E~ "\n    07.02.202~ https://www.sueddeutsche.de/politik/nachrichten-thueringen-kemmerich~
 6 "\"Ich würde mir wünschen, dass die Mensch~ "\n    07.02.202~ https://www.sueddeutsche.de/wirtschaft/webasto-coronavirus-bayern-in~
 7 "Deutschland will weitere Bürger zurückhol~ "\n    07.02.202~ https://www.sueddeutsche.de/politik/coronavirus-deutschland-will-wei~
 8 "Peking wird wegenzur \"Geisterstadt\""     "\n    07.02.202~ https://www.sueddeutsche.de/panorama/angst-vor-corona-peking-wird-we~
 9 "Was bedeutet die Corona-Epidemie für Chin~ "\n    07.02.202~ https://www.sueddeutsche.de/politik/coronavirus-wuhan-li-wenliang-1.~
10 "Virus des Widerstands"                     "\n    07.02.202~ https://www.sueddeutsche.de/politik/china-coronavirus-arzt-1.4788564 

Затем, для каждого URL, вы хотите очистить тексты. Я не уверен, как работает эта веб-страница. Но я проверил несколько и обнаружил, что каждая ссылка может иметь несколько статей на поверхности. Это правильно? Содержимое остается в div.sz-article__body. Вы должны далее выбрать <p> не имея sz-teaser__summary в классе. Затем вы можете очистить содержимое, которое вы, вероятно, ищете. Здесь я перебрал три ссылки. Первый не предлагает никаких текстов. Может быть, это тот, о котором вы говорите; недоступное содержимое. Я надеюсь, что этого достаточно для дальнейшего прогресса.

map_df(.x = temp$url[1:3],
       .f = function(x){tibble(url = x,
                        text = read_html(x) %>% 
                                html_nodes("div.sz-article__body") %>% 
                                html_nodes("p:not(.sz-teaser__summary)") %>% 
                                html_text() %>% 
                                list
                        )}) %>% 
unnest(text) -> foo

foo

   url                                                        text                                                                    
   <chr>                                                      <chr>                                                                   
 1 https://www.sueddeutsche.de/panorama/virus-infektion-us-a~ "In Wuhan ist ein Amerikaner an einer Corona-Infektion gestorben. Wie d~
 2 https://www.sueddeutsche.de/panorama/virus-infektion-us-a~ "Auch ein Japaner starb nach Einschätzung des Tokioter Außenministerium~
 3 https://www.sueddeutsche.de/panorama/virus-infektion-us-a~ "Bisher sind außerhalb Festland-Chinas zwei Todesfälle infolge einer Co~
 4 https://www.sueddeutsche.de/panorama/virus-infektion-us-a~ "Damit könnte sie in Kürze die weltweit offiziell registrierten 774 Tod~
 5 https://www.sueddeutsche.de/panorama/virus-infektion-us-a~ "Coronavirus"                                                           
 6 https://www.sueddeutsche.de/bayern/coronavirus-bayern-new~ "Freitag, 7. Februar, 19.37 Uhr In Bayern gibt es einen weiteren Corona~
 7 https://www.sueddeutsche.de/bayern/coronavirus-bayern-new~ "Freitag, 7. Februar, 18.19 Uhr: Der Coronavirus-Ausbruch hat den bayer~
 8 https://www.sueddeutsche.de/bayern/coronavirus-bayern-new~ "Freitag, 7. Februar, 15.05 Uhr: Der Verdacht, der bayerische Coronavir~
 9 https://www.sueddeutsche.de/bayern/coronavirus-bayern-new~ "Die bayerischen Fälle gehen alle auf betriebsinterne Schulungen in der~
10 https://www.sueddeutsche.de/bayern/coronavirus-bayern-new~ "Donnerstag, 6. Februar, 13.35 Uhr: In Bayern hat sich eine weitere Fra~
...