python采集電影數(shù)據(jù)JS逆向, 并制作可視化

嗨嘍~大家好呀购啄,這里是魔王吶 ? ~!

環(huán)境使用:

  • Python 3.10

  • Pycharm

  • nodejs

模塊使用:

  • requests -> pip install requests

  • execjs -> pip install pyexecjs

  • json

  • csv

模塊安裝:

win + R 輸入cmd 輸入安裝命令 pip install 模塊名 (如果你覺得安裝速度比較慢, 你可以切換國內(nèi)鏡像源)

實(shí)現(xiàn)爬蟲流程:

一. 數(shù)據(jù)來源分析

1. 明確需求: 明確采集的網(wǎng)址以及數(shù)據(jù)內(nèi)容
    - 網(wǎng)址: https://www.endata.com.cn/BoxOffice/BO/Year/index.html
    - 數(shù)據(jù): 電影數(shù)據(jù)
2. 抓包分析: 通過開發(fā)者工具(瀏覽器自帶)進(jìn)行分析
    - 打開開發(fā)者工具: F12 / 右鍵點(diǎn)擊檢查選擇network (網(wǎng)絡(luò))
    - 選擇任意年份: 讓它加載對(duì)應(yīng)的數(shù)據(jù)內(nèi)容
    查看返回的數(shù)據(jù)內(nèi)容:
        請(qǐng)求網(wǎng)址: https://www.endata.com.cn/API/GetData.ashx
        請(qǐng)求方式: POST (需要向服務(wù)器提交表單數(shù)據(jù))
        請(qǐng)求頭: (是否有加密參數(shù))
        請(qǐng)求參數(shù):
            year: 2023
            MethodName: BoxOffice_GetYearInfoData
        響應(yīng)數(shù)據(jù):
            密文內(nèi)容 (加密內(nèi)容)
    - 對(duì)于加密的數(shù)據(jù), 進(jìn)行解密
        分析加密規(guī)則, 如何解密 (查看啟動(dòng)器)
    斷點(diǎn)目的: 刷新網(wǎng)頁 / 翻頁時(shí)候, 網(wǎng)頁運(yùn)行到這個(gè)地方可以暫停住
        傳入了什么參數(shù), 返回了什么內(nèi)容

二. 代碼實(shí)現(xiàn)步驟

1. 發(fā)送請(qǐng)求 -> 模擬瀏覽器對(duì)于url地址發(fā)送請(qǐng)求
2. 獲取數(shù)據(jù) -> 獲取服務(wù)器返回響應(yīng)數(shù)據(jù)
    獲取密文數(shù)據(jù) -> 解密
3. 解析數(shù)據(jù) -> 提取我們數(shù)據(jù)內(nèi)容
4. 保存數(shù)據(jù) -> 保存數(shù)據(jù)

數(shù)據(jù)采集

# 導(dǎo)入數(shù)據(jù)請(qǐng)求模塊: 需要安裝 pip install requests
import requests
# 需要安裝 pip install pyexecjs
import execjs
# 導(dǎo)入json模塊
import json
# 導(dǎo)入csv模塊
import csv

"""保存數(shù)據(jù)"""

