以下为《[Pyhon疫情大数据分析] 四.微博话题抓取及新冠肺炎疫情文本挖掘和情感分析》的无排版文字预览,完整格式请下载
下载前请仔细阅读文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。
[Pyhon疫情大数据分析] 四.微博话题抓取及新冠肺炎疫情文本挖掘和情感分 析 原创 Eastmount 最后发布于2020-03-21 14:40:03 阅读数 13856 收藏 原力计划 展开 Python+TensorFlow人工智能 该专栏为人工智能入门专栏,采用Python3和TensorFlow实现人工智能相关算法。前期介绍安装流程、基础语法… Eastmount ¥9.90 去订阅 思来想去,虽然很忙,但还是挤时间针对这次肺炎疫情写个Python大数据分析系列博客,包括网络爬虫、可视化分析、GIS地图显示、情 感分析、舆情分析、主题挖掘、威胁情报溯源、知识图谱、预测预警及AI和NLP应用等。希望该系列线上远程教学对您有所帮助,也希望 早点战胜病毒,XX加油、湖北加油、全国加油。待到疫情结束樱花盛开,这座英雄的城市等你们来。 首先说声抱歉,最近一直忙着学习安全知识,其他系列文章更新较慢,已经有一些人催更了。言归正传,前文分享了疫情相关新闻数据爬 取,并进行中文分词处理及文本聚类、LDA主题模型分析。这篇文章将抓取微博话题及评论信息,采用SnowNLP进行简单的情感分析及 文本挖掘,包括随时间的情感分布。希望这篇基础性文章对您有所帮助,也非常感谢参考文献中老师的分享,一起加油,战胜疫情!如果 您有想学习的知识或建议,可以给作者留言~ 代码下载地址:https://github.com/eastmountyxz/Wuhan-data-analysis CSDN下载地址:https://download.csdn.net/download/Eastmount/*** 第1页 共27页 文章目录 一.微博话题数据抓取 1.爬虫解析 2.爬虫完整代码 二.微博话题词云分析 1.基本用法 2.疫情词云 3.WordCloud 三.SnowNLP情感分析用法 1.SnowNLP 2.中文分词 3.常见功能 4.情感分析 四.SnowNLP微博情感分析实例 1.情感各分数段出现频率 2.情感波动分析 3.情感时间分布 五.总结 同时推荐前面作者另外五个Python系列文章。从2014年开始,作者主要写了三个Python系列文章,分别是基础知识、网络爬虫和数据分 析。2018年陆续增加了Python图像识别和Python人工智能专栏。 Python基础知识系列:Python基础知识学习与提升 Python网络爬虫系列:Python爬虫之Selenium+BeautifulSoup+Requests Python数据分析系列:知识图谱、web数据挖掘及NLP Python图像识别系列:Python图像处理及图像识别 Python人工智能系列:Python人工智能及知识图谱实战 前文阅读: [Pyhon疫情大数据分析] 一.腾讯实时数据爬取、Matplotlib和Seaborn可视化分析全国各地区、某省各城市、新增趋势 [Pyhon疫情大数据分析] 二.PyEcharts绘制全国各地区、某省各城市疫情地图及可视化分析 [Pyhon疫情大数据分析] 三.新闻信息抓取及词云可视化、文本聚类和LDA主题模型文本挖掘 一.微博话题数据抓取 该部分内容参考及修改我的学生兼朋友“杨某某”的文章,也推荐博友们阅读他的博客,给予支持。作为老师,最开心的事就是看到学生成长和收获。 他的博客地址:python爬虫爬取微博之战疫情用户评论及详情 第2页 共27页 微博网址: https://m.weibo.cn/ 1.爬虫解析 第一步,进入微博审查元素,定位评论对应节点,后续抓取评论信息。 进入微博后,点击《战疫情》主题下,并随便选择一个动态进行分析,我就选择了“央视新闻网”的一条动态“https://m.weibo.cn /detail/447***65”进行分析。 我们刚打开该话题的时候,它显示的是187条评论,但是在审查时可以看到文章中的20个div,并且每个div中装载一条评论,每个页面原 始就只能显示20条评论。 当我们把鼠标不断向下滑动的过程中,网页元素中的div也不断随评论的增加而增加,当活动到底部时,所有评论都加载出来了。初步判 断该网页属于ajax加载类型,所以先就不要考虑用requests请求服务器了。 第二步,获取Ajax加载的动态链接数据,通过发布id定位每条话题。 这些数据都是通过Ajax动态加载的,点击到《战疫情》主题,发现它的URL并没有变化,具体浏览几篇文章后发现,它的的部分URL都是 统一的,文章链接 = ‘https://m.weibo.cn/detail/’+发布时的id,可以通过刚找到的 id 在浏览器中拼接试试。 第3页 共27页 比如下图所示的微博内容。比如:https://m.weibo.cn/detail/****** 第三步,下拉网页动态刷新数据,发现获取多个page的规律。 接下来是获取它下一个加载数据的通道,同样是通过抓包的方式获取,不断的下拉网页,加载出其他的Ajax数据传输通道,再进行对比。 可以很明显的看出,它的当前链接就只是带上了 “&page=当前数字” 的标签,并且每次加载出18篇动态文章。 查看元素信息如下图所示,每个page显示18个微博话题。 第4页 共27页 第四步,调用json.loads()函数或在线网站解析Json数据。 拿到的数据是json格式,再提取信息前需要把str文本转化为json数据,进行查找,可以使用json库查看它的结构 ,也可以在线json解析 查看它的结构,更推荐在线解析,方法结构比较清晰。 在线解析后的结果,简单的给它打上标签,每一个等级为一块,一级包括二级和三级,二级包括三级… 然后通过前面的标签进行迭代输 出,索引出来。在线网站:https://doc.001pp.com/ 第五步,获取每条微博的ID值。 调用方法如下,然后把拿到的id加在https://m.weibo.cn/detail/ 的后面就可以访问具体的文章了。 import requests api_url = 'https://m.weibo.cn/api/feed/trendtop?containerid=102803_ctg1_600059_-_ctg1_600059' reponse = requests.get(api_url) for json in reponse.json()['data']['statuses']: comment_ID = json['id'] print (comment_ID) 此时提取所有链接代码如下: import requests,time from fake_useragent import UserAgent comment_urls = [] def get_title_id(): '''爬取战疫情首页的每个主题的ID''' for page in range(1,3):# 这是控制ajax通道的量 headers = { "User-Agent" : UserAgent().chrome #chrome浏览器随机代理 第5页 共27页 } time.sleep(2) # 该链接通过抓包获得 api_url = 'https://m.weibo.cn/api/feed/trendtop?containerid=102803_ctg1_600059_-_ctg1_600059& page=' + str(page) print (api_url) rep = requests.get(url=api_url, headers=headers) for json in rep.json()['data']['statuses']: comment_url = 'https://m.weibo.cn/detail/' + json['id'] print (comment_url) comment_urls.append(comment_url) get_title_id() 输出结果如下: https://m.weibo.cn/api/feed/trendtop?containerid=102803_ctg1_600059_-_ctg1_600059&page=1 https://m.weibo.cn/detail/****** https://m.weibo.cn/detail/****** https://m.weibo.cn/detail/****** https://m.weibo.cn/detail/****** https://m.weibo.cn/detail/****** https://m.weibo.cn/detail/****** https://m.weibo.cn/detail/****** https://m.weibo.cn/detail/****** https://m.weibo.cn/detail/****** https://m.weibo.cn/detail/****** https://m.weibo.cn/detail/****** https://m.weibo.cn/detail/****** ...... 第六步,调用requests ajax 爬取更多信息。 现在需要获取更多的信息,如用户id、性别之类的,这不是selenium可以完成的操作了,还得使用ajax的方式获取json数据,提取详细的 信息。这里有个字段是max_id, 我们需要在上一个json文件底部找到该值。 目标:话题链接、话题内容、楼主ID、楼主昵称、楼主性别、发布日期、发布时间、转发量、评论量、点赞量、评论者ID、评论者昵称、评论者性 别、评论日期、评论时间、评论内容 第一个通道 现在可以预测下一个max_id 成功的通过上一个通道拿到了下一个通道的max_id,现在就可以使用ajax加载数据了。 第6页 共27页 2.爬虫完整代码 # -*- coding: utf-8 -*import requests,random,re import time import os import csv import sys import json import importlib from fake_useragent import UserAgent from lxml import etree importlib.reload(sys) startTime = time.time() #记录起始时间 #--------------------------------------------文件存储----------------------------------------------------path = os.getcwd() + "/weiboComments.csv" csvfile = open(path, 'a', newline='', encoding = 'utf-8-sig') writer = csv.writer(csvfile) #csv头部 writer.writerow(('话题链接','话题内容','楼主ID', '楼主昵称', '楼主性别','发布日期', '发布时间', '转发量','评论量','点赞量', '评论者ID', '评论者昵称', '评论者性别', '评论日期', '评论时间','评论内容')) #设置heades headers = { 'Cookie': '_T_WM=***575; H5_wentry=H5; backURL=https%3A%2F%2Fm.weibo.cn%2F; ALF=***39; MLOGIN=1; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9W5RJaVYrb.BEuOvUQ8Ca2OO5JpX5K-hUgL.FoqESh7eKzpShM2dJLoIp7LxKML1KBLBKnLxKqL1hnLBoMceoBfeh2EeKBN; SCF=AnRSOFp6QbWzfH1BqL4HB8my8eWNC5C33KhDq4Ko43RUIzs6rjJC49kIvz5_RcOJV2pVAQKvK2UbAd1Uh6j0pyo.; SUB=_2A25zQaQBDeRhGeBM71cR8SzNzzuIHXVQzcxJrDV6PUJbktAKLXD-kW1NRPYJXhsrLRnku_WvhsXi81eY0FM2oTtt; SUHB=0mxU9Kb_Ce6s6S; SSOLoginState=***41; WEIBOCN_FROM=***30; XSRF-TOKEN=dc7c27; M_WEIBOCN_PARAMS=oid%3D447***31%26luicode%3D***%26lfid%3D447***31%26uicode%3D*** 1%26fid%3D447***31', 'Referer': 'https://m.weibo.cn/detail/******', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest' } #-----------------------------------爬取战疫情首页的每个主题的ID-----------------------------------------comments_ID = [] def get_title_id(): for page in range(1,21): #每个页面大约有18个话题 headers = { "User-Agent" : UserAgent().chrome #chrome浏览器随机代理 } time.sleep(1) #该链接通过抓包获得 api_url = 'https://m.weibo.cn/api/feed/trendtop?containerid=102803_ctg1_600059_-_ctg1_600059& page=' + str(page) print(api_url) 第7页 共27页 rep = requests.get(url=api_url, headers=headers) #获取ID值并写入列表comment_ID中 for json in rep.json()['data']['statuses']: comment_ID = json['id'] comments_ID.append(comment_ID) #-----------------------------------爬取战疫情每个主题的详情页面-----------------------------------------def spider_title(comment_ID): try: article_url = 'https://m.weibo.cn/detail/'+ comment_ID print ("article_url = ", article_url) html_text = requests.get(url=article_url, headers=headers).text #话题内容 find_title = re.findall('.*?"text": "(.*?)",.*?', html_text)[0] title_text = re.sub(']*>.*?|', '', find_title) #正则匹配掉html标签 print ("title_text = ", title_text) #楼主ID title_user_id = re.findall('.*?"id": (.*?),.*?', html_text)[1] print ("title_user_id = ", title_user_id) #楼主昵称 title_user_NicName = re.findall('.*?"screen_name": "(.*?)",.*?', html_text)[0] print ("title_user_NicName = ", title_user_NicName) #楼主性别 title_user_gender = re.findall('.*?"gender": "(.*?)",.*?', html_text)[0] print ("title_user_gender = ", title_user_gender) #发布时间 created_title_time = re.findall('.*?"created_at": "(.*?)".*?', html_text)[0].split(' ') #日期 if 'Mar' in created_title_time: title_created_YMD = "{}/{}/{}".format(created_title_time[-1], '03', created_title_time[2]) elif 'Feb' in created_title_time: title_created_YMD = "{}/{}/{}".format(created_title_time[-1], '02', created_title_time[2]) elif 'Jan' in created_title_time: title_created_YMD = "{}/{}/{}".format(created_title_time[-1], '01', created_title_time[2]) else: print ('该时间不在疫情范围内,估计数据有误!URL = ') pass print ("title_created_YMD = ", title_created_YMD) #发布时间 add_title_time = created_title_time[3] print ("add_title_time = ", add_title_time) #转发量 reposts_count = re.findall('.*?"reposts_count": (.*?),.*?', html_text)[0] print ("reposts_count = ", 内容过长,仅展示头部和尾部部分文字预览,全文请查看图片预览。 (By:Eastmount 2020-03-21 中午12点于某某 http://blog.csdn.net/eastmount/) 参考文献: [1] [python数据挖掘课程] 十三.WordCloud词云配置过程及词频分析 - Eastmount [2] python爬虫爬取微博之战疫情用户评论及详情 [3] [python爬虫] Selenium爬取新浪微博内容及用户信息 [4] [Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上) [5] [Python爬虫] Selenium爬取新浪微博移动端热点话题及评论 (下) [6] 用pyecharts绘制词云WordCloud - pennyyangpei [7] 情感分析——深入snownlp原理和实践 [8] 自然语言处理库之snowNLP [9] 王某某老师的文章《基于情感分类的竞争企业新闻文本主题挖掘》 点赞 96 收藏 分享 Eastmount 博客专家 发布了452 篇原创文章 · 获赞 6414 · 访问量 505万+ 他的留言板 关注 第27页 共27页 [文章尾部最后500字内容到此结束,中间部分内容请查看底下的图片预览]请点击下方选择您需要的文档下载。
以上为《[Pyhon疫情大数据分析] 四.微博话题抓取及新冠肺炎疫情文本挖掘和情感分析》的无排版文字预览,完整格式请下载
下载前请仔细阅读上面文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。