Python大数据分析系列

本文详细介绍了使用Python进行疫情新闻数据抓取、中文分词、高频词统计、WordCloud可视化、TF-IDF计算及KMeans文本聚类、层次聚类和LDA主题分布分析的方法。通过案例展示了如何对疫情相关的新闻数据进行预处理、分析和可视化,以揭示隐藏的主题和趋势。
摘要由CSDN通过智能技术生成

思来想去,虽然很忙,但还是挤时间针对这次肺炎疫情写个Python大数据分析系列博客,包括网络爬虫、可视化分析、GIS地图显示、情感分析、舆情分析、主题挖掘、威胁情报溯源、知识图谱、预测预警及AI和NLP应用等。希望该系列线上远程教学对您有所帮助,也希望早点战胜病毒,武汉加油、湖北加油、全国加油。待到疫情结束樱花盛开,这座英雄的城市等你们来。

首先说声抱歉,最近一直忙着学习安全知识,其他系列文章更新较慢,已经有一些人催更了,哈哈。言归正传,前文分享了腾讯疫情实时数据抓取,结合PyEcharts绘制地图、折线图、柱状图。这篇文章将爬取疫情相关的新闻数据,接着进行中文分词处理及文本聚类、LDA主题模型分析。希望这篇可视化分析文章对您有所帮助,也非常感谢参考文献中老师的分享,一起加油,战胜疫情!如果您有想学习的知识或建议,可以给作者留言~

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200306163821515.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0Vhc3Rtb3VudA==,size_16,color_FFFFFF,t_70#pic_center)

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200306205014316.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0Vhc3Rtb3VudA==,size_16,color_FFFFFF,t_70#pic_center)

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200307120501874.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0Vhc3Rtb3VudA==,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200306231502457.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0Vhc3Rtb3VudA==,size_16,color_FFFFFF,t_70#pic_center)

