Как генерировать названия стран для большого списка IP-адресов с помощью R?


У меня есть набор данных, который содержит 1 столбец, но огромное количество строк. Колонка содержит огромное количество публичных IP-адресов. Таким образом, его можно получить геолокацию от этих IP-адресов, используя сайты, такие как (http://freegeoip.net). я хочу сгенерировать столбец названий стран, содержащий названия стран для каждого IP-адреса строк. Вот мой наивный подход -

library(XML)

#Import your list of IPs
ip.addresses <- read.csv("ip-address.csv")

#This is my API
api.url <- "http://freegeoip.net/xml/"

#Appending API URL before each of the IPs
api.with.ip <- paste(api.url, ip.addresses$IP.Addresses ,sep="")

#Creating an empty vector for collecting the country names
country.vec <- c()

#Running a for loop to parse country name for each IP
for(i in api.with.ip)
{
    #Using xmlParse & xmlToList to extract IP information
    data <- xmlParse(i)
    xml.data <- xmlToList(data)

    #Selecting only Country Name by using xml.data$CountryName
    #If Country Name is NULL then putting NA
    if(is.null(xml.data$CountryName)){
      country.vec <- c(country.vec, NA)
    }
    else{
      country.vec <- c(country.vec, xml.data$CountryName)
    }
}

#Combining IPs with its corresponding country names into a dataframe
result <- data.frame(ip.addresses,country.vec)
colnames(result) <- c("IP Address", "Country")

#Exporting the dataframe as csv file
write.csv(result, "IP_to_Location.csv")

Но поскольку у меня огромное количество строк, мой подход с использованием цикла for очень медленный. Как этот процесс может быть быстрее?

1 2

1 ответ:

Наконец-то решили эту проблему гораздо быстрее с помощью rgeolocate и mmdb.

library(rgeolocate)

setwd("/home/imran/Documents/")

ipdf <- read.csv("IP_Address.csv")
ipmmdb <- system.file("extdata","GeoLite2-Country.mmdb", package = "rgeolocate")
results <- maxmind(ipdf$IP.Address, ipmmdb,"country_name")

export.results <- data.frame(ipdf$IP.Address, results$country_name)
colnames(export.results) <- c("IP Address", "Country")

write.csv(export.results, "IP_to_Locationmmdb.csv")