思来想去,虽然很忙,但还是挤时间针对这次肺炎疫情写个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人工智能专栏。
- Python基础知识系列: Python基础知识学习与提升
- Python网络爬虫系列: Python爬虫之Selenium+BeautifulSoup+Requests
- Python数据分析系列: 知识图谱、web数据挖掘及NLP
- Python图像识别系列: Python图像处理及图像识别
- 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: