当前位置:   article > 正文

Python爬取2万条微博热搜,带你揭开热搜趋势!_微博热搜话题趋势csdn

微博热搜话题趋势csdn

作者:徐麟,某互联网公司数据分析狮

我们此次通过爬取2019年2W+条热搜数据,包括内容以及搜索指数,为大家揭开微博热搜2019的诸多秘密,一起利用数据“硬核吃瓜”,包括:2019微博热搜最大的瓜,微博程序员集体加班的日子,微博热搜的常客,热搜里的2019互联网……

获取数据来源

我们此次并没有直接去爬取微博的原始数据,而是从一个专门记录微博热搜历史数据的网站获取,网站界面如下:在这里插入图片描述
通过网站的数据接口,我们获取到了今年1月1日至今的2W多条数据,爬取代码如下:

resou = pd.DataFrame(columns=['date','title','searchCount','rank'])
resou_date = getBetweenDay('2019/01/01','2019/07/12')
for i in resou_date:
     print(i)
     url= 'https://www.enlightent.cn/research/top/getWeiboHotSearchDayAggs.do?date={}'.format(str(i))
     html = requests.get(url=url, cookies=cookie, headers=header).content
     data = json.loads(html.decode('utf-8'))
    for j in range(100):
         resou = resou.append({'date':i,'title':data[j]['keyword'],
        'searchCount':data[j]['searchCount'],'rank':j+1},ignore_index=True)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

最终获取到的吃瓜数据如下:
在这里插入图片描述
有了前面的瓜源获取过程,我们获取到了2W+吃瓜数据,下面就可以开始利用这些数据愉快地开始我们的吃瓜之旅

2019微博热搜最火事件

说到吃瓜,大家首先关注的一定是那些最大的瓜,要吃就吃最大的瓜也是广大吃瓜群众所遵从的基本原则,我们通过对比热搜数据的搜索指数,选取出了15个最大的瓜,数据如下:
在这里插入图片描述

2019最让微博程序员抓狂的日子

为何“今天到底是什么日子”这种看似没有任何营养的内容,都会有那么高的搜索指数。为了回答这个问题,我们统计了2019年每天的TOP100热搜话题平均指数,并绘制了日历热度图:
在这里插入图片描述
可以看到6月27日的指数远高于其他天数,而且基本上是其他时间的两到三倍,这一天就是“今天到底是什么日子”这个话题的诞生之日,并且这一天微博服务器毫无疑问地“应声倒地”,我想这一定是让微博程序员怀疑人生的日子

下面我们就来具体看看,这一天到底发生了些什么:
在这里插入图片描述
看到这份榜单,我们仿佛看到了程序员们6月27日的绝望。宋慧乔&宋仲基离婚这个巨型瓜的出现,程序员们还可以用自己的信念支撑着服务器不要崩溃,然而正当程序员们以为稳操胜券的时候,范冰冰&李晨分手这个更加巨大的瓜出现了,我想程序员们内心一定是这样的:
在这里插入图片描述

2019最勤劳的瓜生产商

前面提到了6月27日是微博程序员最为抓狂的日子,那么又有那些生产商为广大吃瓜群众源源不断地创造吃瓜素材呢,我们也统计了相关数据,想必这些生产商也是广大程序员们最怕的人:在这里插入图片描述
榜单中易烊千玺以80次的出现次数荣登榜首,也就是说平均每两天他就会为广大群众生产一次“吃瓜素材”,也是非常地勤劳,想到作者一个月一篇原创的节奏,默默留下了悔恨的泪水。周董也在榜单中以78次的数据位居次席,毕竟周董是一代人的青春记忆,大家也都在时刻关注着周董。

或许大家会认为榜单都被娱乐圈所霸占,没啥新意之时,东哥站了出来,成为荣登本榜单的唯一互联网人士,不过个人还是希望今后不要在榜单中再看到东哥的身影,毕竟老话说得好“no news is good news”。

那些专属热搜的词语

如同“*,是怎样的体验”这样的知乎体,“震惊!”这样的uc体,热搜也有一些比较常出现,能代表热搜独特气质的词语,我们从中选取了一些比较有代表的词语并统计其出现次数在这里插入图片描述
华为在榜单中出现了86次,也印证了大家在上半年对于华为的关注度,未来也希望有更多类似于“华为**系统上线”这样振奋人心的消息出现在热搜中。

