stock-tracker

This commit is contained in:
C菌
2026-07-04 00:17:11 +08:00
commit 6087341a48
6463 changed files with 1929869 additions and 0 deletions
@@ -0,0 +1,6 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2019/12/16 20:44
Desc:
"""
@@ -0,0 +1,146 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2021/11/16 20:40
Desc: 艺恩-艺人
艺人商业价值
艺人流量价值
https://www.endata.com.cn/Marketing/Artist/business.html
"""
import datetime
import json
import os
import pandas as pd # type: ignore
import requests
import py_mini_racer # type: ignore
def _get_js_path(name: str = "", module_file: str = "") -> str:
"""
get JS file path
:param name: file name
:type name: str
:param module_file: filename
:type module_file: str
:return: 路径
:rtype: str
"""
module_folder = os.path.abspath(os.path.dirname(os.path.dirname(module_file)))
module_json_path = os.path.join(module_folder, "movie", name)
return module_json_path
def _get_file_content(file_name: str = "jm.js"):
"""
read the file content
:param file_name: filename
:type file_name: str
:return: file content
:rtype: str
"""
setting_file_name = file_name
setting_file_path = _get_js_path(setting_file_name, __file__)
with open(setting_file_path) as f:
file_data = f.read()
return file_data
def decrypt(origin_data: str = "") -> str:
"""
解密艺恩的加密数据
:param origin_data: 解密前的字符串
:type origin_data: str
:return: 解密后的字符串
:rtype: str
"""
file_data = _get_file_content(file_name="jm.js")
ctx = py_mini_racer.MiniRacer()
ctx.eval(file_data)
data = ctx.call("webInstace.shell", origin_data)
return data
def business_value_artist() -> pd.DataFrame:
"""
艺恩-艺人-艺人商业价值
https://www.endata.com.cn/Marketing/Artist/business.html
:return: 艺人商业价值
:rtype: pandas.DataFrame
"""
url = "https://www.endata.com.cn/API/GetData.ashx"
payload = {
"Order": "BusinessValueIndex_L1",
"OrderType": "DESC",
"PageIndex": "1",
"PageSize": "100",
"MethodName": "Data_GetList_Star",
}
r = requests.post(url, data=payload)
r.encoding = "utf8"
data_json = json.loads(decrypt(r.text))
temp_df = pd.DataFrame(data_json["Data"]["Table"])
temp_df.columns = [
"排名",
"-",
"艺人",
"商业价值",
"-",
"专业热度",
"关注热度",
"预测热度",
"美誉度",
"-",
]
temp_df = temp_df[
["排名", "艺人", "商业价值", "专业热度", "关注热度", "预测热度", "美誉度"]
]
temp_df["统计日期"] = datetime.datetime.now().date().isoformat()
return temp_df
def online_value_artist() -> pd.DataFrame:
"""
艺恩-艺人-艺人流量价值
https://www.endata.com.cn/Marketing/Artist/business.html
:return: 艺人流量价值
:rtype: pandas.DataFrame
"""
url = "https://www.endata.com.cn/API/GetData.ashx"
payload = {
"Order": "FlowValueIndex_L1",
"OrderType": "DESC",
"PageIndex": 1,
"PageSize": 100,
"MethodName": "Data_GetList_Star",
}
r = requests.post(url, data=payload)
r.encoding = "utf8"
data_json = json.loads(decrypt(r.text))
temp_df = pd.DataFrame(data_json["Data"]["Table"])
temp_df.columns = [
"排名",
"-",
"艺人",
"-",
"流量价值",
"专业热度",
"关注热度",
"预测热度",
"-",
"带货力",
]
temp_df = temp_df[
["排名", "艺人", "流量价值", "专业热度", "关注热度", "预测热度", "带货力"]
]
temp_df["统计日期"] = datetime.datetime.now().date().isoformat()
return temp_df
if __name__ == "__main__":
business_value_artist_df = business_value_artist()
print(business_value_artist_df)
online_value_artist_df = online_value_artist()
print(online_value_artist_df)
File diff suppressed because one or more lines are too long
@@ -0,0 +1,484 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2024/2/20 14:00
Desc: 电影票房数据
https://ys.endata.cn/BoxOffice/Movie
"""
import datetime
import json
import os
import pandas as pd
import requests
import py_mini_racer
def _get_js_path(name: str = "", module_file: str = "") -> str:
"""
get JS file path
:param name: file name
:type name: str
:param module_file: filename
:type module_file: str
:return: 路径
:rtype: str
"""
module_folder = os.path.abspath(os.path.dirname(os.path.dirname(module_file)))
module_json_path = os.path.join(module_folder, "movie", name)
return module_json_path
def _get_file_content(file_name: str = "jm.js"):
"""
read the file content
:param file_name: filename
:type file_name: str
:return: file content
:rtype: str
"""
setting_file_name = file_name
setting_file_path = _get_js_path(setting_file_name, __file__)
with open(setting_file_path) as f:
file_data = f.read()
return file_data
def get_current_week(date: str = "20201019") -> datetime.date:
"""
当前周的周一
:param date: 具体的日期
:type date: str
:return: 当前周的周一
:rtype: datetime.date
"""
monday = datetime.datetime.strptime(date, "%Y%m%d").date()
one_day = datetime.timedelta(days=1)
while monday.weekday() != 0:
monday -= one_day
return monday
def decrypt(origin_data: str = "") -> str:
"""
解密
:param origin_data: 解密前的字符串
:type origin_data: str
:return: 解密后的字符串
:rtype: str
"""
file_data = _get_file_content(file_name="jm.js")
ctx = py_mini_racer.MiniRacer()
ctx.eval(file_data)
data = ctx.call("webInstace.shell", origin_data)
return data
def movie_boxoffice_realtime() -> pd.DataFrame:
"""
电影票房-实时票房
https://ys.endata.cn/BoxOffice/Movie
:return: 实时票房数据
:rtype: pandas.DataFrame
"""
today = datetime.datetime.today().date().strftime("%Y%m%d")
url = "https://www.endata.com.cn/API/GetData.ashx"
payload = {
"showDate": "",
"tdate": f"{today[:4]}-{today[4:6]}-{today[6:]}",
"MethodName": "BoxOffice_GetHourBoxOffice",
}
r = requests.post(url, data=payload)
r.encoding = "utf8"
data_json = json.loads(decrypt(r.text))
temp_df = pd.DataFrame(data_json["Data"]["Table1"])
temp_df = temp_df.iloc[:, :7]
temp_df.columns = [
"排序",
"_",
"影片名称",
"实时票房",
"累计票房",
"上映天数",
"票房占比",
]
temp_df = temp_df[
["排序", "影片名称", "实时票房", "票房占比", "上映天数", "累计票房"]
]
return temp_df
def movie_boxoffice_daily(date: str = "20240219") -> pd.DataFrame:
"""
电影票房-单日票房
https://www.endata.com.cn/BoxOffice/BO/Day/index.html
:param date: 只能设置当前日期的前一天的票房数据
:type date: str
:return: 每日票房
:rtype: pandas.DataFrame
"""
last_date = datetime.datetime.strptime(date, "%Y%m%d") - datetime.timedelta(days=1)
last_date = last_date.strftime("%Y%m%d")
url = "https://www.endata.com.cn/API/GetData.ashx"
payload = {
"sdate": f"{date[:4]}-{date[4:6]}-{date[6:]}",
"edate": f"{last_date[:4]}-{last_date[4:6]}-{last_date[6:]}",
"MethodName": "BoxOffice_GetDayBoxOffice",
}
r = requests.post(url, data=payload)
r.encoding = "utf8"
data_json = json.loads(decrypt(r.text))
temp_df = pd.DataFrame(data_json["Data"]["Table"])
temp_df.columns = [
"排序",
"_",
"影片名称",
"_",
"累计票房",
"平均票价",
"上映天数",
"场均人次",
"_",
"_",
"_",
"_",
"_",
"单日票房",
"环比变化",
"_",
"口碑指数",
]
temp_df = temp_df[
[
"排序",
"影片名称",
"单日票房",
"环比变化",
"累计票房",
"平均票价",
"场均人次",
"口碑指数",
"上映天数",
]
]
return temp_df
def movie_boxoffice_weekly(date: str = "20240218") -> pd.DataFrame:
"""
电影票房-单周票房
https://www.endata.com.cn/BoxOffice/BO/Week/oneWeek.html
:param date: 只能获取指定日期所在完整周的票房数据
:type date: str
:return: 单周票房
:rtype: pandas.DataFrame
"""
url = "https://www.endata.com.cn/API/GetData.ashx"
payload = {
"sdate": get_current_week(date=date).strftime("%Y-%m-%d"),
"MethodName": "BoxOffice_GetWeekInfoData",
}
r = requests.post(url, data=payload)
data_json = json.loads(decrypt(r.text))
temp_df = pd.DataFrame(data_json["Data"]["Table"])
temp_df.columns = [
"排序",
"_",
"影片名称",
"单周票房",
"累计票房",
"_",
"上映天数",
"平均票价",
"场均人次",
"环比变化",
"_",
"_",
"_",
"排名变化",
"口碑指数",
]
temp_df = temp_df[
[
"排序",
"影片名称",
"排名变化",
"单周票房",
"环比变化",
"累计票房",
"平均票价",
"场均人次",
"口碑指数",
"上映天数",
]
]
temp_df["单周票房"] = pd.to_numeric(temp_df["单周票房"], errors="coerce")
temp_df["环比变化"] = pd.to_numeric(temp_df["环比变化"], errors="coerce")
temp_df["累计票房"] = pd.to_numeric(temp_df["累计票房"], errors="coerce")
return temp_df
def movie_boxoffice_monthly(date: str = "20240218") -> pd.DataFrame:
"""
电影票房-单月票房
https://www.endata.com.cn/BoxOffice/BO/Month/oneMonth.html
:param date: 指定日期所在月份的月度票房
:type date: str
:return: 单月票房
:rtype: pandas.DataFrame
"""
url = "https://www.endata.com.cn/API/GetData.ashx"
payload = {
"startTime": f"{date[:4]}-{date[4:6]}-01",
"MethodName": "BoxOffice_GetMonthBox",
}
r = requests.post(url, data=payload)
r.encoding = "utf8"
data_json = json.loads(decrypt(r.text))
temp_df = pd.DataFrame(data_json["Data"]["Table"])
temp_df.columns = [
"排序",
"_",
"影片名称",
"月内天数",
"单月票房",
"平均票价",
"场均人次",
"月度占比",
"上映日期",
"_",
"口碑指数",
]
temp_df = temp_df[
[
"排序",
"影片名称",
"单月票房",
"月度占比",
"平均票价",
"场均人次",
"上映日期",
"口碑指数",
"月内天数",
]
]
temp_df["上映日期"] = pd.to_datetime(temp_df["上映日期"], errors="coerce").dt.date
return temp_df
def movie_boxoffice_yearly(date: str = "20240218") -> pd.DataFrame:
"""
电影票房-年度票房
https://www.endata.com.cn/BoxOffice/BO/Year/index.html
:param date: 当前日期所在年度的票房数据
:type date: str
:return: 年度票房
:rtype: pandas.DataFrame
"""
url = "https://www.endata.com.cn/API/GetData.ashx"
payload = {
"year": f"{date[:4]}",
"MethodName": "BoxOffice_GetYearInfoData",
}
r = requests.post(url, data=payload)
r.encoding = "utf8"
data_json = json.loads(decrypt(r.text))
temp_df = pd.DataFrame(data_json["Data"]["Table"])
temp_df.reset_index(inplace=True)
temp_df.columns = [
"排序",
"_",
"影片名称",
"类型",
"总票房",
"平均票价",
"场均人次",
"国家及地区",
"上映日期",
"_",
]
temp_df["排序"] = range(1, len(temp_df) + 1)
temp_df = temp_df[
[
"排序",
"影片名称",
"类型",
"总票房",
"平均票价",
"场均人次",
"国家及地区",
"上映日期",
]
]
temp_df["上映日期"] = pd.to_datetime(temp_df["上映日期"], errors="coerce").dt.date
return temp_df
def movie_boxoffice_yearly_first_week(date: str = "20201018") -> pd.DataFrame:
"""
电影票房-年度票房-年度首周票房
https://www.endata.com.cn/BoxOffice/BO/Year/firstWeek.html
:param date: 当前日期所在年度的年度首周票房票房数据
:type date: str
:return: 年度首周票房
:rtype: pandas.DataFrame
"""
url = "https://www.endata.com.cn/API/GetData.ashx"
payload = {
"year": f"{date[:4]}",
"MethodName": "BoxOffice_getYearInfo_fData",
}
r = requests.post(url, data=payload)
r.encoding = "utf8"
data_json = json.loads(decrypt(r.text))
temp_df = pd.DataFrame(data_json["Data"]["Table"])
temp_df.reset_index(inplace=True)
temp_df.columns = [
"排序",
"_",
"_",
"影片名称",
"首周票房",
"场均人次",
"上映日期",
"首周天数",
"类型",
"国家及地区",
"_",
"占总票房比重",
]
temp_df["排序"] = range(1, len(temp_df) + 1)
temp_df = temp_df[
[
"排序",
"影片名称",
"类型",
"首周票房",
"占总票房比重",
"场均人次",
"国家及地区",
"上映日期",
"首周天数",
]
]
temp_df["上映日期"] = pd.to_datetime(temp_df["上映日期"], errors="coerce").dt.date
return temp_df
def movie_boxoffice_cinema_daily(date: str = "20240219") -> pd.DataFrame:
"""
电影票房-影院票房-日票房排行
https://www.endata.com.cn/BoxOffice/BO/Cinema/day.html
:param date: 当前日期前一日的票房数据
:type date: str
:return: 影票房-影院票房-日票房排行
:rtype: pandas.DataFrame
"""
url = "https://www.endata.com.cn/API/GetData.ashx"
payload = {
"rowNum1": "1",
"rowNum2": "100",
"date": date,
"MethodName": "BoxOffice_GetCinemaDayBoxOffice",
}
r = requests.post(url, data=payload)
r.encoding = "utf8"
data_json = json.loads(decrypt(r.text))
temp_df = pd.DataFrame(data_json["Data"]["Table"])
temp_df.columns = [
"排序",
"_",
"影院名称",
"单日票房",
"单日场次",
"_",
"_",
"场均票价",
"场均人次",
"上座率",
]
temp_df = temp_df[
["排序", "影院名称", "单日票房", "单日场次", "场均人次", "场均票价", "上座率"]
]
return temp_df
def movie_boxoffice_cinema_weekly(date: str = "20240219") -> pd.DataFrame:
"""
电影票房-影院票房-周票房排行
https://www.endata.com.cn/BoxOffice/BO/Cinema/week.html
:param date: 当前日期前完整一周的票房数据
:type date: str
:return: 影票房-影院票房-轴票房排行
:rtype: pandas.DataFrame
"""
url = "https://www.endata.com.cn/API/GetData.ashx"
payload = {
"dateID": str(
datetime.date.fromisoformat(
f"{date[:4]}-{date[4:6]}-{date[6:]}"
).isocalendar()[1]
- 1
- 41
+ 1128
),
"rowNum1": "1",
"rowNum2": "100",
"MethodName": "BoxOffice_GetCinemaWeekBoxOffice",
}
r = requests.post(url, data=payload)
r.encoding = "utf8"
data_json = json.loads(decrypt(r.text))
temp_df = pd.DataFrame(data_json["Data"]["Table"])
temp_df.columns = [
"排序",
"_",
"影院名称",
"当周票房",
"_",
"单银幕票房",
"场均人次",
"单日单厅票房",
"单日单厅场次",
]
temp_df = temp_df[
[
"排序",
"影院名称",
"当周票房",
"单银幕票房",
"场均人次",
"单日单厅票房",
"单日单厅场次",
]
]
return temp_df
if __name__ == "__main__":
movie_boxoffice_realtime_df = movie_boxoffice_realtime()
print(movie_boxoffice_realtime_df)
movie_boxoffice_daily_df = movie_boxoffice_daily(date="20240219")
print(movie_boxoffice_daily_df)
movie_boxoffice_weekly_df = movie_boxoffice_weekly(date="20240218")
print(movie_boxoffice_weekly_df)
movie_boxoffice_monthly_df = movie_boxoffice_monthly(date="20240218")
print(movie_boxoffice_monthly_df)
movie_boxoffice_yearly_df = movie_boxoffice_yearly(date="20240218")
print(movie_boxoffice_yearly_df)
movie_boxoffice_yearly_first_week_df = movie_boxoffice_yearly_first_week(
date="20201018"
)
print(movie_boxoffice_yearly_first_week_df)
movie_boxoffice_cinema_daily_df = movie_boxoffice_cinema_daily(date="20240219")
print(movie_boxoffice_cinema_daily_df)
movie_boxoffice_cinema_weekly_df = movie_boxoffice_cinema_weekly(date="20240219")
print(movie_boxoffice_cinema_weekly_df)
@@ -0,0 +1,132 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2021/11/15 20:40
Desc: 艺恩
视频放映
电视剧集
综艺节目
https://www.endata.com.cn/Video/index.html
"""
import json
import os
import pandas as pd
import requests
import py_mini_racer
def _get_js_path(name: str = "", module_file: str = "") -> str:
"""
get JS file path
:param name: file name
:type name: str
:param module_file: filename
:type module_file: str
:return: 路径
:rtype: str
"""
module_folder = os.path.abspath(os.path.dirname(os.path.dirname(module_file)))
module_json_path = os.path.join(module_folder, "movie", name)
return module_json_path
def _get_file_content(file_name: str = "jm.js"):
"""
read the file content
:param file_name: filename
:type file_name: str
:return: file content
:rtype: str
"""
setting_file_name = file_name
setting_file_path = _get_js_path(setting_file_name, __file__)
with open(setting_file_path) as f:
file_data = f.read()
return file_data
def decrypt(origin_data: str = "") -> str:
"""
解密艺恩的加密数据
:param origin_data: 解密前的字符串
:type origin_data: str
:return: 解密后的字符串
:rtype: str
"""
file_data = _get_file_content(file_name="jm.js")
ctx = py_mini_racer.MiniRacer()
ctx.eval(file_data)
data = ctx.call("webInstace.shell", origin_data)
return data
def video_tv() -> pd.DataFrame:
"""
艺恩-视频放映-电视剧集
https://www.endata.com.cn/Video/index.html
:return: 电视剧集
:rtype: pandas.DataFrame
"""
url = "https://www.endata.com.cn/API/GetData.ashx"
payload = {"tvType": 2, "MethodName": "BoxOffice_GetTvData_PlayIndexRank"}
r = requests.post(url, data=payload)
r.encoding = "utf8"
data_json = json.loads(decrypt(r.text))
temp_df = pd.DataFrame(data_json["Data"]["Table"])
report_date = data_json["Data"]["Table1"][0]["MaxDate"]
temp_df.columns = [
"排序",
"名称",
"类型",
"播映指数",
"用户热度",
"媒体热度",
"观看度",
"好评度",
]
temp_df = temp_df[
["排序", "名称", "类型", "播映指数", "媒体热度", "用户热度", "好评度", "观看度"]
]
temp_df["统计日期"] = report_date
return temp_df
def video_variety_show() -> pd.DataFrame:
"""
艺恩-视频放映-综艺节目
https://www.endata.com.cn/Video/index.html
:return: 综艺节目
:rtype: pandas.DataFrame
"""
url = "https://www.endata.com.cn/API/GetData.ashx"
payload = {"tvType": 8, "MethodName": "BoxOffice_GetTvData_PlayIndexRank"}
r = requests.post(url, data=payload)
r.encoding = "utf8"
data_json = json.loads(decrypt(r.text))
temp_df = pd.DataFrame(data_json["Data"]["Table"])
report_date = data_json["Data"]["Table1"][0]["MaxDate"]
temp_df.columns = [
"排序",
"名称",
"类型",
"播映指数",
"用户热度",
"媒体热度",
"观看度",
"好评度",
]
temp_df = temp_df[
["排序", "名称", "类型", "播映指数", "媒体热度", "用户热度", "好评度", "观看度"]
]
temp_df["统计日期"] = report_date
return temp_df
if __name__ == "__main__":
video_tv_df = video_tv()
print(video_tv_df)
video_variety_show_df = video_variety_show()
print(video_variety_show_df)