抓一下严禁失德艺人曲线复出的评论 Python

11月23日,人民日报微博客户端发表 - 严禁违法失德艺人曲线复出,总共封禁了88位失德艺人,其中就包括吴某签,郑某爽,还有那个拜靖国神社的东西(这种人活着都是浪费空气,司马的无脑渣渣)。

我们来爬一下下方的评论并做个词云可视化。经年爬微博评论,那个PC端是爬到第17爷就会给咱们分发垃圾数据,所以从手机端着手。今天爬跟昨天爬的出生率创40年来最低,人口几近负增长,微博爬虫爬评论规则又不一样,今天爬的规则是每15页会重置max_id和max_id_type为0,两个都是0,不像昨天的15页后会降max_id_type设为1。

 

 

 开干:

 1 """
 2     最近有篇微博火了
 3 """
 4 import pprint
 5 import random
 6 import time
 7 import openpyxl
 8 import requests
 9 import threading
10 
11 wb = openpyxl.Workbook()
12 ws = wb.create_sheet(index=0)
13 ws.cell(row=1, column=1, value='评论者Id') # 第一行第一列评论者id
14 ws.cell(row=1, column=2, value='评论者昵称') # 第一行第二列评论者昵称
15 ws.cell(row=1, column=3, value='获赞数') # 第一行第三列评论获赞数
16 ws.cell(row=1, column=4, value='评论内容') # 第一样第四列评论内容
17 ws.cell(row=1, column=5, value='评论时间') # 第一样第五列评论时间
18 ws.cell(row=1, column=6, value='是否认证用户') # 第一样第六列评论者是否认证
19 
20 headers = {
21     "Referer": "https://m.weibo.cn/detail/4706612893975061",
22     "Cookie": "SCF=AnKJy3NOK5c-P3XxWYBPzTFGd92WnUEH6LUI_MdzSig02NBwKpa2u00x45GCB3-AOQKJvc_oIAkHIKr7MdST4JE.; SUB=_2A25MbV1zDeRhGedJ61oQ8SjNyTyIHXVvrmM7rDV6PUJbktCOLUfTkW1NVnxxfy_BvTGKBnuuEVnUOYQ8GZaV5mhP; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WFCIqm7ZokIkH-v5aWq95ji5NHD95QpS05ReK2ceKz7Ws4Dqcjdi--fiK.7iK.pi--fiKy2iK.Ni--fiKL2i-2p; _T_WM=25534804088; WEIBOCN_FROM=1110005030; MLOGIN=1; XSRF-TOKEN=fb7e62; M_WEIBOCN_PARAMS=oid=4706612893975061&luicode=20000061&lfid=4706612893975061&fid=231522type%3D1%26q%3D%23%E4%B8%A5%E9%98%B2%E8%BF%9D%E6%B3%95%E5%A4%B1%E5%BE%B7%E8%89%BA%E4%BA%BA%E6%9B%B2%E7%BA%BF%E5%A4%8D%E5%87%BA%23&uicode=10000011",
23     "User-Agent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Mobile Safari/537.36",
24     "X-XSRF-TOKEN": "9ba0c4",
25 }
26 # url = 'https://m.weibo.cn/comments/hotflow?id=4706612893975061&mid=4706612893975061&max_id={max_id}&max_id_type={max_id_type}'
27 
28 page = 1
29 while page < int(504 / 10) + 1:
30     time.sleep(random.uniform(2, 5))
31     print(f"---------------------------------开始爬取第{page}页的内容---------------------------------")
32     if page == 1:
33         url = 'https://m.weibo.cn/comments/hotflow?id=4706612893975061&mid=4706612893975061&max_id_type=0'
34     else:
35         url = f'https://m.weibo.cn/comments/hotflow?id=4706612893975061&mid=4706612893975061&max_id={max_id}&max_id_type={max_id_type}'
36     # 进入循环,第一次开始爬取第一页,会返回max_id和max_type_id
37     response = requests.get(url=url, headers=headers) # 请求网页
38     # pprint.pprint(response.json()['data']) # 打印一下
39     max_id = response.json()['data']['max_id'] # max_id
40     max_id_type = response.json()['data']['max_id_type'] # max_id_type
41     print(f'-----------------第{page}页获取到的max_id为:{max_id} , max_id_type为:{max_id_type} -----------------\n')
42     # 解析数据
43     results = response.json()['data']['data'] # 获取评论数据
44     # pprint.pprint(results)
45     for item in results:
46         userId = item['user']['id'] # 评论者id
47         userName = item['user']['screen_name'] #  评论者昵称
48         likeCounts = item['like_count'] # 评论获赞数
49         content = item['text'] # 评论内容
50         commentTime = item['created_at']  # 评论时间
51         isVerifiedUser = item['user']['verified'] # 是否认证用户
52         print(userId, userName, likeCounts, content, commentTime, isVerifiedUser, sep=" | ")
53         # 存储数据
54         ws.append([userId, userName, likeCounts, content, commentTime, isVerifiedUser]) # 添加数据
55     print(f'------------------------------第{page}页数据采集完毕------------------------------\n')
56     time.sleep(1)
57     page += 1 # 循环条件
58     # if page == 3:
59     #     break
60 wb.save('严禁违法失德艺人曲线复出评论.xlsx')
61 wb.close()  # 关闭文档

