Python爬取猫眼电影票房 + 数据可视化

本文展示了如何用Python编写爬虫抓取猫眼电影票房数据,涉及加密解密技术,然后对数据进行整理并用Pyecharts进行上座率、场均人次和票房占比的可视化分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

🌟欢迎来到 我的博客 —— 探索技术的无限可能!


🌟博客的简介(文章目录)

在这里插入图片描述

主角查看与分析 爬取

对猫眼电影票房进行爬取,首先我们打开猫眼


接着我们想要进行数据抓包,就要看网站的具体内容,通过按F12,我们可以看到详细信息。
在这里插入图片描述

通过两个对比,我们不难发现User-AgentsignKey数据是变化的(平台使用了数据加密)
在这里插入图片描述
所以我们需要对User-Agent与signKey分别进行解密。

通过造一个content字符串,包含请求方法、时间戳、User-Agent、index等信息,并对其进行MD5加密得到sign。最后将这些参数放入params字典中,准备发送请求。

def getData():
    url = 'https://piaofang.maoyan.com/dashboard-ajax/movie'
    useragents = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.183'
    headers = {
        'User-Agent':useragents,
        'Referer':'https://piaofang.maoyan.com/dashboard/movie'
    }

    useragents = str(base64.b64encode(useragents.encode('utf-8')),'utf-8')
    index = str(round(random.random() * 1000))
    times = str(math.ceil(time.time() * 1000))
    content = "method=GET&timeStamp={}&User-Agent={}&index={}&channelId=40009&sVersion=2&key=A013F70DB97834C0A5492378BD76C53A".format(times,useragents,index)
    md5 = hashlib.md5()
    md5.update(content.encode('utf-8'))
    sign = md5.hexdigest()

    params = {
        'orderType': '0',
        'uuid': '17d79b87a00c8-015087c7514df4-5919145b-144000-17d79b87a00c8',
        # 时间戳
        'timeStamp': times,
        # base64加密
        'User-Agent': useragents,
        # 随机数 * 1000取整
        'index': index,
        'channelId': '40009',
        'sVersion': '2',
        # md5加密
        'signKey': sign
    }

接着我们就可以对于猫眼电影票房数据进行爬取了,比如上座率、场均人次、票房占比、电影名称、上映时间、综合票房、排片场次和排片占比等。

    resps = requests.get(url = url , headers = headers, params = params).json()
    # print(resps)
    # 上座率数据缺省值这么使用数据
    data_avgSeatView = jsonpath.jsonpath(resps, '$..avgSeatView')
    # print(data_avgSeatView)
    # 场均人次
    data_avgShowView=jsonpath.jsonpath(resps,'$..avgShowView')
    # 票房占比
    data_boxRate=jsonpath.jsonpath(resps,'$..boxRate')
    # 电影名称
    data_name=jsonpath.jsonpath(resps,'$..movieName')
    # 上映时间
    data_time=jsonpath.jsonpath(resps,'$..releaseInfo')
    # 综合票房
    data_sumBoxDesc=jsonpath.jsonpath(resps,'$..sumBoxDesc')
    # 排片场次
    data_showCount=jsonpath.jsonpath(resps,'$..showCount')
    # 排片占比
    data_showCountRate=jsonpath.jsonpath(resps,'$..showCountRate')
    data={'电影名称':data_name,'上映时间':data_time,'上座率':data_avgSeatView,'场均人次':data_avgShowView,
                     '票房占比':data_boxRate,'综合票房':data_sumBoxDesc,'排片场次':data_showCount,'排片占比':data_showCountRate}
    df = pd.DataFrame(pd.DataFrame.from_dict(data, orient='index').values.T, columns=list(data.keys()))
    print(df)
    df.to_csv("猫眼电影1.csv",index=False,encoding='utf-8')

通过DataFrame输出到控制台我们可以看到爬取成功。
在这里插入图片描述

可视化分析

import pandas as pd
data=pd.read_csv("猫眼电影1.csv")

在这里插入图片描述

数据缺省值处理

# 去除空值
data.dropna(inplace=True)
data

在这里插入图片描述

猫眼电影上座率前10分析

data_sorted = data.sort_values(by='上座率', ascending=False)
data_top10=data_sorted.head(10)
data_top10

在这里插入图片描述

data_top10['电影名称'].tolist()

在这里插入图片描述

percentage=data_top10['上座率'].tolist()
data_shangan=[percentage.replace("%", "") for percentage in percentage]
data_shangan

在这里插入图片描述