代码下载地址: [ https://github.com/eastmountyxz/Wuhan-data-analysis

](https://github.com/eastmountyxz/Wuhan-data-analysis)
CSDN下载地址: [ https://download.csdn.net/download/Eastmount/12239638

](https://download.csdn.net/download/Eastmount/12239638)

文章目录

  • 一.数据抓取
  • 二.中文分词及高频词统计
    • 1.结巴分词
    • 2.基本用法
    • 3.获取疫情文本高频词
  • 三.WordCloud可视化分析
    • 1.基本用法
    • 2.疫情词云
  • 四.TF-IDF计算及KMeans文本聚类
    • 1.TF-IDF计算
    • 2.文本聚类
  • 五.主题词层次聚类分析
    • 1.层次聚类
    • 2.疫情分析
  • 六.LDA主题分布分析
    • 1.LDA主题模型
    • 2.完整代码
  • 七.总结

同时推荐前面作者另外五个Python系列文章。从2014年开始,作者主要写了三个Python系列文章,分别是基础知识、网络爬虫和数据分析。2018年陆续增加了Python图像识别和Python人工智能专栏。

在这里插入图片描述

前文阅读:
[ [Pyhon疫情大数据分析] 一.腾讯实时数据爬取、Matplotlib和Seaborn可视化分析全国各地区、某省各城市、新增趋势

](https://blog.csdn.net/Eastmount/article/details/104298388)
[ [Pyhon疫情大数据分析] 二.PyEcharts绘制全国各地区、某省各城市疫情地图及可视化分析

](https://blog.csdn.net/Eastmount/article/details/104437215)


一.数据抓取

本次爬虫目标网站是中国社会组织公共服务平台,读者可以针对不同的网站进行抓取。

第一步 分析网站
通过浏览器“审查元素”查看源代码并获取新闻的标题、URL、时间等。不同网站有不同分析方法,本文重点是文本挖掘,数据抓取仅提供一些思路。

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200306165310595.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0Vhc3Rtb3VudA==,size_16,color_FFFFFF,t_70#pic_center)

第二步,进入具体的新闻页面抓取相关的文本信息。

  • article_title = text_html.xpath(’//*[@id=“fontinfo”]/p[2]/b[1]//text()’)
  • publish_time = text_html.xpath(’/html/body/div[2]/div/ul[1]/li[3]/strong/text()’)[0][5:]
  • source_text = text_html.xpath(’//*[@id=“fontinfo”]/p[last()]//text()’)[0]
  • text_list = text_html.xpath(’//*[@id=“fontinfo”]//text()’)

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200306165928211.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0Vhc3Rtb3VudA==,size_16,color_FFFFFF,t_70#pic_center)

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200306165805456.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0Vhc3Rtb3VudA==,size_16,color_FFFFFF,t_70#pic_center)

第三步,本爬虫存在一个技巧,每条新闻的URL非常相似,这里仅变换参数来抓取新闻。

  • 最初一篇新闻(2020-03-06)URL:http://www.chinanpo.gov.cn/1944/ 125177 /nextindex.html
  • 最后一篇新闻(2020-01-26)URL:http://www.chinanpo.gov.cn/1944/ 123496 /nextindex.html

我们只需要每次抓取数据时,通过“下一页”定位下次需要抓取的URL即可,核心代码为:

  • next_url = “http://www.chinanpo.gov.cn” + text_html.xpath(’/html/body/div[2]/div/ul[1]/li[2]/a[2]/@href’)[0]

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200306171147798.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0Vhc3Rtb3VudA==,size_16,color_FFFFFF,t_70#pic_center)

第四步,数据抓取完整代码如下所示,建议读者直接下载我的文本进行数据分析,而不用再去爬取数据高访问对方数据库。

    import requests,re, csv, sys, time
    from lxml import html
    from fake_useragent import UserAgent
    
    # 记录起始时间
    startTime = time.time()
    
    # 创建CSV文件,并写入表头信息
    fp = open('中国社会组织_疫情防控.csv','a',newline='',encoding='utf-8-sig')
    writer = csv.writer(fp)
    writer.writerow(("标题", "时间", "URL", "正文内容", "来源"))
    
    #----------------------------------------------抓取数据----------------------------------------------
    def spider_html_info(url):
        try:
            headers = {
                "User-Agent" : UserAgent().chrome #chrome浏览器随机代理
            }
            response = requests.get(url=url, headers=headers).text
            text_html = html.fromstring(response)
            
            # 获取下一页链接,先其他元素获取一页链接,保证程序的强壮性
            next_url = "http://www.chinanpo.gov.cn" + text_html.xpath('/html/body/div[2]/div/ul[1]/li[2]/a[2]/@href')[0]
            print("next_url", next_url)
        
            # 获取文章标题
            article_title = text_html.xpath('//*[@id="fontinfo"]/p[2]/b[1]//text()')
            title = "".join(article_title)
            if title == "":
                title = "".join(text_html.xpath('//*[@id="fontinfo"]/p[3]/b[1]//text()'))
            print ("title = ",title)
            
            # 获取发布时间
            publish_time = text_html.xpath('/html/body/div[2]/div/ul[1]/li[3]/strong/text()')[0][5:]
            print ("publish_time = ", publish_time)
            print ("url = ", url)
            
            # 获取来源
            source_text = text_html.xpath('//*[@id="fontinfo"]/p[last()]//text()')[0]
            source = source_text[3:]
            
            # 爬取文本
            text_list = text_html.xpath('//*[@id="fontinfo"]//text()')
            article_text = "".join(text_list).replace('\r\n','').replace("\xa0", "").replace("\t", "").replace(source_text,"").replace(title, "")    
            # print ("article_text", article_text)
            # print ("source = ", source)
            writer.writerow((title, publish_time, url, article_text, source))
        except:
            pass
        
        if url == 'http://www.chinanpo.gov.cn/1944/123496/index.html':
            fp.close()
            # 获取结束时的时间
            endTime =time.time()           
            useTime =(endTime-startTime)/60
            print ("该次所获的信息一共使用%s分钟"%useTime)
            # 正常退出程序
            sys.exit(0)       
        else:
            return next_url
    
    #----------------------------------------------主函数----------------------------------------------
    def main():
        url = "http:
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值