在做用户画像中有关用户的地域分布时,我从数据库里捞取了一堆活跃用户的IP地址,将近30万个左右;问了一圈也没发现谁有IP地址信息库,百度后发现可供使用的第三方接口很多,比如Sina、搜狐、淘宝等等;这里我选择Sina IP接口。
<p>Sina IP接口信息:</p>
<p><code>查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=IP地址.</code></p>
<p><code>返回信息: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"};</code></p>
<p>返回数据格式:(json格式的)国家 、省(自治区或直辖市)、市(县)、运营商;比如:</p>
<p><code>{"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"}}</code></p>
我的原始IP数据示例如下图:
R代码实现如下:
<pre><code>###ip批量查询
<p>#设置文件目录
setwd("A:\\数据分析师的成长\\zfancy.R")
library(RCurl) #调用getURL()函数<p>
<p>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",
<p>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))#汇总结果
}
<p>#定义结果输出列表
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))
<p>##此处一定要注意添加stringsAsFactors=F,不然ip带不出来
Sys.sleep(1.35) #每次循环休眠1.35s,防止连接中断
setTxtProgressBar(pb,i)
}
<p>#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)
<p>#导出数据
setwd("A:\\数据分析\\匹配结果")
write.csv(result,"ip.CSV")
</pre></code>
"匹配结果.csv"的局部如下:
总结:30万的数据匹配下来总计耗时15h左右;for循环的执行效率实在是慢啊;希望能帮助到有需要的人;也恳请路过高人指点一二//