《用Python 玩转数据》项目—动态新闻标题热点挖掘
一、背景
新闻标题是新闻的主旨,从新闻标题中可以进行多种内容的挖掘,例如可以爬取一定时
间段内的新闻进行分析获得热点词。新浪各地新闻中的新闻标题形式如下:
url :/news/gnxw/gdxw1/index_1.shtml
可以通过观察网页源代码,可以发现这些新闻标题和时间都有明显的特征:
进博会门票网售1500 元一张?上海警方:假
的 别信
(11 月06 日07:45) 赣州人大常委会原主任骆炳峰再获减刑八个月 (10 月19 日12:27) 辽宁越狱事件调查:部分监狱管理人员非在编
干警
(10 月16 日21:25)
可以利用正则表达式方便的获取新闻标题和发布时间,同时观察网页也可以看到url
是有规律的,所以可以方便地获取多条滚动新闻标题,可以基于这些标题中的热点词构建
词云。
但是并非所有的网站数据都能在源代码中方便地解析到,有的网站由Ajax 动态生成网
页,其数据的获得需要不同的方法,例如新浪全部滚动新闻,页面部分内容示意如下:
url: /roll/#pageid=153&lid=2509&k=&num=50&page=1
页面右上角有一行文字“n 秒后刷新”和一个刷新按钮用于动态生成页面,查看该网
页源代码也确实不能找到网页上显示的新闻标题,这种情况就需要用到浏览器的“开发者
工具”来进行查看。
在浏览器中找到“开发者工具”命令,打开后页面如下图所示:
本页面可以等待其自动刷新或者点击“刷新”按钮记录网页数据日志,点击红色的
“stop recording network log”按钮结束记录。
可以看到动态产生数据的页面Name 是“get?pageid=153…&r=…&callback=…”(蓝色
背景焦点部分) ,观察该页面的Headers 部分,可以看到Request URL 字段,此url 即为真
正产生数据的页面,也可在页面下方的“Query String Parameters”中查看,其为一个字
典,可以传给get()或post()等函数的params 参数后获取需要的网页。
打开该页面可以看到新闻标题的unicode 编码,对其做相应转换即可。注意一定要在
遵循爬虫协议的前提下使用“开发者工具”。
二、算法
以获取一定时间段内新闻标题中的热点词并绘制词云为例,该算法的主要步骤如下:
1. 从新闻网站爬取若干新闻标题并进行解析
1.1 利用Requests 库的get()函数爬取网页,动态网页需要深入查看
1.2 找到其中的新闻标题模式
1.3 利用re 模块中的findall()函数提取出标题,将它们存入文件;
2. 标题分词(Text Segmentation)
要抓热点词首先要将新闻标题进行分词,可利用Python 中著名的分词器jieba (结
巴分词)
逐行用jieba 分词,单行分词的代码如下:
word_list = pseg.cut(subject)
3. 去除停用词
很多如“的”和“我们”这样的功能词对于主题分析并无帮助,因此需要使用停用
词表进行词的过滤
代码如下:
stop_words = set(line.strip() for line in open('stopwords.txt', encoding='utf-8'))
4. 选择名词
jieba 中的词性标签使用了传统方式,例如"n"是名词,“a”是形容词,“v”是动词等。
新闻标题中的名词更能代表热点,可以单独选择