同时在小编看来否认,道歉,心疼这三个词是非常有特色的热搜词语,毕竟很难在其他的地方会时不时就看“心疼**”这种标题,我们针对于这三个词语制作了相应的词云:

否认版
在这里插入图片描述
道歉版
在这里插入图片描述
心疼版
在这里插入图片描述

完整代码

# -*- coding: utf-8 -*-
'''
更多Python学习资料以及源码教程资料,可以在群1136201545免费获取
'''
## 调用要使用的包
import json
import random
import requests
import time
import pandas as pd
import os
import jieba
from scipy.misc import imread  # 这是一个处理图像的函数
from wordcloud import WordCloud, ImageColorGenerator
import matplotlib.pyplot as plt
import datetime
from collections import Counter
os.chdir('D:/爬虫/微博热搜')
## 获得日期
def getBetweenDay(begin_date,end_date):
    date_list = []
    begin_date = datetime.datetime.strptime(begin_date, "%Y/%m/%d")
    end_date = datetime.datetime.strptime(end_date, "%Y/%m/%d")
    while begin_date <= end_date:
        date_str = begin_date.strftime("%Y/%m/%d")
        date_list.append(date_str)
        begin_date += datetime.timedelta(days=1)
    return date_list

## 分词
def get_words_list(df):
    df['words_list'] = []
    word_generator = jieba.cut_for_search(df['title'])
    for word in word_generator:
        df['words_list'].append(word)
    return df

## explode
def dataframe_explode(dataframe, fieldname): 
    temp_fieldname = fieldname + '_made_tuple_' 
    dataframe[temp_fieldname] = dataframe[fieldname].apply(tuple)       
    list_of_dataframes = []
    for values in dataframe[temp_fieldname].unique().tolist(): 
        list_of_dataframes.append(pd.DataFrame({
            temp_fieldname: [values] * len(values), 
            fieldname: list(values), 
        }))
    dataframe = dataframe[list(set(dataframe.columns) - set([fieldname]))].merge(pd.concat(list_of_dataframes), how='left', on=temp_fieldname) 
    del dataframe[temp_fieldname]
    return dataframe

## 绘制词云
def draw_word_cloud(word):
    word_title = resou_word[resou_word['title'].str.contains(word)]
    word_title = word_title.groupby(['title'],as_index=False).agg({'searchCount':['max']})
    word_title.columns = ['title','count']
    data = [(word_title['title'][i],word_title['count'][i]/1000000) for i in range(word_title.shape[0])]
    wc = (WordCloud(init_opts=opts.InitOpts(theme=ThemeType.ROMA))
        .add("",data, word_size_range=[20, 50], shape='pentagon')
        .set_global_opts(title_opts=opts.TitleOpts(title=''))
        .render('{}词云.html'.format(word))
        )
    
## 设置headers和cookie,数据爬取
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win32; x32; rv:54.0) Gecko/20100101 Firefox/54.0',
'Connection': 'keep-alive'}
cookies ='v=3; iuuid=1A6E888B4A4B29B16FBA1299108DBE9CDCB327A9713C232B36E4DB4FF222CF03; webp=true; ci=1%2C%E5%8C%97%E4%BA%AC; __guid=26581345.3954606544145667000.1530879049181.8303; _lxsdk_cuid=1646f808301c8-0a4e19f5421593-5d4e211f-100200-1646f808302c8; _lxsdk=1A6E888B4A4B29B16FBA1299108DBE9CDCB327A9713C232B36E4DB4FF222CF03; monitor_count=1; _lxsdk_s=16472ee89ec-de2-f91-ed0%7C%7C5; __mta=189118996.1530879050545.1530936763555.1530937843742.18'
cookie = {}
for line in cookies.split(';'):
    name, value = cookies.strip().split('=', 1)
    cookie[name] = value


resou = pd.DataFrame(columns=['date','title','searchCount','rank'])
resou_date = getBetweenDay('2019/01/01','2019/07/12')
for i in resou_date:
    print(i)
    url= 'https://www.enlightent.cn/research/top/getWeiboHotSearchDayAggs.do?date={}'.format(str(i))
    html = requests.get(url=url, cookies=cookie, headers=header).content
    data = json.loads(html.decode('utf-8'))
    for j in range(100):
        resou = resou.append({'date':i,'title':data[j]['keyword'],
                                'searchCount':data[j]['searchCount'],'rank':j+1},ignore_index=True)
 

