项目概述
本项目是一个完整的电影票房数据采集、存储与分析可视化系统。后端采用 Python Flask 框架搭建,数据持久化使用 MySQL,前端可视化依托 Echarts 实现,并通过 Selenium 和 Requests 库完成从艺恩电影票房网的数据抓取。
系统旨在解决电影行业数据分散、查询不便的问题,提供从实时采集到多维分析的全流程闭环。用户不仅可以查看实时的票房排名,还能通过图表直观了解地区分布、月份趋势及类型占比等关键指标。
核心功能模块
- 地区票房占有率分析:利用环形图展示各地区票房占比,支持鼠标悬停查看详细数值。
- 月份票房分析:通过横向条形图呈现月度票房走势,便于观察季节性波动。
- 电影类型票房占有率:使用玫瑰图对比不同题材的票房表现。
- 首页概览:集成票房 Top20、场均人次排名等快捷入口,快速掌握市场热点。
- 实时票房排名:支持按年份筛选,以表格形式展示影片名称、总票房、平均票价等详细信息。
- 采集日志与数据管理:记录每次爬取的操作人、时间、数据条数及目标地址,确保数据来源可追溯。
- 在线数据采集环境:内置 Python 代码编辑与运行界面,方便开发者直接修改爬虫脚本并执行。
界面交互设计
系统界面注重数据的直观呈现。在地区票房分析页面,环形图的扇区颜色区分明显,交互反馈灵敏;月份分析则侧重于时间序列的对比,条形长度直接反映票房规模。首页作为导航中枢,聚合了所有核心分析模块的入口,顶部导航栏保持全局一致,确保操作流畅。



技术实现细节
爬虫逻辑
数据采集是系统的核心环节。我们使用 Selenium 模拟浏览器行为,因为艺恩网的票房数据往往需要动态加载或依赖下拉菜单选择年份。以下是核心爬虫脚本的实现思路:
首先初始化 Chrome 驱动,访问目标 URL。接着定位年份下拉菜单,通过循环遍历选项来抓取不同年份的数据。这里需要注意设置合理的等待时间(time.sleep),避免请求过快被反爬机制拦截。
from selenium import webdriver
from selenium.webdriver.support.ui import Select
import sys
sys.path.append('utils')
import mysqlHelper
import datetime
time
():
web = webdriver.Chrome()
web.get()
sel_list = web.find_element_by_xpath()
sel = Select(sel_list)
movie_id = []
movie_name = []
movie_type = []
movie_sale_number = []
movie_average_sale = []
movie_average_people = []
movie_country = []
movie_online_time = []
movie_year = []
startTime = datetime.datetime.now().strftime() + + time.strftime()
s ((sel.options)):
sel.select_by_index(s)
time.sleep()
tr_list = web.find_elements_by_xpath()
tr ((tr_list)):
ele_sel = web.find_element_by_xpath()
year = ele_sel.get_attribute()
money = tr_list[tr].find_element_by_xpath().text
money = money.replace(, )
movie_id.append(tr_list[tr].find_element_by_xpath().text)
movie_name.append(tr_list[tr].find_element_by_xpath().text)
movie_type.append(tr_list[tr].find_element_by_xpath().text)
movie_sale_number.append(money)
movie_average_sale.append(tr_list[tr].find_element_by_xpath().text)
movie_average_people.append(tr_list[tr].find_element_by_xpath().text)
movie_country.append(tr_list[tr].find_element_by_xpath().text)
movie_online_time.append(tr_list[tr].find_element_by_xpath().text)
movie_year.append(year)
()
web.close()
rows = (movie_id, movie_name, movie_type, movie_sale_number, movie_average_sale,
movie_average_people, movie_country, movie_online_time, movie_year)
mysql = mysqlHelper.get_a_conn()
sql =
mysql.fetchall(sql)
row rows:
(row)
sql = % row
mysql.execute(sql)
()
endTime = datetime.datetime.now().strftime() + + time.strftime()
url =
user_name = username
sql =
result = mysql.fetchall(sql)
data_num = result[].get()
sql = % (user_name, startTime, endTime, data_num, url)
mysql.execute(sql)
__name__ == :
getData1()


