Р: Как я могу открыть список ссылок, чтобы очистить домашнюю страницу новостного сайта? - PullRequest
1 голос
/ 13 марта 2020

Я пытаюсь создать веб-скребок для отбрасывания статей, опубликованных на новостном веб-сайте www.20min.ch, с R. Их API-интерфейсы открыты для общего доступа, поэтому я мог бы создать фрейм данных, содержащий заголовки, URL-адреса, описания и временные метки с помощью rvest , Следующим шагом будет доступ к каждой отдельной ссылке, создание списка текстов статей и объединение его с моим фреймом данных. Однако я не знаю, как автоматизировать доступ к этим статьям. В идеале я хотел бы прочитать_1013 * ссылку 1, затем скопировать текст с узлом html и затем перейти к ссылке 2 ...

Это то, что я написал до сих пор:

site20min <- read_xml("https://api.20min.ch/rss/view/1")

site20min

url_list <- site20min %>% html_nodes('link') %>% html_text()

df20min <- data.frame(Title = character(),
                      Zeit = character(),
                      Lead = character(),
                      Text = character()
                      )

 for(i in 1:length(url_list)){
      myLink <- url_list[i]
      site20min <- read_html(myLink)

      titel20min <- site20min %>% html_nodes('h1 span') %>% html_text()
      zeit20min <- site20min %>% html_nodes('#story_content .clearfix span') %>% html_text()
      lead20min <- site20min %>% html_nodes('#story_content h3') %>% html_text()
      text20min <- site20min %>% html_nodes('.story_text') %>% html_text()  

      df20min_a <- data.frame(Title = titel20min)
      df20min_b <- data.frame(Zeit = zeit20min)
      df20min_c <- data.frame(Lead = lead20min)
      df20min_d <- data.frame(Text = text20min)
              }

Мне нужен R, чтобы открывать каждую ссылку и извлекать некоторую информацию:

site20min_1 <- read_html("https://www.20min.ch/schweiz/news/story/-Es-liegen-auch-Junge-auf-der-Intensivstation--14630453")

  titel20min_1 <- site20min_1 %>% html_nodes('h1 span') %>% html_text()
  zeit20min_1 <- site20min_1 %>% html_nodes('#story_content .clearfix span') %>% html_text()
  lead20min_1 <- site20min_1 %>% html_nodes('#story_content h3') %>% html_text()
  text20min_1 <- site20min_1 %>% html_nodes('.story_text') %>% html_text()

Не должно быть большой проблемой привязать это к фрейму данных. но на данный момент некоторые из моих результатов оказываются пустыми.

спасибо за вашу помощь!

1 Ответ

0 голосов
/ 13 марта 2020

Вы на правильном пути с настройкой кадра данных. Вы можете l oop пройти по каждой ссылке и rbind перевести ее в существующую структуру фрейма данных.

Во-первых, вы можете задать вектор URL, который будет проходить по циклу. Основываясь на редактировании, вот такой вектор:

url_list <- c("http://www.20min.ch/ausland/news/story/14618481",
              "http://www.20min.ch/schweiz/news/story/18901454",
              "http://www.20min.ch/finance/news/story/21796077",
              "http://www.20min.ch/schweiz/news/story/25363072",
              "http://www.20min.ch/schweiz/news/story/19113494",
              "http://www.20min.ch/community/social_promo/story/20407354",
              "https://cp.20min.ch/de/stories/635-stressfrei-durch-den-verkehr-so-sieht-der-alltag-von-busfahrer-claudio-aus")

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

# Set up the dataframe first
df20min <- data.frame(Title = character(),
                      Link = character(),
                      Lead = character(),
                      Zeit = character())

Наконец, вы можно l oop через каждый URL в вашем списке и добавить соответствующую информацию в ваш фрейм данных.

# Go through a loop
for(i in 1:length(url_list)){
  myLink <- url_list[i]
  site20min <- read_xml(myLink)

  # Extract the info
  titel20min <- site20min %>% html_nodes('title') %>% html_text()
  link20min <- site20min %>% html_nodes('link') %>% html_text() 
  zeit20min <- site20min %>% html_nodes('pubDate') %>% html_text()
  lead20min <- site20min %>% html_nodes('description') %>% html_text()

  # Structure into dataframe
  df20min_a <- data.frame(Title = titel20min, Link =link20min, Lead = lead20min)
  df20min_b <- df20min_a [-(1:2),]
  df20min_c <- data.frame(Zeit = zeit20min)

  # Insert into final dataframe
  df20min <- rbind(df20min, cbind(df20min_b,df20min_c))
}
...