2015-07-15 33 views
8

Ho un elenco di circa 13.000 URL da cui estrarre informazioni da, tuttavia, non tutti gli URL esistono effettivamente. In effetti la maggioranza no. Ho appena provato a passare tutti i 13.000 urls tramite html() ma ci vuole molto tempo. Sto cercando di capire come vedere se gli URL esistono realmente prima di analizzarli su html(). Ho provato a utilizzare le funzioni httr e GET() e le funzioni rcurls e url.exists(). Per qualche motivo, url.exist() restituisce sempre i valori FALSE anche quando l'URL esiste, e il modo in cui sto usando GET() restituisce sempre un successo, penso che questo sia dovuto al fatto che la pagina viene reindirizzata.R: Verifica esistenza di url, problemi con httr: GET() e url.exists()

I seguenti URL rappresentano il tipo di pagine che sto parsing, il primo non esiste

urls <- data.frame('site' = 1:3, 'urls' = c('https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-1&unit=SLE010', 
          'https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-2&unit=HMM202', 
          'https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-2&unit=SLE339')) 

urls$urls <- as.character(urls$urls) 

Per GET(), il problema è che la seconda URL in realtà non esiste ma viene reindirizzata e quindi i rendimenti un successo".

urls$urlExists <- sapply(1:length(urls[,1]), 
        function(x) ifelse(http_status(GET(urls[x, 'urls']))[[1]] == "success", 1, 0)) 

Per url.exists(), ottengo tre FALSO tornato, anche se esistono primo e terzo URL.

urls$urlExists2 <- sapply(1:length(urls[,1]), function(x) url.exists(urls[x, 'urls'])) 

ho controllato questi due posti 1, 2 ma io preferirei non usare un UserAgent, semplicemente perché non sono sicuro come trovare mia o se possa cambiare per diverse persone che utilizzano questo codice su altri computer. Pertanto rendere il codice più difficile da raccogliere e utilizzare da altri. Entrambe le risposte ai post suggeriscono di utilizzare GET() in httr. Sembra che il metodo GET() sia probabilmente il metodo preferito, ma avrei bisogno di capire come gestire il problema di reindirizzamento.

Qualcuno può suggerire un buon modo in R per verificare l'esistenza di un URL prima di analizzarli su html()? Sarei anche felice per qualsiasi altro lavoro suggerito in giro per questo problema.

UPDATE:

Dopo esaminando il valore restituito da GET() ho capito un lavoro in giro, vedere le risposte per i dettagli.

+2

hai un problema concettuale qui. Con molti server Web, se provi ad accedere a una pagina che non esiste, otterrai comunque una pagina! Quello che vuoi veramente fare è verificare il ritorno di un errore 404. –

+1

Grazie a Tim, il tuo commento mi ha aiutato a capire cosa stavo tornando dalla funzione 'GET()'. Penso di aver capito un lavoro. L'ho aggiunto in fondo alla domanda. – Adam

risposta

2

Dopo un suggerimento da @TimBiegeleisen ho guardato ciò che è stato restituito dalla funzione GET(). Sembra che se l'url esiste GET() restituirà questo URL come valore, ma se viene reindirizzato viene restituito un URL diverso. Ho appena modificato il codice per verificare se l'URL restituito da GET() corrisponde a quello che ho inviato.

urls$urlExists <- sapply(1:length(urls[,1]), function(x) ifelse(GET(urls[x, 'urls'])[[1]] == urls[x,'urls'], 1, 0)) 

Sarei interessato a conoscere i metodi migliori che le persone utilizzano per la stessa cosa.

13

Con HTTR, utilizzare url_success() e reindirizzare segue spento:

library(httr) 

urls <- c(
    'https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-1&unit=SLE010', 
    'https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-2&unit=HMM202', 
    'https://www.deakin.edu.au/current-students/unitguides/UnitGuide.php?year=2015&semester=TRI-2&unit=SLE339' 
) 

sapply(urls, url_success, config(followlocation = 0L), USE.NAMES = FALSE) 
+2

Basta lasciare una nota da quando mi sono imbattuto nello stesso problema.Con la versione attuale (1.2.1), usiamo 'http_error' invece di' url_success'. – jazzurro