恶意URL检测的方法很多,这里介绍通过机器学习分析URL文本分词词频来检测恶意URL。训练的数据集为开源数据集,通过机器学习训练检测模型,然后做了部分工程化的应用,将模型持久化,在应用的时候加载进来直接应用,不用重新进行训练。通过接口调用实现恶意URL检测预测判断。
恶意URL检测,对应与机器学习是个分类问题,这里分别用逻辑回归和SVM支持向量机分类模型进行模型实现。
具体实现过程包括数据载入–>数据处理(分词、向量化处理)–>模型训练–>模型保存–>模型应用
项目组织结构如下:
一、数据载入
从数据集中载入数据,读取数据,将URL和标签进行识别和区分。
1 | #从文件中获取数据集 |
二、数据处理(分词、向量化处理)
数据处理实现对URL的分词及向量化处理
分词:分析URL根据,.-进行分词,由于com、cn等常用域名不是关键影响因素,所以分词的时候去掉了
分词
1 | #分词 |
向量化处理
将分词以后的结果进行词频的向量化处理,形成可以用于模型训练的稀疏矩阵向量
1 | all_urls,y=getDataFromFile(datapath) |
三、模型训练
将经过处理后的训练数据用模型进行训练,将数据集分为两部分一部分用于训练,一部分用于测试评估。
1 | #训练,通过逻辑回归模型训练 |
用逻辑回归模型训练的结果是 score: 98.50 %
1 | #训练,通过SVM支持向量机模型训练 |
用SVM模型训练的结果是 score: 99.64 %
可以看出SVM模型训练的结果比逻辑回归模型训练的效果要稍好。
四、保存模型
将训练好的模型进行持久化保存,通过pickle.dump()的方式把训练好的模型参数及特征保存至模型文件,以便于应用的时候不要再进行训练,直接应用训练好的模型。
1 | #保存模型及特征 |
通过main方法执行训练模型及保存模型
1 | if __name__ == '__main__': |
四、模型应用
通过pickle.load载入已经训练好的模型和特征,并用Flask暴露一个接口调用模型的预测方法进行预测。
载入已经训练好的模型
1 | #载入已经训练好的模型 |
通过接口进行调用
1 | #通过接口进行调用 |
五、应用效果
将需要检测的URL,输入到http://127.0.0.1:5000/后面,就可以根据输入的URL进行检测给出模型预测的结果。
http://127.0.0.1:5000/sohu.com/a/338823532_354899
http://127.0.0.1:5000/sohu.com/a/%3Cscript%3E/test
完整代码及数据集见:https://github.com/xiejava1018/urldetection.git
博客:http://xiejava.ishareread.com/
关注:微信公众号,一起学习成长!