看下有变化的部分运行截图:

 爬虫完毕,做个词云可视化:

 1 import re
 2 import jieba
 3 from stylecloud import gen_stylecloud
 4 import pandas as pd
 5 
 6 datafile = pd.read_excel('严禁违法失德艺人曲线复出评论.xlsx')
 7 wordsStr = ''.join(datafile['评论内容'].tolist()) # 转成字符串串
 8 # print(wordsStr)
 9 # wordsStr = re.sub("[0-9A-Za-z\u4e00-\u9fa5]", '', wordsStr)
10 wordsStr = re.sub('[0-9a-zA-Z\< =\":\/;\.\_\->\]\[?,。!“”、\@...\'\?\%…\&]', '', wordsStr) # 替换标点符号和英文词
11 # print(wordsStr)
12 
13 words = jieba.cut(wordsStr) # 分词,是个生成器
14 # 再次转换成字符串
15 results = ' '.join(words)
16 stopWords = ['', '', '', '', '', '', '还有', '就是', '', '', '', '知道', '怎么',
17              '', '', '', '', '', '', '一管', '', '', '', '', '', '', '',
18              '呵呵', '', '', '', '', '', '', '这个', '', '这种','我们', '开始', '天天',
19              '什么', '比如', '时候', '', '', '', '', '', '一个', '一下', '', '', '还是',
20              '', '', '不能', '已经', '', '', '', '', '', '但是', '', '', '', '',]
21 
22 gen_stylecloud(
23     text=results,
24     size=1280, # stylecloud 的大小(长度和宽度)
25     font_path='C:\\Windows\\Fonts\\simhei.ttf',
26     max_font_size=200,  # stylecloud 中的最大字号
27     max_words=150,
28     stopwords=True,  # 布尔值,用于筛除常见禁用词
29     # invert_mask=pic,
30     custom_stopwords=stopWords,
31     output_name='1.png',
32 )

如图:

 做一下获赞数排行的可视化:

 1 import pandas as pd
 2 from pyecharts.charts import Bar
 3 import pyecharts.options as opts
 4 from pyecharts.globals import ThemeType
 5 
 6 # 读文档
 7 datafile = pd.read_excel('严禁违法失德艺人曲线复出评论.xlsx')
 8 # print(datafile['获赞数'])
 9 # 去重
10 df_new = datafile.drop_duplicates(['评论者Id']) # 根据id去重
11 # 提取数据并排序
12 results = df_new.sort_values(by=['获赞数'], ascending=False) #根据获赞数排序
13 
14 x_data = results['评论者昵称'].values.tolist()[0:20] # 提取排序后的昵称到列表,取前20个
15 y_data = results['获赞数'].values.tolist()[0:20] # 提取排序后的获赞数到列表,取前20个
16 
17 print(x_data, y_data)
18 # 开始绘图
19 bar = (
20     Bar(init_opts=opts.InitOpts(width='1280px', height='960px', theme=ThemeType.VINTAGE))
21     .add_xaxis(xaxis_data=x_data)
22     .add_yaxis(series_name='评论数',y_axis=y_data,)
23     .set_global_opts(
24         title_opts=opts.TitleOpts(
25             title='评论获赞数前20',
26             title_textstyle_opts=opts.TextStyleOpts(font_size=35),
27         ),
28         tooltip_opts=opts.TooltipOpts(
29             is_show=True,
30             trigger='axis',
31             axis_pointer_type='cross',
32         ),
33         toolbox_opts=opts.ToolboxOpts(),  # 什么参数不传会全部展示
34     )
35     .set_series_opts(label_opts=opts.LabelOpts(is_show=True, position='right'))
36     .reversal_axis() # 翻转坐标轴,不翻转昵称看不到
37 ).render('1.html')

运行后截图:

 

原文地址:https://www.cnblogs.com/mafu/p/15608288.html