2011-11-27 3 views
7

Ho una lista di circa 200.000 indirizzi IP. Vorrei collegarli alla posizione geografica e ottenere qualsiasi altro dato che un indirizzo IP può fornire.Pacchetto R per codice postale e altri dati geografici da indirizzi IP?

Il migliore che ho trovato finora è un servizio fornito da Infochimps: http://www.infochimps.com/datasets/digital-element-ip-intelligence-demographics C'è anche un pacchetto R per Infochimps. Ma infochimps richiede di pagare e per 200.000 indirizzi IP questo potrebbe diventare costoso.

C'è qualche pacchetto R che può fare qualcosa di simile?

Grazie

risposta

6

provare a utilizzare il pacchetto di RDSTK, che fornisce un'interfaccia R alle API Data Science Toolkit. Ecco un presentation dall'autore del pacchetto, che dovrebbe aiutarti a iniziare.

Dai commenti di Xu Wang (trasferito qui per aumentare la futura reperibilità): A titolo di riferimento: per installare il pacchetto, si deve installare RCurl e rjson. Prima di installare RCurl, su Ubuntu ho dovuto installare due pacchetti: sudo apt-get install curl libcurl4-gnutls-dev La funzione che mi serviva era ip2coordinates, che accetta un indirizzo IP come input

+2

grazie, questo sembra funzionare alla grande. Per riferimento: Per installare quel pacchetto, è necessario installare 'RCurl' e' rjson'. Prima di installare 'RCurl', su Ubuntu ho dovuto installare due pacchetti: ' sudo apt-get install curl libcurl4-gnutls-dev' La funzione di cui avevo bisogno era 'ip2coordinates', che accetta un indirizzo IP come input –

2

La funzione IPtoXY (http://thebiobucket.blogspot.com/2011/12/function-to-collect-geographic.html) utilizza la stessa API, ma non ha bisogno di pacchetti aggiuntivi. .

Modifica, 26 settembre: Grazie a @Peter MI resi conto che la mia funzione di cui sopra non funzionava più - qui è la versione modificata che dovrebbe funzionare (anche il link qui sopra è stato aggiornato ..):

# Purpose: Get geographic coordinates for a given IP-address 
# Author: Kay Cichini 
# Date: 2011-12-18 
# Output: A string holding longitude and latitude with format "X;Y" 

IPtoXY <- function(x) { 
    URL_IP <- paste("http://www.datasciencetoolkit.org//ip2coordinates/", 
        x, sep = "") 

    api_return <- readLines(URL_IP, warn = F) 
    lon1 <- api_return[grep("longitude", api_return)] 
    lon <- gsub("[^[:digit:].]", "", lon1) 
    lat1 <- api_return[grep("latitude", api_return)] 
    lat <- gsub("[^[:digit:].]", "", lat1) 
    return(paste(lat, lon, sep = ";")) 
} 

# Example: 
> IPtoXY("74.88.200.52") 
[1] "40.951301574707;73.78759765625" 
1

La funzione da: http://thebiobucket.blogspot.com/2011/12/function-to-collect-geographic.html, non funziona.

Ma l'idea fa ancora, quindi questo dovrebbe fare:

iplocation <- function(ip=""){ 
    response <- readLines(paste("http://www.datasciencetoolkit.org//ip2coordinates/",ip,sep="")) 
    success  <- !any(grepl("null",response)) 

    ip <- grep("[[:digit:]]*\\.[[:digit:]]*\\.[[:digit:]]*\\.[[:digit:]]*",response,value=T) 
    match <- regexpr("[[:digit:]]*\\.[[:digit:]]*\\.[[:digit:]]*\\.[[:digit:]]*",ip) 
    ip <- substr(ip,match,as.integer(attributes(match)[1])+match-1) 
    if(success==T){ 
    extract <- function(label,response){ 
      text <- grep(label,response,value=T) 
      match <- regexpr(paste('"',label,'"',": ",sep=""),text) 
      text <- substr(text,match+as.integer(attributes(match)[1]),nchar(text)) 
      if(grepl("[[:digit:]]",text)){ 
        text <- substr(text,1,nchar(text)-2) 
      }else{ 
        text <- substr(text,2,nchar(text)-2) 
       } 
      if(regexpr('"',text)!= -1){ 
       text<-substr(text,2,nchar(text)) 
      } 
      print(text) 
      text 
     } 
    } 
    RESULT <- list() 
    RESULT$success  <- success 
    RESULT$ip   <- ip 
    if(success==T){ 
    RESULT$latitude <- as.numeric(extract("latitude",response)) 
    RESULT$longitude <- as.numeric(extract("longitude",response)) 
    RESULT$country  <- extract("country_name",response) 
    RESULT$locality <- extract("locality",response) 
    RESULT$postalcode <- extract("postal_code",response) 
    RESULT$region  <- extract("region",response) 
    RESULT$countrycode <- extract("country_code3",response) 
    } 
    RESULT 
} 

iplocation() 
+0

Peter M, grazie per aver puntato il mio sull'errore .. – Kay

1

ho recentemente imbattuto ipinfo.io per la ricerca di indirizzi IP. Ho appena usato biblioteca RCurl per gestire questi:

R> library(RCurl) 
R> getURL("http://ipinfo.io/74.125.227.224") 
[1] "{\n \"ip\": \"74.125.227.224\",\n \"hostname\": \"dfw06s38-in-f0.1e100.net\",\n \"city\": \"Mountain View\",\n \"region\": \"California\",\n \"country\": \"US\",\n \"loc\": \"37.4192,-122.0574\",\n \"org\": \"AS15169 Google Inc.\",\n \"postal\": \"94043\"\n}" 

Le richieste possono essere modificati se interessati a codice appena postale per esempio:

R> getURL("http://ipinfo.io/74.125.227.224/postal") 
[1] "94043\n" 
Problemi correlati