教你用R语言来批量查询IP地址

在做用户画像中有关用户的地域分布时,我从数据库里捞取了一堆活跃用户的IP地址,将近30万个左右;问了一圈也没发现谁有IP地址信息库,百度后发现可供使用的第三方接口很多,比如Sina、搜狐、淘宝等等;这里我选择Sina IP接口。

Sina IP接口信息:


查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=IP地址.


返回信息:var remote_ip_info = {"ret":1,"start":"114.114.112.0","end":"114.114.119.255","country":"\u4e2d\u56fd","province":"\u6c5f\u82cf","city":"\u5357\u4eac","district":"","isp":"\u7535\u4fe1","type":"","desc":"\u5357\u4eac\u4fe1\u98ce114dns\u4e13\u5c5e"};


返回数据格式:(json格式的)国家 、省(自治区或直辖市)、市(县)、运营商;比如:


{"code":0,"data":{"ip":"210.75.225.254","country":"\u4e2d\u56fd","area":"\u534e\u5317","region":"\u5317\u4eac\u5e02","city":"\u5317\u4eac\u5e02","county":"","isp":"\u7535\u4fe1",
"country_id":"86","area_id":"100000","region_id":"110000","city_id":"110000",
"county_id":"-1","isp_id":"100017"}}


我的原始IP数据示例如下图:

教你用R语言来批量查询IP地址_第1张图片
ip数据清单

R代码实现如下:
###ip批量查询 
 

#设置文件目录

setwd("A:\\数据分析师的成长\\zfancy.R")

library(RCurl) #调用getURL()函数


library(RJSONIO) #调用fromJSON()函数

Sinaurl <- function(ip){

paste("http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=",ip,sep="")} #sinaIP API

Ip_yb <- read.csv("A:\\数据分析\\用户基本画像\\ip数据.csv",

stringsAsFactors = F,header = T) #导入测试样本ip

构造函数fanxi

fanxi <- function(aaa){
AA <- NA;BB <- NA;url <- NA;cou <- NA;pro <- NA;cit <- NA ;

ip <- NA#定义初始值为0

for (i in 1:nrow(aaa)){
AA[i] <- Sinaurl(aaa[i,1]) #接口请求连接

url[i] <- getURL(AA[i]) #接口返回结果

BB[i] <- strsplit(url[i],"=")

BB[i] <- gsub("^ ","",BB[i][[1]][2]) #去掉首行空格

BB[i] <- gsub(";","",BB[i]) #去掉尾部分号

cou[i] <- fromJSON(BB[[i]])[4:6]$country #提取国家

pro[i] <- fromJSON(BB[[i]])[4:6]$province #提取省份

cit[i] <- fromJSON(BB[[i]])[4:6]$city #提取城市

ip[i] <- aaa[i,1]

Sys.sleep(1) #每次循环休眠1s

}

return(data.frame(ip=ip,country=cou,province=pro,city=cit))#汇总结果
}

#定义结果输出列表

MM <- list()

n <- ceiling(nrow(Ip_yb)/100)-1 #将原样本等分,除最后一份外,每份均含100个观测值

pb <- txtProgressBar(min = 0, max = n, style = 3) #设置循环进度条

for (i in 1:n){
MM[[i]] <- fanxi(data.frame(Ip_yb[(100i-99):(100i ),],

stringsAsFactors = F))

##此处一定要注意添加stringsAsFactors=F,不然ip带不出来

Sys.sleep(1.35) #每次循环休眠1.35s,防止连接中断

setTxtProgressBar(pb,i)
}

#MM[[n+1]] <- fanxi(data.frame(Ip_yb[(1000*n+1):nrow(Ip_yb),],
stringsAsFactors = F))#匹配最后一份数据

MM <- fanxi(Ip_yb)

result <- do.call(rbind,MM)

#导出数据

setwd("A:\\数据分析\\匹配结果")

write.csv(result,"ip.CSV")


"匹配结果.csv"的局部如下:

教你用R语言来批量查询IP地址_第2张图片
匹配结果

总结:30万的数据匹配下来总计耗时15h左右;for循环的执行效率实在是慢啊;希望能帮助到有需要的人;也恳请路过高人指点一二//

你可能感兴趣的:(教你用R语言来批量查询IP地址)