如何从新闻中识别骗子们的小套路首席安全官频道

*原创作者:西角边的MR,首席安全官频道本文属FreeBuf原创奖励计划,未经许可禁止转载 

电信诈骗猖獗盛行,成为国家的重点打击对象,但是我们身边亲朋好友被骗的悲剧还在屡屡发生。小作者思考也许我们可以从新闻中提取电信诈骗的特征信息,为家里的长辈亲人提个醒,做到防患于为然。

小作者以某新闻网站为平台,对电信诈骗的相关新闻进行了提取和分析,试图从获取的信息中分析出诈骗分子的小“套路”。(PS:一次写文章,希望能给大家提供一个从新闻构建模型的思路,不足之处请各位大大们指正)

timg.jpeg

timg.jpeg

一、开始采集了

获取信息当然要需要爬虫了,这是我使用的库:

2017-02-09 20-17-41 的屏幕截图_看图王.png

2017-02-09 20-17-41 的屏幕截图_看图王.png

小作者首先对某大型网站进行了浏览,在搜索栏中搜索了关于电信诈骗类的新闻报道,但是翻页过程中它的url好像并没有发生什么变化,firefox的也没有看到post和get,但是在看了他页码的link后,还是有点小激动的,因为它的url包含了totalPage=63&pageNum=2这两个内容,那就自己写url吧。

Beautifulsoup是一个强大的库,在这里我从属性a获取源代码中的link。至于request库是因为小作者发现使用urlopen打开网站的源代码和requests+header的内容不同,requests返回的网站源代码比较全一些。

接下来和上面的方法相似,再采集每个网站中所有link,把它写道一个list当中,然后我们就要分析我们需求网站url的特点,使用正则表达式获取link,下面贴代码:

2017-02-09 20-30-23 的屏幕截图.png

2017-02-09 20-30-23 的屏幕截图.png

获取到link后我们就可以浏览新闻了,我们也该获取新闻的信息了。

新闻种类千千万,有图的,没有图的,有视频的,没视频的,文本里面图片链接,段落属性一大堆,看的我是着实sad。先不管它全都抓取下来再说。

小作者在观察了网站后将其分为了四类,有的是文本是夹在两个图片之间,有的是纯文本等等。根据这些内容小作者使用Beautifulsoup来爬取下来所有内容(Beautifulsoup确实强大,强行安利一波),当然爬取的文本也是看不了的,还好我们只需要中文内容和数字就可以了。那就正则表达式吧,因为使用的是gbk编码,所以pattern=[0-9\x80-\xff]+,如果是utf-8的话就是pattern=[0-9\u4e00-\u9fa5]+,下面贴代码:(PS:大家在用的时候一定要注意编码类型,这个很烦人。)

2017-02-09 20-59-29 的屏幕截图.png

2017-02-09 20-59-29 的屏幕截图.png

2017-02-09 20-59-51 的屏幕截图.png

2017-02-09 20-59-51 的屏幕截图.png

由于某些需要我还获取了文本的title,author,hash等。大家可以根据自己的需要来爬取相应的内容。

二、下来进行关键词提取

为什么python是一款非常好用的脚本语言呢?因为它集成和很多的库,这里又可以给大家安利一下jieba的中文分词词库,它的地址是

链接jieba库

pip install jieba pip install jieba.analyse 这里小作者使用的是jieba.analyse.extract_tags(a,topK=10)函数,a是文本内容的str变量,topK出现频率较高的10个词并将它们都放进了可以keyword的list里面,贴源码:

2017-02-09 21-11-49 的屏幕截图_看图王(1)_看图王.png

2017-02-09 21-11-49 的屏幕截图_看图王(1)_看图王.png

要不说python好用

1ad5ad6eddc451da508cc756bffd5266d0163211.jpg

1ad5ad6eddc451da508cc756bffd5266d0163211.jpg

三、关键词处理

我们获取了每篇文章的top10的关键词,小作者目前正在看《python自然语言处理》这本书,这里面讲解了文本特征,小作者就想再逼真的诈骗情形和真实的情形总会有所出入,比如某些词语的出现频率,位置等会和普通文本的有所差异,所以小作者试着对关键词出现的频率进行处理。

我们之前获取的keyword是一个列表,里面有很多重复的词,所以我们要先把list转为set格式

例如:

keyword1 = set(keyword)

result = {}

for key in keyword1:

count = keyword.count(key)

result[key] = count

如果使用的是python2.7的话可以

from collections import Counter,然后:

2017-02-09 21-11-49 的屏幕截图_看图王_看图王.png

2017-02-09 21-11-49 的屏幕截图_看图王_看图王.png

小作者目前也只写到这里了,大家还可以根据需要自己从文本中获取关键词的位置,类型,之间的逻辑关系构建出一个诈骗类型的文本特征库,当然这也都是后话了,小作者目前也在朝这个方向努力,希望小作者能为大家提供一个处理电信诈骗案件的思路,并能和大家交流学习。(PS:一定要注意编码!!!)

最后贴上我自己的结果:

2017-02-09 16-36-35 的屏幕截图.png

2017-02-09 16-36-35 的屏幕截图.png

由于年还没过完,小作者在这里也祝大家新年快乐,多看Freebuf涨知识。

*原创作者:西角边的MR,本文属FreeBuf原创奖励计划,未经许可禁止转载

2017-02-15 09:15 阅读:29