第一步,获取百度热搜指数
import requests
import sys
import time
import datetime
import pandas as pd
# 每一个def 里都必须return,这样才有数据,不然会直接打印none !!!
word_url = 'http://index.baidu.com/api/SearchApi/thumbnail?area=0&word={}'
COOKIES = ''
headers = {
'Accept': 'application/json, text/plain, */*',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'no-cache',
'Cookie': COOKIES,
'DNT': '1',
'Host': 'index.baidu.com',
'Pragma': 'no-cache',
'Proxy-Connection': 'keep-alive',
'Referer': 'http://index.baidu.com/v2/main/index.html',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
}
def decrypt(t, e):
n = list(t)
i = list(e)
a = {}
result = []
ln = int(len(n) / 2)
start = n[ln:]
end = n[:ln]
for j, k in zip(start, end):
a.update({k: j})
for j in e:
result.append(a.get(j))
return ''.join(result)
def get_ptbk(uniqid):
url = 'http://index.baidu.com/Interface/ptbk?uniqid={}'
resp = requests.get(url.format(uniqid), headers=headers)
if resp.status_code != 200:
print('获取uniqid失败')
sys.exit(1)
return resp.json().get('data')
# 增加的自定义日期方法,从开始日期+1
# def rq(start,end):
# dt = [] # 定义一个日期空列表
# datestart = datetime.datetime.strptime(start, '%Y-%m-%d')
# dateend = datetime.datetime.strptime(end, '%Y-%m-%d')
# while datestart < dateend:
# dt.append(datestart.strftime('%Y-%m-%d')) # append到日期列表里
# datestart += datetime.timedelta(days=1) # 开始日期+1
# # print(datestart.strftime('%Y-%m-%d'))
# return dt
def get_index_data(keyword, dt):
keywords = str(keyword).replace("'", '"') # 注意命名的时候不一致,很容易报错
url = f'http://index.baidu.com/api/SearchApi/index?area=0&word={keywords}&area=0&startDate={dt[0]}&endDate={dt[-1]}'
# 取dt的第一个和最后一个,相当于开始日期和结束日期
resp = requests.get(url, headers=headers)
if resp.status_code != 200:
print('获取指数失败')
sys.exit(1)
content = resp.json()
data = content.get('data')
user_indexes = data.get('userIndexes')[0]
uniqid = data.get('uniqid')
ptbk = get_ptbk(uniqid)
while ptbk is None or ptbk == '':
ptbk = get_ptbk(uniqid)
all_data = user_indexes.get('all').get('data')
result = decrypt(ptbk, all_data)
result = result.split(',')
# print(keyword)
# 遍历日期,range后面的天数必须跟开始和结束日期对应的天数一致
# lll= [(dt_[i],result[i],keyword[0][0]['name']) for i in range(29)]
# keyword对应的数据是双层括号里还有字典,取对应数据需注意
lll = [(dt[i],result[i]) for i in range(len(dt))] # 不添加搜索词列,len 取字符长度,可以不用改天数
return lll
# 以下数据是从下往上,看用调用了哪些方法,方法必须在前面。
if __name__ == '__main__':
# 定义的日期开始结束变量,rq方法和get_index_data可以一起用
dt = pd.date_range("2022-01-17", "2022-02-15")
print(dt)
# 搜索词遍历,可以一次得多个词的对应数据
word1 = ["新冠疫苗","新冠","新冠病毒"]
for word_ in word1:
words = [[{"name": word_, "wordType": 1}]] # 注意是双层中括号
# get_index_data后面的参数必须跟对应的方法参数一致,否则后面无法调用。
m = get_index_data(words,dt)
# print(m)
mm = pd.DataFrame(m)
mm.columns = ["date","value"]
mm.to_excel(rf'C:\Users\Administrator\Desktop\download\{word_}.xlsx',index=False) # 记得传变量命名,路径前面加f,相当于format
第二步,动态可视化排行版
import pandas as pd
import numpy as np
import xlrd
from pyecharts.charts import Bar
from pyecharts import options as opts
from pyecharts.globals import ThemeType
from pyecharts.charts import Timeline
import datetime
# “read_row_excel”用于去读取excel文件中的某一行数据
# “read_col_excel”用于去读取excel文件中的某一列数据
def read_col_excel(column_number,filename):
# 打开文件
workbook = xlrd.open_workbook(r'C:\Users\村长苏苏\Desktop\排名热度.xlsx')
# 根据sheet索引或者名称获取sheet内容
sheet2 = workbook.sheet_by_index(0)
# 获取整行和整列的值(数组)
col_data = sheet2.col_values(r'C:\Users\村长苏苏\Desktop\排名热度.xlsx') # 获取行内容
return col_data
def read_row_excel(row_number,filename):
# 打开文件
workbook = xlrd.open_workbook(filename)
# 根据sheet索引或者名称获取sheet内容
sheet2 = workbook.sheet_by_index(0)
# 获取整行和整列的值(数组)
row_data = sheet2.row_values(row_number) # 获取行内容
return row_data
# “get_visualBar”函数的作用是要用Pyecharts绘制出一副条形图,所绘制的动态图表中的每一张图都为条形图。
# 另外,本函数中,绘制的条形图是一个水平的条形图,原因是通过代码 bar.reversal_axis()将x轴与y轴调换了
def get_visualBar(x,y,labeltime):
bar=Bar(init_opts=opts.InitOpts(theme=ThemeType.ROMANTIC,width='1500px',height='600px',bg_color='#FFF5EE'))
bar.add_xaxis(xaxis_data=x)
bar.add_yaxis(labeltime,y,itemstyle_opts=opts.ItemStyleOpts(area_color='#f5f5f5',color='#EE2C2C',border_color='#000000'),label_opts=opts.LabelOpts(is_show=True,position='right',font_weight='bold',font_size=15)
)
bar.set_global_opts(title_opts=opts.TitleOpts('你是我的荣耀主演热度变化'),
yaxis_opts=opts.AxisOpts(is_inverse=True,name_textstyle_opts=opts.TextStyleOpts(font_weight='bold'),interval=20)
,legend_opts=opts.LegendOpts(type_='',item_width=0,textstyle_opts=opts.TextStyleOpts(font_size=20,font_weight='bold')))
bar.set_series_opts()
bar.reversal_axis()
return bar
# 将图表添加至时间轴来绘制动态图表
# 编写主函数main,用于将刚才由 “get_visualBar”函数生成的图片添加到时间轴上,最终生成一个动态图表。
def main():
filename=r'C:\Users\村长苏苏\Desktop\排名热度.xlsx'
xdata=read_row_excel(0,filename)
timeline = Timeline()
begin=datetime.date(2021,7,26)# 修改日期
for i in range(1,26):# 修改天数
ydata=read_row_excel(i,filename)
data=list(zip(xdata,ydata))
data.sort(key=lambda x:x[1],reverse=True)
newxdata=[x[0] for x in data]
newydata=[x[1] for x in data]
date=str(begin+datetime.timedelta(days=i))
bar=get_visualBar(newxdata,newydata,date)
timeline.add(bar,date).add_schema(play_interval=360,is_auto_play=True,is_timeline_show=False)
# 以上main函数中,通过for循环,共制作了10副条形图,每一副都被添加到了timeline时间轴上。
timeline.render(r'C:\Users\村长苏苏\Desktop\排名热度图.html')
# 调用main函数
main()
版权声明:本文为qq_45396577原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。