IP作为一种识别和定位用户的手段,对于互联网企业尤其是精准营销、反欺诈等业务有着至关重要的作用。本文介绍如何简单地构建自己的ip地址库。其实对于大部分用户来说,如果要求不高,可以使用现成的资源:老外的数据有maxmind,但是对于国内一些水土不服BAT水平的公司,有openapi支持,但是没有国内也有优秀的第三方提供商提供离线图书馆,比如ipip.net。他们提供免费的离线图书馆以及付费服务。是国内比较专业的ip信息服务商,还有一篇描述来龙去脉的优质ip库建设文章。一般使用,建议直接使用这个库。但是对于我们这样的风控公司来说,现成的资源有以下不足:1.需要离线数据库。我们的产品是提供一个私有化的大数据风控平台。由于涉及的信息比较敏感,需要与外部网络进行隔离,以保证数据的隐私和安全。API方法不合适。2.数据库需要定期更新。IP地址变化频繁,要求来源准确度高,更新频繁。经评估,现有第三方提供商在数据覆盖和准确性方面仍存在不足。3.需要标准化的数据。我们需要手机、身份证、IP等多个维度的归属位置,但数据来源多种多样。比如在很多场合,这种数据不一致是可以的,但是我们的风控引擎会用它来进行比对计算。导致大量的计算偏差,造成误报。有的显示“南京”,有的显示“南京市”,有的显示县级市,有的显示地级市,有的城市改名了,有的显示旧名,有的显示新名,有的准确到市,有的精确到区...4.有一些优秀的数据源,提供精确到区的数据,但我们不需要使用它们。ip的分配是多变的,运营商的分配顶多是市级的,所以区县级的数据准确性会非常有挑战性,会影响使用风控。建议先丢弃它。5.对于非主动获取的第三方数据,习惯性不信任,需要评估和重新验证,贸然使用会产生不良后果。因此,我们做了一些工作,建立了自己的ip库,方便我们风控系统的使用。本文的其余部分将描述我们的总体思路(具体实现将以简要的方式说明)。作为一个非专业的公司,不可能像ipip.net那样花费大量精力进行网络检测和分析。最方便的方式就是爬取网上资源。这里举一个简单的例子,以局域网内最大的搜索引擎公司为数据源。写一个单行爬虫:seq02564294967296|awk'{printrshift(and($1,0xFF000000),24)"."rshift(and($1,0x00FF0000),16)"."rshift(and($1,0x0000FF00),8)"."和($1,0x0)}'|xargs-n1-P100-I{}curl-s"https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query={}&co=&resource_id=6006&t=1476339401938&ie=utf8&oe=gbk&cb=op_aladdin_callback&format=json&=baidu&cb=jQuery110206188213690050863_1476338807087&_=1476338807111"-w"\n"|iconv-f"gbk"-t"utf-8"|awk-F\"'{print$26","$18}'>ip.result整个命令是通过shell管道实现的,包括:1.生成一个ipC段地址列表,用seq生成对应的数字2.将数字转换为ip字符String形式,通过awk转换3.使用curl向度娘发起请求,在度娘页面请求后可以直接获取请求地址,然后查看网络后台。有这里没有截图说明请求比较简单,只是换一个ip作为参数,直接xargs没有下限,可以比较暴力,所以通过xargs的多进程特性,启用multi-process支持(这里设置为100),转成utf8直接输出原始ip和结果,直接awk可以是4.etc这个简单的爬虫效率不高,需要执行256256256=16777216访问,因此需要1天以上的时间才能完成。直接扔到服务器上,让他慢慢跑。ip库搭建1.去重处理原始数据拿来后,需要进行整理。首先,需要去除重复信息,例如原始数据。不用,一行命令去重catip.result|sed-e's/,/./'|排序-n-t。-k1,1-k2,2-k3,3-k4,4|awk-F。'{打印$1"."$2"."$3"."$4","$5}'|awk-F,'last!=$2{last=$2;print}'解释:首先,按ip排序。由于之前有多个并发操作,结果数据会乱序,不利于awk的去重和使用。仅输出具有相同属性的相邻行的第一行。相邻的两条线路有不同的地址2.地理标准化这涉及到我们建立地址数据库的初衷。因为有些数据源在地理位置上并不统一,比如有的显示市,有的显示区,有的显示县级。城市和地级市傻傻分不清楚。因此,有必要对所有归因进行归一化。整个过程略显复杂。我们使用算法自动生成并修正下面的映射表,然后使用归一化算法得到一个统一的地址。整个过程有点复杂,需要自动构建映射表数据进行标定,这里不再赘述。山东:名称:山东省城市:济南:名称:济南市章丘:名称:济南市青岛:名称:青岛市即墨:名称:青岛市平度:名称:青岛市胶南:名称:青岛市名称:淄博,青岛:名称:淄博市??枣庄:名称:枣庄市滕州市:名称:枣庄市东营市:东营市烟台:名称:烟台市龙口市:名称:烟台市莱阳市蓬莱市:名称:烟台市3.最终数据生成后由ip库,需要最后打包。一种最简单的方法就是直接把上面的数据作为最终的数据,然后用到的时候读进去,塞进一个treemap中。但是这种方法效率比较低,而且生成的包比较大,影响了使用地理图书馆的应用。我们采用了另一种方法,将ipip.net的数据格式倒过来,用这种格式来打印我们自己的数据包。这里有几个优点:数据格式比较精简,可以大大减小最终中奖数据包的大小。由于用户比较多,网上有多语言的客户端,方便参考(但实际使用需要重新优化,网上和官方库的效率还是比较低;如果你想要用的话,尽量用官方的库,有些网友的库不对)因为我们会把数据分享给一些好的客户,所以我们采用标准格式,他们只需要替换数据文件就可以建一个production级ip库。以上描述了搭建的大致流程,核心部分限于篇幅采用简单的方式进行说明,如果要做生产级,需要注意以下几个方面:1.更好的原始数据获取百度的数据来源不是最好的。需要一个更健壮和复杂的爬虫系统。简单的bash脚本本质上仍然是玩具。用于演示,大部分时间只关心国内数据。您可以使用现有的ASN数据来识别国家并减少数据爬取的规模。网上也有国内的ip段划分。c段地址有点粗糙,不是很准确,爬取效率低,需要更聪明的爬取策略2.持续采集数据,自动标库和ip库构建。由于ip数据变化频率高,只有持续更新才能保证更好的准确性。3、统一ip、手机、身份证、wifi地址等数据,做一个统一的地理信息数据库。单一维度的信息只能用于展示。如果有很强的计算需求,统一数据库反爬虫文章来源:http://bigsec.com/