from pyecharts.charts import Bar,Line,Map,Page,Pie  
from pyecharts import options as opts 
from pyecharts.globals import SymbolType
from pyecharts.charts import Bar
# from pyecharts.charts import opts
#条形图  
#bar1 = Bar(init_opts=opts.InitOpts(width='1350px', height='750px')) 
bar1 = Bar() 
bar1.add_xaxis(data_top10['电影名称'].tolist())
bar1.add_yaxis('', data_shangan) 
bar1.set_global_opts(title_opts=opts.TitleOpts(title='猫眼电影上座率前10分析'),
                     xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),
                     visualmap_opts=opts.VisualMapOpts(max_=28669)
                    ) 

bar1.render_notebook()

在这里插入图片描述

猫眼电影票房场均人次前10分析

data_sum = data.groupby('电影名称')['场均人次'].sum().sort_values(ascending=False)
data_sum[:10]

在这里插入图片描述

bar3 = Bar() 
bar3.add_xaxis(data_sum[:10].index.tolist())
bar3.add_yaxis('', data_sum[:10].values.tolist())
bar3.set_global_opts(title_opts=opts.TitleOpts(title='猫眼电影票房场均人次前10分析'),
                     visualmap_opts=opts.VisualMapOpts(max_=900)) 
bar3.render_notebook()

在这里插入图片描述

猫眼电影票票房占比分析

data_pf= data.groupby('电影名称')['票房占比'].sum().sort_values(ascending=False)
data_pfzb=data_pf.tail(24)
data_pfzb.head(10)

在这里插入图片描述

data_pftop10 =  [list(z) for z in zip(data_pf.index.tolist(), data_pf.values.tolist())]

# 绘制饼图
pie1 = Pie()
pie1.add('', data_pftop10, radius=['35%', '60%'])
pie1.set_global_opts(title_opts=opts.TitleOpts(title='猫眼电影票票房占比分析'), 
                     legend_opts=opts.LegendOpts(orient='vertical', pos_top='15%', pos_left='2%'))
pie1.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%"))
pie1.set_colors(['#EF9050', '#3B7BA9', '#6FB27C', '#FFAF34', '#D8BFD8', '#00BFFF', '#7FFFAA'])
pie1.render_notebook() 

在这里插入图片描述

### 使用Python爬虫抓取猫眼电影票房数据 为了从猫眼电影网站上获取电影票房数据,可以采用多种方法和技术栈来实现这一目标。下面将详细介绍一种基于`requests`和`BeautifulSoup`库的方式来进行网页内容解析并提取所需信息。 #### 准备工作 首先安装必要的第三方模块: ```bash pip install requests beautifulsoup4 lxml ``` 接着定义请求头模拟浏览器访问行为以避免被反爬机制阻止: ```python import requests from bs4 import BeautifulSoup headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } url = "https://maoyan.com/films?showType=3" response = requests.get(url=url, headers=headers) html_content = response.text ``` #### 解析页面结构 利用`BeautifulSoup`对象加载HTML文档,并定位到包含每部影片详情链接的位置。这里假设要收集的信息有:片名、导演、演员阵容以及累计票房等字段。 ```python soup = BeautifulSoup(html_content, 'lxml') films_list = soup.find_all('div', class_='movie-item-info') for film in films_list[:10]: # 只遍历前十个作为例子 title_tag = film.select_one('.name a') # 获取电影名字标签 movie_url = f"https://maoyan.com{title_tag['href']}" if title_tag else None detail_response = requests.get(movie_url, headers=headers).text detail_soup = BeautifulSoup(detail_response, 'lxml') try: box_office = detail_soup.find('span', attrs={'class':'stonefont'}).get_text(strip=True) print(f"{title_tag.get_text()} 的累计票房为 {box_office}") except AttributeError as e: print(e) ``` 上述代码片段展示了如何构建HTTP GET 请求发送给服务器端口从而获得响应体中的 HTML 文档;再借助于 `find()` 或者更灵活的选择器语法如 CSS Selector 来精确定位 DOM 节点进而读取出特定属性值或文本节点的内容[^1]。 需要注意的是,在实际操作过程中可能还会遇到其他挑战比如动态加载更多内容的情况,则需要用到像 Selenium 这样的工具去驱动真实的 Web 浏览器实例执行 JavaScript 并等待异步事件完成后才能继续下一步的操作[^5]。 另外值得注意的一点是,当涉及到商业利益相关联的数据时,请务必确认自己拥有合法权限后再行动,尊重版权方权益[^2]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZShiJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值