Python爬取猫眼实时票房数据的实现方法

最近《我不是药神》很火,利用之前写过的程序再次爬取猫眼实时票房

我不是药神 爬取猫眼实时票房

display3D


Python爬取猫眼实时票房数据的实现方法

8 回复

爬取猫眼实时票房数据 - 灵魂的文章 - 知乎
https://zhuanlan.zhihu.com/p/36748808


要爬取猫眼实时票房数据,可以直接请求其数据接口。猫眼的实时票房数据通常通过一个JSON接口提供,我们可以用requests库获取并解析。

首先,安装必要的库:

pip install requests

下面是完整的爬取代码示例:

import requests
import json
from datetime import datetime

def get_maoyan_boxoffice():
    """
    获取猫眼实时票房数据
    返回解析后的数据列表
    """
    # 猫眼实时票房API接口
    url = "https://box.maoyan.com/promovie/api/box/second.json"
    
    # 设置请求头,模拟浏览器访问
    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',
        'Referer': 'https://box.maoyan.com/'
    }
    
    try:
        # 发送GET请求
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()  # 检查请求是否成功
        
        # 解析JSON数据
        data = response.json()
        
        # 提取票房数据
        if data.get('success') and 'data' in data:
            boxoffice_data = data['data']
            
            # 获取实时票房列表
            movie_list = boxoffice_data.get('list', [])
            
            result = []
            for movie in movie_list:
                movie_info = {
                    '排名': movie.get('rank', ''),
                    '电影名称': movie.get('movieName', ''),
                    '实时票房(万)': movie.get('boxInfo', ''),
                    '累计票房(万)': movie.get('sumBoxInfo', ''),
                    '上映天数': movie.get('releaseInfo', ''),
                    '场均人次': movie.get('avgSeatView', ''),
                    '排片占比': movie.get('boxRate', ''),
                    '上座率': movie.get('seatRate', '')
                }
                result.append(movie_info)
            
            # 打印结果
            print(f"数据更新时间: {boxoffice_data.get('updateInfo', '')}")
            print(f"全国总票房: {boxoffice_data.get('nationalBox', {}).get('num', '')}万")
            print("\n实时票房排名:")
            print("-" * 80)
            
            for movie in result:
                print(f"{movie['排名']:2} | {movie['电影名称'][:15]:15} | "
                      f"实时: {movie['实时票房(万)']:8} | "
                      f"累计: {movie['累计票房(万)']:12} | "
                      f"排片: {movie['排片占比']:6}")
            
            return result
            
        else:
            print("获取数据失败")
            return None
            
    except requests.exceptions.RequestException as e:
        print(f"请求出错: {e}")
        return None
    except json.JSONDecodeError as e:
        print(f"JSON解析出错: {e}")
        return None

# 运行爬虫
if __name__ == "__main__":
    print("正在获取猫眼实时票房数据...")
    boxoffice_data = get_maoyan_boxoffice()
    
    # 如果需要保存到文件
    if boxoffice_data:
        with open('maoyan_boxoffice.json', 'w', encoding='utf-8') as f:
            json.dump(boxoffice_data, f, ensure_ascii=False, indent=2)
        print("\n数据已保存到 maoyan_boxoffice.json")

代码说明:

  1. 直接请求猫眼的票房数据API接口,避免解析HTML
  2. 设置合适的请求头模拟浏览器访问
  3. 解析返回的JSON数据,提取关键票房信息
  4. 格式化输出结果,包括排名、电影名称、实时票房、累计票房等
  5. 提供数据保存功能,可将结果保存为JSON文件

这个方法的优点是直接、高效,不需要处理复杂的HTML解析。不过需要注意,网站API接口可能会有变化,如果遇到问题可以检查接口地址是否更新。

简单总结:直接调用API接口是最稳定高效的爬取方式。

差点以为是跟踪电影院剩余票数

不是爬具体某间电影院的票数

看你写的代码就知道你是个 PY 新手。

大部分上座率不到 10%?

平均来看应该是

代码确实还可再优化

回到顶部