查看原文
其他

爬虫实战|嚣张的徽州宴老板娘错在哪?

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者王玉婷,中南财经政法大学金融学院

本文编辑:刘子艳

技术总编:戴   雯

Stata&Python云端课程来啦!

为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~原价2400元的Python编程培训课程,现在仅需100元,详情请查看推文《Python云端课程福利大放送!0基础也能学~》。关于Stata,爬虫俱乐部推出了系列课程,内容包括字符串函数、正则表达式、爬虫专题和文本分析,可以随心搭配,价格美丽,物超所值,更多信息可查看Stata系列推文《与春天有个约会,爬虫俱乐部重磅推出正则表达式网络课程!》《与春天有个约会,爬虫俱乐部重磅推出基本字符串函数网络课程》等。变的是价格,不变的是课程质量和答疑服务。对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦!

7月2日,安徽蚌埠某高档小区,一女子遛狗时和他人发生冲突,叫嚣“有钱不怕,赔得起几千万”。事件视频片段被上传至微博,引起网民的激烈讨论。随后,当地警方对自称为“徽州宴老板娘”的遛狗女子不文明遛狗、肆意侮辱他人的行为进行了严肃处罚,并对另一当事人的殴打辱骂行为也进行了处理通报。

01

分析网页 

首先,我们在微博首页搜索关键词“徽州宴”,选择两个热度最高的相关话题#徽州宴道歉会得到原谅吗##叫嚣狗比人值钱女子为徽州宴老板娘#。我们以第一个话题的评论页为例,分析其url链接的规律,使用循环快速“拿下”所有评论。

打开开发者Network页面,选择XHR,其中buildComments就是评论文件。如下图所示:

随着页面向下加载,你可以看到更多的buildComments文件。观察该文件的链接:>"https://weibo.com/ajax/statuses/buildComments?is_reload=1&id=4656364468570597&is_show_bulletin=2&is_mix=0&count=20&uid=2686904145"
>"https://weibo.com/ajax/statuses/buildComments?flow=0&is_reload=1&id=4656364468570597&is_show_bulletin=2&is_mix=0&max_id=141326698244575&count=20&uid=2686904145"
可以发现,关键是获得max_id参数。根据我们之前的文章《【爬虫实战】“中国人不吃这一套”——人民日报微博评论分析》可以知道,这个参数就在每个buildComments文件的前一个评论文件中。如下图所示: 

到此,我们就理出头绪了,我们从第一个buildComments文件开始,获取评论文本的同时,获得下一个buildComments文件url链接的max_id参数,从而不断构造下一页链接,说干就干! 

02

获取数据  

# 导入需要的库import osimport requestsimport timeimport jsonimport random#新建文件夹和文件os.chdir(r"D:\tempro")os.makedirs("./新浪微博评论")os.chdir("./新浪微博评论")file='./评论1.csv' # 构造headers headers={ "cookie": 你的cookie, "referer":"https://weibo.com/2686904145/KnEiqzXBr", "traceparent": "00-1291c7b7c4c133d6f2dca38374e24dbc-a37ea7ef4b9d3050-00", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36", "x-requested-with": "XMLHttpRequest", "x-xsrf-token": "8CYl7P4HLo4aqYv8FmU86H7O" }max_id=0 #初始参数为0comments = [] #用于存放评论for i in range(1,100000): print("正在爬取第%s页"%i) sourcecode = True url="https://weibo.com/ajax/statuses/buildComments?is_reload=1&id=4656364468570597&is_show_bulletin=2&is_mix=0&count=20&uid=2686904145" pars={ "max_id":max_id } while sourcecode: try: html=requests.get(url,headers=headers,params=pars) #获取链接内容 sourcecode=False except: time.sleep(10) print('重新连接!') results=json.loads(str(html.content.decode()), strict = False) #解析为字典 #获取下一个页面链接的参数 max_id = results["max_id"] max_id = int(max_id) # 转为数字 total_number = results["total_number"] #总评论数 #从字典的子字典以及列表元素中提取所需信息 for d in results["data"]: user_id=d["user"]["id"] user_name=d["user"]["screen_name"] user_gender=d["user"]["gender"] comment=d["text_raw"] like_count=d["like_counts"] comments.append(comment) comments=list(set(comments)) #有重复的max_id,去重 print("已输出%s条评论" %len(comments)) if len(comments) == total_number: break time.sleep(random.random()*3)#导出到csv文件comments = "".join(comments)with open(file,'w',encoding='utf-8') as f: f.write(comments) f.close()获得的评论文件csv如下图所示:

