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

作者: 洞点咨询 | 来源:发表于2016-03-21 14:35 被阅读1330次

    在做用户画像中有关用户的地域分布时,我从数据库里捞取了一堆活跃用户的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数据示例如下图:

    ip数据清单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循环的执行效率实在是慢啊;希望能帮助到有需要的人;也恳请路过高人指点一二//

    相关文章

      网友评论

        本文标题:教你用R语言来批量查询IP地址

        本文链接:https://www.haomeiwen.com/subject/eddqlttx.html