## 按天统计    
resou = resou.apply(get_words_list,axis=1)
resou.to_excel('热搜数据.xlsx')
resou_dt = resou.groupby('date',as_index=False).agg({'searchCount':['mean']})
resou_dt.columns = ['date','avg_count']


## 绘制日历图
from pyecharts import options as opts
from pyecharts.charts import Calendar,Pie
from pyecharts import GraphicShapeOpts
from pyecharts.globals import SymbolType
from pyecharts.charts import Page, WordCloud,TreeMap
data = [
        [resou_dt['date'][i], resou_dt['avg_count'][i]]
        for i in range(resou_dt.shape[0])
    ]



calendar = (
        Calendar(init_opts=opts.InitOpts(width='1800px',height='1500px'))
        .add("", data,calendar_opts=opts.CalendarOpts(range_=['2019-01-01', '2019-07-12']))
        .set_global_opts(
            title_opts=opts.TitleOpts(title="2019每日热搜平均指数",pos_left='15%'),
            visualmap_opts=opts.VisualMapOpts(
                max_=3600000,
                min_=0,
                orient="horizontal",
                is_piecewise=False,
                pos_top="230px",
                pos_left="100px",
                pos_right="10px"
            )
            )
        .render('日期热力图.html')     
     )


## 词频统计
resou_word = dataframe_explode(resou,'words_list')
resou_word_stat = resou_word.groupby(['words_list'],as_index=False).agg({'title':['count']}) 
resou_word_stat.columns = ['word','num']
resou_word_stat.to_excel('词频统计.xlsx')

func = pd.read_excel('名词.xlsx')
love = pd.read_excel('婚恋.xlsx')
person = pd.read_excel('人物.xlsx')
resou_word_func = pd.merge(resou_word_stat,func,how='inner',on='word')
resou_word_love = pd.merge(resou_word_stat,love,how='inner',on='word')
resou_word_person = pd.merge(resou_word_stat,person,how='inner',on='word')


resou_word_func = resou_word_func.sort_values('count',ascending=False).reset_index()
words = [(resou_word_func['word'][i],resou_word_func['num'][i]) for i in range(resou_word_func.shape[0])]
pie = (
        Pie(init_opts=opts.InitOpts(theme=ThemeType.CHALK))
        .add("", words)
        .set_global_opts(title_opts=opts.TitleOpts(title="微博常用词出现次数",pos_left='center'),
                         legend_opts=opts.LegendOpts(is_show=False))
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}",font_size=16),)
        .render('热搜词饼图.html')
    )
        
        
resou_word_love = resou_word_love.sort_values('count',ascending=False).reset_index()
words = [(resou_word_love['word'][i],resou_word_love['num'][i]) for i in range(resou_word_love.shape[0])]
pie = (
        Pie(init_opts=opts.InitOpts(theme=ThemeType.CHALK))
        .add("", words)
        .set_global_opts(title_opts=opts.TitleOpts(title="微博婚恋类词语出现次数",pos_left='center'),
                         legend_opts=opts.LegendOpts(is_show=False))
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}",font_size=16),)
        .render('婚恋类热搜词饼图.html')
    )
        
        
resou_word_person = resou_word_person.sort_values('num',ascending=False).reset_index()        
words = [{'"value": {}, "name": {}"'.format(str(resou_word_person['num'][i]),
          resou_word_person['name'][i])} for i in range(resou_word_person.shape[0])]

tree = (
        TreeMap(init_opts=opts.InitOpts(theme=ThemeType.ESSOS))
        .add("", words,pos_left=0,pos_right=0,pos_top=50,pos_bottom=50)
        .set_global_opts(title_opts=opts.TitleOpts(title="热搜明星出现次数排名",pos_left='center'),
                         legend_opts=opts.LegendOpts(is_show=False))
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}\n\n {c}",font_size=17,
                                                   color='black',position='inside',font_weight='bolder'))
        .render('排序.html')
    )
       
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/102215
推荐阅读
相关标签
  

闽ICP备14008679号