目录
第一章 数据抓取与文本提取 1
1.1数据抓取 1
1.1.1网页链接定位 1
1.1.2 获取新闻信息 1
1.1.3 文件写入 1
1.1.4 爬取结果展示 2
1.2 分词 3
1.3 小结 3
第二章 共现矩阵与主题词分析 3
2.1 原理 3
2.1.1 简例 3
2.1.2 文本共现矩阵 4
2.2 核心代码 4
2.3 主题词分析 5
2.4 共现矩阵分析的优势与不足 5
第三章 Gephi绘制关键词图谱 6
3.1 数据初始化 6
3.1.1 构造顶点数组 6
3.1.2 构造边集数组 6
3.2 导入数据 7
3.2.1 导入顶点数组 7
3.2.2 导入边集数组 7
3.3 图谱绘制 8
3.4 最终效果 8
第四章 数据分析 9
第五章 总结 9
参考文献 10
本文着眼于对疫情期间教育领域新闻的分析,基于python语言,利用爬虫获取教育领域的最新新闻,并将其内容进行分词,抓取关键词。在此基础上,根据关键词进行共现分析,并利用Gephi软件绘制主题知识图谱,以分析在疫情之下教育行业的关注重点,并以此为鉴,分析未来教育行业的变化动向。
从主题词图谱可以看出来,前十大关键词为学生、教育、疫情、学校、工作、毕业生、学习、发展、线上、要求。其中有八个词汇为蓝色,词汇“疫情”为红色,词汇“毕业生”为浅绿色。从中可以发现,深蓝色区域对应主要话题为学校教育、社会热点话题以及与国家宏观政策相关的关键词,浅绿色区域对应主要话题为毕业求职相关的关键词,红色区域对应主要话题为与疫情影响相关的关键词,蓝绿色区域对应主要话题为与青少年发展相关的关键词。
因此,对近期教育新闻的分析如下,本文转载自http://www.biyezuopin.vip/onews.asp?id=15223毕业季到来,数以百万计的大学生和研究生将走上职场,招聘、求职相关的新闻自是不绝于耳。在面临疫情的冲击下,求职也愈发困难,国家对各单位提出的扩招等宏观调控政策也十分必要。同时,对于尚未毕业的大、中、小学生和职业学校的学生而言,由于疫情尚未完全控制,在家听网课、参加考试的状态仍需要保持一段时间。在宏观层面,国家也在积极建设,新闻发布会等多种形式进行及时的传播信息很重要。而对于广大青少年儿童而言,保护视力、身心健康、合理上网等老生常谈的话题依然不过时,尤其是当大家都只能待在家中的时候,家长更要注重孩子的健康发展。
import requests
from bs4 import BeautifulSoup as bs
import urllib.request
import time
import csv
import jieba
import re
from collections import Counter
from snownlp import SnowNLP
def fetchUrl(url):
'''
功能:访问 url 的网页,获取网页内容并返回
参数:目标网页的 url
返回:目标网页的 html 内容
'''
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
}
r = requests.get('http://edu.gmw.cn/node_10602.htm',headers=headers)
content = r.content.decode('UTF-8')
soup = bs(content, 'html5lib')
return soup
def getPageList():
soup = fetchUrl('http://edu.gmw.cn/node_10602.htm')
myList = soup.find_all(name = "span", attrs = {'class': 'channel-newsTitle'})#得到新闻标题链接后缀
#myNews存储新闻链接
myNews = {}
j = 0
for i in myList:
j += 1
if j > 50:
break
#生成新闻链接
if i.find('a').get('href')[0] == '2':
myNews[j] = 'http://edu.gmw.cn/' + i.find('a').get('href')
else:
myNews[j] = i.find('a').get('href')
print(myNews)
return myNews
def getContent():
urlList = getPageList()
resp = {}
for key in urlList:
page=urllib.request.urlopen(urlList[key])
contents = page.read()
bsobj = bs(contents,'html5lib')
# 获取文章 标题
title = bsobj.title.text + '\n'
print(title)
# 获取文章 内容
pList = bsobj.find(name = 'div' , attrs = {'class' : 'u-mainText'}).find_all('p')
content = ''
for p in pList:
content += p.text + '\n'
print(content)
time.sleep(1)
# 返回结果 标题+内容
resp[title] = content
return resp
def saveFile():
resp = getContent()
with open('D:/data.txt' , 'a' , encoding = 'gb18030') as fp:
for title in resp:
fp.write(resp[title])
with open('D:/data.csv' , 'a' , newline = '' , encoding = 'gb18030') as f:
write=csv.writer(f)
write.writerow(['文章标题', '内容'])
a=1 #记录写入多少条数据
for title in resp:
write.writerow([title,resp[title]])
print("已写入%d条信息"%a)
a+=1
def division():
cut_words = ""
all_words = ""
f = open('D:/all-data-key.txt', 'a', encoding='utf-8')
for line in open('D:/data.txt', encoding='gb18030'):
line = line.strip('\n')
#停用词过滤
line = re.sub('[0-9’!"#$%&\'()*+,-./:;<=>?@,。?★、…【】《》?“”‘’![\\]^_`{|}~\s]+', "", line)
seg_list = jieba.cut(line, cut_all=False)
cut_words = (" ".join(seg_list))
#计算关键词
all_words = cut_words.split()
c = Counter()
for x in all_words:
if len(x)>1 and x != '\r\n':
c[x] += 1
#Top50
output = ""
#print('\n词频统计结果:')
for (k,v) in c.most_common(50):
#print("%s:%d"%(k,v))
output += k + " "
f.write(output+"\n")
else:
f.close()
getPageList()
division()