03

评论词云 

在之前的推文中,我们多次介绍过词云的构造方法,现在我们再复习一遍。

第一步:导入评论文本,清洗文本。

import matplotlib.pyplot as pltimport jiebafrom wordcloud import wordcloudimport reimport os
os.chdir(r"D:\tempro")os.chdir("./新浪微博评论")file='./评论1.csv' stopfile = './all_stopwords.txt' # 停用词表
text1 = open(file, 'r', encoding='utf-8').readlines() # 导入评论文本text = [re.sub('[^\u4e00-\u9fa5]','',te) for te in text1] # 清洗文本,只保留汉字text = ''.join(text) # 将上述评论列表转换为一个字符串以便分词第二步:分词并整理  
text_cut = jieba.lcut(text) # 使用jieba库做中文分词stopwords = [word.strip() for word in open(stopfile,'r',encoding='utf-8').readlines()] # 导入停用词表# 去掉分词后得到的单字def drop_oneword(contents): ex_oneword = [] for word in contents: if len(word) == 1: continue ex_oneword.append(word) return ex_onewordtext_cut = drop_oneword(text_cut) #去掉单字text_cut = ' '.join(text_cut)

上述程序运行结果如下: 

第三步:生成词云。  

此时,我们发现上述分词后还有“这个”、“这么”等无实际意义的词汇,这将在词云的生成过程中得到控制。 

wc = wordcloud.WordCloud( font_path='./simsun.ttc', # 使用的字体,可以从c盘的fonts文件夹任意选取并复制粘贴至该工作路径。 background_color='white', width=800, height=600, max_words=200, max_font_size=100, mask=plt.imread('./盘子.jpg'), # 导入背景图,最好是黑白配色;文件大小和分辨率太小的图片不能做背景图 stopwords = stopwords # 去除停用词)wc.generate(text_cut) # 生成词云wc.to_file('./词云.png') # 保存词云图plt.imshow(wc)plt.axis('off') plt.show()

生成的词云如下图所示: 

可以看到,除了主语“老板娘”之外,“有钱”、“道歉”、“原谅”、“嚣张”、“为富不仁”等词汇的出现频率较高。显然,网友们对“有钱”人如此“嚣张”非常愤怒,强烈要求徽州宴老板娘“道歉”,但同时也认为其廉价的道歉没用(“有用吗”),表示不会“原谅”。“愤怒”是本事件下微博评论的主要情绪,后续还可以使用情绪分析来对评论情绪做更精细的刻画。至此,我们就完成了徽州宴微博评论的分词以及词云生成啦~   对徽州宴一事,你有什么看法呢?

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。

   欢迎点赞、关注、评论哟~ 

对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!

往期推文推荐 

如何获取衡量股民情绪的指标?|东方财富股吧标题爬虫

利用Python构建马科维茨有效边界

rangestat,让统计量灵活滚动起来!

听说这样做立项成功率更高哦

如何处理缺失值?这一篇搞定!

  善用dataex命令,高效沟通你我他

  用Markdown制作简历,强力助力你的求职季

大数据下的大学分数线排行榜,快来围观!

《觉醒年代》—带你回到百年前

用Stata画的三维图很奇怪怎么办?

如何随机生成满足特定数据特征的新变量?

爬取无法翻页网页——自然科学基金项目及可视化

爬取京东评论数据进行情感分类

Stata与音乐之间的酷炫连接

这些年,爬虫俱乐部走出的博士们!
         看这里,近五年各校高被引论文上榜名单!

高校经管类核心期刊发文排行榜

疯狂的科研创新加速器——Stata!

  可盐可甜,“粽”有所爱,快来pick你最爱的粽子吧!

  好玩有趣的手绘图形库——cutecharts

  爬虫实战|摩尔庄园微博话题讨论

  一季度财报出炉,哪些公司最烧钱?

  一季度财报出炉,哪些公司最赚钱?

  技能篇 | 图片合并大法

  批量空气质量数据文件合并分析

  Stata17之日期时间新功能

  Stata17之Lasso新功能

爱奇艺视频弹幕爬取之《小舍得》数据可视化利器——Matplotlib

关于我们 


微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存