R пакет для почтового индекса и других геоданных с IP-адресов? - PullRequest
8 голосов
/ 27 ноября 2011

У меня есть список около 200 000 IP-адресов. Я хотел бы связать их с географическим местоположением и получить любые другие данные, которые также может дать IP-адрес.

Лучшее, что я нашел, - это сервис, предоставляемый infochimps: http://www.infochimps.com/datasets/digital-element-ip-intelligence-demographics Есть также пакет R для infochimps. Но infochimps требует от вас оплаты, и за 200 000 IP-адресов это может дорого обойтись.

Есть ли пакет R, который может сделать что-то подобное?

Спасибо

Ответы [ 4 ]

6 голосов
/ 27 ноября 2011

Попробуйте использовать пакет RDSTK, который предоставляет интерфейс R для API Data Science Toolkit.Вот презентация от автора пакета, которая должна помочь вам начать работу.

Из комментариев Сюй Вана (перенесено сюда, чтобы увеличить возможность поиска в будущем): Для справочных целей: Чтобы установить этот пакет, необходимо установить RCurl и rjson.Перед установкой RCurl в Ubuntu мне пришлось установить два пакета: sudo apt-get install curl libcurl4-gnutls-dev Мне нужна была функция ip2coordinates, которая принимает IP-адрес в качестве ввода

2 голосов
/ 19 декабря 2011

Функция IPtoXY (http://thebiobucket.blogspot.com/2011/12/function-to-collect-geographic.html) использует тот же API, но не требует дополнительных пакетов ..

Редактировать, 26 сентября : Благодаря @Peter M я узнал, что моя функция, упомянутая выше, больше не работает - вот отредактированная версия, которая должна работать (также была обновлена ​​ссылка выше):

# 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 голос
/ 01 ноября 2014

Недавно я наткнулся на ipinfo.io для поиска IP-адресов. Я просто использовал библиотеку RCurl для обработки этих данных:

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}"

Запросы могут быть изменены, если интересует только почтовый индекс, например:

R> getURL("http://ipinfo.io/74.125.227.224/postal")
[1] "94043\n"
1 голос
/ 26 сентября 2012

Функция из: http://thebiobucket.blogspot.com/2011/12/function-to-collect-geographic.html, не работает.

Но идея все еще имеет место, так что это должно сделать:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...