簡體   English   中英

R 中的網頁抓取:如何處理重定向?

[英]Webscraping in R: How to deal with redirects?

在過去的幾周里,我為瑞士的幾個新聞網站建立了一個網絡爬蟲。 他們中的大多數都可以工作,但是一頁給了我很多重定向,我不知道該怎么做。

這是我的代碼:

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 告訴我:

“open.connection(x,“rb”)中的 Fehler:最多(10)個重定向跟隨“

那么我怎樣才能圍繞這些重定向進行 go 呢?

謝謝你們的幫助,你們太棒了!

如果將 lapply 轉換為循環,您會發現是 urls_20min 中 position 23 處的urls_20min導致了問題。 這是一個促銷鏈接,因此是重定向。 您可以簡單地找出任何帶有“ grepl ”的網址,它工作得很好:

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 ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM