中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python如何實現獲取動態圖表

發布時間:2021-12-16 11:11:29 來源:億速云 閱讀:124 作者:iii 欄目:開發技術

本篇內容介紹了“Python如何實現獲取動態圖表”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

開發工具

Python版本: 3.6.4

相關模塊:

re模塊;

requests模塊;

urllib模塊;

pandas模塊;

以及一些Python自帶的模塊。

環境搭建

安裝Python并添加到環境變量,pip安裝需要的相關模塊即可。

看一下B站2019年「數據可視化」版塊的情況,第一個視頻超2百萬的播放量,4萬+的彈幕

Python如何實現獲取動態圖表

百度指數

獲取百度指數,首先需要登陸你的百度賬號

以關鍵詞「王者榮耀」為例,時間自定義為2020-10-01~2020-10-10

通過開發者工具,我們就能看到曲線圖的數據接口

Python如何實現獲取動態圖表

然而一看請求得到的結果,發現并沒有數據,原因是這里使用了JS加密

找到解決方法,成功實現爬取,代碼實現

import time
import json
import execjs
import datetime
import requests
from urllib.parse import urlencode
 
 
def get_data(keywords, startDate, endDate, area):
    """
    獲取加密的參數數據
    """
    # data_url = "http://index.baidu.com/api/SearchApi/index?area=0&word=[[%7B%22name%22:%22%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80%22,%22wordType%22:1%7D]]&startDate=2020-10-01&endDate=2020-10-10"
    params = {
        'word': json.dumps([[{'name': keyword, 'wordType': 1}] for keyword in keywords]),
        'startDate': startDate,
        'endDate': endDate,
        'area': area
    }
    data_url = 'http://index.baidu.com/api/SearchApi/index?' + urlencode(params)
    # print(data_url)
    headers = {
        # 復制登錄后的cookie
        "Cookie": '你的cookie',
        "Referer": "http://index.baidu.com/v2/main/index.html",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"
    }
 
    # 獲取data和uniqid
    res = requests.get(url=data_url, headers=headers).json()
    data = res["data"]["userIndexes"][0]["all"]["data"]
    uniqid = res["data"]["uniqid"]
 
    # 獲取js函數中的參數t = "ev-fxk9T8V1lwAL6,51348+.9270-%"
    t_url = "http://index.baidu.com/Interface/ptbk?uniqid={}".format(uniqid)
    rep = requests.get(url=t_url, headers=headers).json()
    t = rep["data"]
    return {"data": data, "t": t}
 
 
def get_search_index(word, startDate, endDate, area):
    """
    獲取最終數據
    """
    word = word
    startDate = startDate
    endDate = endDate
    # 調用get_data獲取data和uniqid
    res = get_data(word, startDate, endDate, area)
    e = res["data"]
    t = res["t"]
 
    # 讀取js文件
    with open('parsing_data_function.js', encoding='utf-8') as f:
        js = f.read()
 
    # 通過compile命令轉成一個js對象
    docjs = execjs.compile(js)
 
    # 調用function方法,得到指數數值
    res = docjs.call('decrypt', t, e)
    # print(res)
    return res
 
 
def get_date_list(begin_date, end_date):
    """
    獲取時間列表
    """
    dates = []
    dt = datetime.datetime.strptime(begin_date, "%Y-%m-%d")
    date = begin_date[:]
    while date <= end_date:
        dates.append(date)
        dt += datetime.timedelta(days=1)
        date = dt.strftime("%Y-%m-%d")
    return dates
 
 
def get_area():
    areas = {"901": "山東", "902": "貴州", "903": "江西", "904": "重慶", "905": "內蒙古", "906": "湖北", "907": "遼寧", "908": "湖南", "909": "福建", "910": "上海", "911": "北京", "912": "廣西", "913": "廣東", "914": "四川", "915": "云南", "916": "江蘇", "917": "浙江", "918": "青海", "919": "寧夏", "920": "河北", "921": "黑龍江", "922": "吉林", "923": "天津", "924": "陜西", "925": "甘肅", "926": "新疆", "927": "河南", "928": "安徽", "929": "山西", "930": "海南", "931": "臺灣", "932": "西藏", "933": "香港", "934": "澳門"}
    for value in areas.keys():
        try:
            word = ['王者榮耀']
            time.sleep(1)
            startDate = '2020-10-01'
            endDate = '2020-10-10'
            area = value
            res = get_search_index(word, startDate, endDate, area)
            result = res.split(',')
            dates = get_date_list(startDate, endDate)
            for num, date in zip(result, dates):
                print(areas[value], num, date)
                with open('area.csv', 'a+', encoding='utf-8') as f:
                    f.write(areas[value] + ',' + str(num) + ',' + date + '\n')
        except:
            pass
 
 
def get_word():
    words = ['諸葛大力', '張偉', '胡一菲', '呂子喬', '陳美嘉', '趙海棠', '咖喱醬', '曾小賢', '秦羽墨']
    for word in words:
        try:
            time.sleep(2)
            startDate = '2020-10-01'
            endDate = '2020-10-10'
            area = 0
            res = get_search_index(word, startDate, endDate, area)
            result = res.split(',')
            dates = get_date_list(startDate, endDate)
            for num, date in zip(result, dates):
                print(word, num, date)
                with open('word.csv', 'a+', encoding='utf-8') as f:
                    f.write(word + ',' + str(num) + ',' + date + '\n')
        except:
            pass
 
 
get_area()
get_word()

得到的CSV文件結果如下,有兩種形式的數據

一種是多個關鍵詞每日指數數據,另一種是一個關鍵詞各省市每日指數數據

Python如何實現獲取動態圖表

有了數據就可以用Python制作動圖

import pandas as pd
import bar_chart_race as bcr
 
# 讀取數據
# df = pd.read_csv('word.csv', encoding='utf-8', header=None, names=['name', 'number', 'day'])
df = pd.read_csv('area.csv', encoding='utf-8', header=None, names=['name', 'number', 'day'])
 
# 數據處理,數據透視表
df_result = pd.pivot_table(df, values='number', index=['day'], columns=['name'], fill_value=0)
 
# 生成GIF
# bcr.bar_chart_race(df_result, filename='word.gif', title='愛情公寓5演職人員熱度排行')
bcr.bar_chart_race(df_result, filename='area.gif', title='國內各省市王者榮耀熱度排行')

微博指數

百度搜索新浪的微博指數,打開網站一看,發現網頁版無法使用

Python如何實現獲取動態圖表

我們只需打開開發者工具,將你的瀏覽器模擬為手機端,刷新網頁即可

Python如何實現獲取動態圖表

可以看到,微指數的界面出來了

添加關鍵詞,查看指數的數據接口

Python如何實現獲取動態圖表

請求是Post方法,并且不需要登陸微博賬號

import re
import time
import json
import requests
import datetime
 
 
# 請求頭信息
headers = """accept: application/json
accept-encoding: gzip, deflate, br
accept-language: zh-CN,zh;q=0.9
content-length: 50
content-type: application/x-www-form-urlencoded
cookie: '你的cookie'
origin: https://data.weibo.com
referer: https://data.weibo.com/index/newindex?visit_type=trend&wid=1011224685661
sec-fetch-mode: cors
sec-fetch-site: same-origin
user-agent: Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1
x-requested-with: XMLHttpRequest"""
 
# 將請求頭字符串轉化為字典
headers = dict([line.split(": ",1) for line in headers.split("\n")])
print(headers)
 
# 數據接口
url = 'https://data.weibo.com/index/ajax/newindex/getchartdata'
 
 
# 獲取時間列表
def get_date_list(begin_date, end_date):
    dates = []
    dt = datetime.datetime.strptime(begin_date, "%Y-%m-%d")
    date = begin_date[:]
    while date <= end_date:
        dates.append(date)
        dt += datetime.timedelta(days=1)
        date = dt.strftime("%Y-%m-%d")
    return dates
 
 
# 相關信息
names = ['湯唯', '朱亞文', '鄧家佳', '喬振宇', '王學圻', '張藝興', '俞灝明', '吳越', '梁冠華', '李昕亮', '蘇可', '孫驍驍', '趙韓櫻子', '孫耀琦', '魏巍']
 
 
# 獲取微指數數據
for name in names:
    try:
        # 獲取關鍵詞ID
        url_id = 'https://data.weibo.com/index/ajax/newindex/searchword'
        data_id = {
            'word': name
        }
        html_id = requests.post(url=url_id, data=data_id, headers=headers)
        pattern = re.compile(r'li wid=\\\"(.*?)\\\" word')
        id = pattern.findall(html_id.text)[0]
 
        # 接口參數
        data = {
            'wid': id,
            'dateGroup': '1month'
        }
        time.sleep(2)
        # 請求數據
        html = requests.post(url=url, data=data, headers=headers)
        result = json.loads(html.text)
        # 處理數據
        if result['data']:
            values = result['data'][0]['trend']['s']
            startDate = '2019-01-01'
            endDate = '2020-01-01'
            dates = result['data'][0]['trend']['x']
            # 保存數據
            for value, date in zip(values, dates):
                print(name, value, date)
                with open('weibo.csv', 'a+', encoding='utf-8') as f:
                    f.write(name + ',' + str(value) + ',' + date + '\n')
    except:
        pass

獲取到的信息

Python如何實現獲取動態圖表

也來生成一個動態圖表

import pandas as pd
import bar_chart_race as bcr
 
# 讀取數據
df = pd.read_csv('weibo.csv', encoding='utf-8', header=None, names=['name', 'number', 'day'])
 
# 數據處理,數據透視表
df_result = pd.pivot_table(df, values='number', index=['day'], columns=['name'], fill_value=0)
# print(df_result[:10])
 
# 生成GIF
bcr.bar_chart_race(df_result[:10], filename='weibo.gif', title='大明風華演職人員熱度排行')

“Python如何實現獲取動態圖表”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

民县| 开鲁县| 延边| 盖州市| 西华县| 天津市| 农安县| 卢氏县| 佛坪县| 克什克腾旗| 吴忠市| 黄平县| 东乡县| 平原县| 黄骅市| 冀州市| 龙游县| 什邡市| 忻州市| 津市市| 灵山县| 阿克陶县| 嘉祥县| 夹江县| 同德县| 鄂托克前旗| 桂林市| 阳新县| 临沭县| 尚志市| 扎赉特旗| 潞城市| 吉隆县| 南部县| 清新县| 芜湖县| 柏乡县| 花垣县| 南皮县| 凤台县| 浦北县|