当前位置: 首页 > 科技观察

简单构建适合风控系统的IP库

时间:2023-03-20 18:04:20 科技观察

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