• 抓一下严禁失德艺人曲线复出的评论 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')

    运行后截图:

     

  • 相关阅读:
    MySQL基准测试--innodb_buffer_pool_instances
    MySQL参数优化:back_log
    MySQL open_files_limit相关设置
    Django权限系统auth模块详解
    2.9 go mod 之本地仓库搭建
    my40_MySQL锁概述之意向锁
    my39_InnoDB锁机制之Gap Lock、Next-Key Lock、Record Lock解析
    2.8 GO 参数传递
    my38_MySQL事务知识点零记
    my37_MGR流控对数据库性能的影响以及MGR与主从的性能对比
  • 原文地址:https://www.cnblogs.com/mafu/p/15608288.html
Copyright © 2020-2023  润新知