#r #dataset #data-science
#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 amp; 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. От freegeoip : по умолчанию разрешено до 10 000 запросов в час. Как только это ограничение будет достигнуто, все ваши запросы будут приводить к HTTP 403, запрещенному, пока ваша квота не будет очищена … Так что не торопитесь
2. Вы можете использовать диапазоны IP-адресов для каждой страны с этого сайта , чтобы сузить количество запросов
3. Просто используйте
rgeolocate
и бесплатную базу данных стран maxmind GeoIP 2. И, серьезно, посмотрите наpurrr
vsfor
цикл.
Ответ №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")