# 創(chuàng)建文件對(duì)象
csv_file = open('data.csv', mode='w', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(csv_file, fieldnames=[
    '影片名稱',
    '類型',
    '總票房',
    '平均票價(jià)',
    '場(chǎng)均人次',
    '國家地區(qū)',
    '上映時(shí)間',
])
csv_writer.writeheader()

"""1. 發(fā)送請(qǐng)求 -> 模擬瀏覽器對(duì)于url地址發(fā)送請(qǐng)求"""

# 模擬瀏覽器
headers = {
    # User-Agent 用戶代理 表示瀏覽器基本身份信息
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
for year in range(2008, 2024):
    # 請(qǐng)求網(wǎng)址
    url = 'https://www.endata.com.cn/API/GetData.ashx'
    # 請(qǐng)求參數(shù)
    data = {
        'year': year,
        'MethodName': 'BoxOffice_GetYearInfoData'
    }
    # 發(fā)送請(qǐng)求
    response = requests.post(url=url, data=data, headers=headers)

"""2. 獲取數(shù)據(jù) -> 獲取服務(wù)器返回響應(yīng)數(shù)據(jù)"""

    content = response.text
    print('密文數(shù)據(jù): ', content)  # 查看是否得到數(shù)據(jù)內(nèi)容
    """解密數(shù)據(jù)
    - 通過JS代碼變成明文數(shù)據(jù) (分析解密數(shù)據(jù)代碼位置)
    - 通過python代碼調(diào)用js代碼
    """
    # 讀取js代碼
    f = open('demo.js', encoding='utf-8').read()
    # 編譯js代碼
    js_code = execjs.compile(f)
    # 調(diào)用js代碼函數(shù)
    res = js_code.call('get_content', content)
    # 轉(zhuǎn)成字典數(shù)據(jù)
    json_data = json.loads(res)
    print('明文數(shù)據(jù): ', res)
    print(json_data)

"""3. 解析數(shù)據(jù) -> 提取我們數(shù)據(jù)內(nèi)容"""

    Table = json_data['Data']['Table']
    # for 循環(huán)遍歷, 提取列表元素
    for index in Table:
        # 把數(shù)據(jù)保存到字典里面
        dit = {
            '影片名稱': index['MovieName'],
            '類型': index['Genre_Main'],
            '總票房': index['BoxOffice'],
            '平均票價(jià)': index['AvgPrice'],
            '場(chǎng)均人次': index['AvgPeoPle'],
            '國家地區(qū)': index['Area'],
            '上映時(shí)間': index['ReleaseTime'],
        }
        # 寫入數(shù)據(jù)
        csv_writer.writerow(dit)
        print(dit)

數(shù)據(jù)可視化

# 需要安裝 pip install pandas
import pandas as pd
from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
# 讀取文件
df = pd.read_csv('data.csv')
# 顯示前5行數(shù)據(jù)
df.head()

可以直接通過pyechrats 官文文檔 實(shí)現(xiàn)可視化分析

https://gallery.pyecharts.org/#/README
info = df['類型'].value_counts().index.to_list() # x軸的數(shù)據(jù)
num = df['類型'].value_counts().to_list() # y軸的數(shù)據(jù)
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker

c = (
    Pie()
    .add(
        "",
        [
            list(z)
            for z in zip(
                info,
                num,
            )
        ],
        center=["40%", "50%"],
    )
    .set_global_opts(
        # 設(shè)置標(biāo)題
        title_opts=opts.TitleOpts(title="2008-2023年部分電影類型分布"),
        legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),
    )
    .set_series_opts(label_opts=opts.LabelOpts(formatter=": {c}"))
    # 把可視化圖保存成html文件
    # .render("2008-2023年部分電影類型分布(餅圖).html")
)
c.load_javascript()
c.render_notebook()
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker
info = df['國家地區(qū)'].value_counts().index.to_list() # x軸的數(shù)據(jù)
num = df['國家地區(qū)'].value_counts().to_list() # y軸的數(shù)據(jù)
c = (
    Pie()
    .add(
        "",
        [
            list(z)
            for z in zip(
                info,
                num,
            )
        ],
        center=["40%", "50%"],
    )
    .set_global_opts(
        # 設(shè)置標(biāo)題
        title_opts=opts.TitleOpts(title="2008-2023年部分電影國家地區(qū)分布"),
        legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical"),
    )
    .set_series_opts(label_opts=opts.LabelOpts(formatter=": {c}"))
    # 把可視化圖保存成html文件
    # .render("2008-2023年部分電影類型分布(餅圖).html")
)
c.render_notebook()
df.head()
Top = df[['影片名稱', '總票房']].sort_values('總票房')[-10:]
name = list(Top['影片名稱'])
num = list(Top['總票房'])

from pyecharts import options as opts
from pyecharts.charts import Bar

c = (
    Bar()
    .add_xaxis(name)
    .add_yaxis("", num)
    .set_global_opts(
        xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),
        title_opts=opts.TitleOpts(title="2008-2023年部分電影總票房Top10分布", subtitle=""),
    )
    # .render("bar_rotate_xaxis_label.html")
)
c.render_notebook()

尾語

最后感謝你觀看我的文章吶~本次航班到這里就結(jié)束啦 ??

希望本篇文章有對(duì)你帶來幫助 ??,有學(xué)習(xí)到一點(diǎn)知識(shí)~

躲起來的星星??也在努力發(fā)光办悟,你也要努力加油(讓我們一起努力叭)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末惜姐,一起剝皮案震驚了整個(gè)濱河市牵敷,隨后出現(xiàn)的幾起案子胡岔,更是在濱河造成了極大的恐慌,老刑警劉巖枷餐,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姐军,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡尖淘,警方通過查閱死者的電腦和手機(jī)奕锌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來村生,“玉大人惊暴,你說我怎么就攤上這事〕锰遥” “怎么了辽话?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)卫病。 經(jīng)常有香客問我油啤,道長(zhǎng),這世上最難降的妖魔是什么蟀苛? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任益咬,我火速辦了婚禮,結(jié)果婚禮上帜平,老公的妹妹穿的比我還像新娘幽告。我一直安慰自己,他們只是感情好裆甩,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布冗锁。 她就那樣靜靜地躺著,像睡著了一般嗤栓。 火紅的嫁衣襯著肌膚如雪冻河。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天茉帅,我揣著相機(jī)與錄音叨叙,去河邊找鬼。 笑死担敌,一個(gè)胖子當(dāng)著我的面吹牛摔敛,可吹牛的內(nèi)容都是我干的廷蓉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼票顾,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼永高!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起行楞,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎土匀,沒想到半個(gè)月后子房,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡就轧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年证杭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妒御。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡解愤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出乎莉,到底是詐尸還是另有隱情送讲,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布惋啃,位于F島的核電站哼鬓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏边灭。R本人自食惡果不足惜异希,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绒瘦。 院中可真熱鬧宠互,春花似錦、人聲如沸椭坚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽善茎。三九已至券册,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間垂涯,已是汗流浹背烁焙。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耕赘,地道東北人骄蝇。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像操骡,于是被迫代替她去往敵國和親九火。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赚窃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容