简单爬取猫眼实时票房数据

https://piaofang.maoyan.com/dashboard

# -*- coding: utf-8 -*-
#!/usr/bin/env python
# 猫眼票房:https://piaofang.maoyan.com/dashboard

import os
import time
import datetime
import json
import requests
from lxml import etree

class PF(object):
    def __init__(self):
        self.url = 'https://piaofang.maoyan.com/dashboard-ajax?orderType=0&uuid=173d6dd20a2c8-0559692f1032d2-393e5b09-1fa400-173d6dd20a2c8&riskLevel=71&optimusCode=10'
        self.headers = {
            "Referer": "https://piaofang.maoyan.com/dashboard",
            "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36",
        }

    def main(self):
        '''
        主程序,打印最终结果
        :return:
        '''
        while True:
            # 需在dos命令下运行此文件,才能清屏
            os.system('cls')
            result_json = self.get_parse()
            if not result_json:
                break
            results = self.parse(result_json)
            # 获取时间
            calendar = result_json['calendar']['serverTimestamp']
            t = calendar.split('.')[0].split('T')
            t = t[0] + " " + (datetime.datetime.strptime(t[1], "%H:%M:%S") + datetime.timedelta(hours=8)).strftime("%H:%M:%S")
            print("北京时间:",t)
            x_line = '-' * 155
            # 总票房
            total_box = result_json['movieList']['data']['nationBoxInfo']['nationBoxSplitUnit']['num']
            # 总票房单位
            total_box_unit = result_json['movieList']['data']['nationBoxInfo']['nationBoxSplitUnit']['unit']
            print(f"今日总票房: {total_box} {total_box_unit}", end=f'\n{x_line}\n')
            # print("{:^10}\t{:^23}".format("企业ID", "企业名称"))
            print('电影名称'.ljust(10), '综合票房'.ljust(9), '票房占比'.ljust(9), '场均上座率'.ljust(9), '场均人次'.ljust(9), '排片场次'.ljust(9),
                  '排片占比'.ljust(13), '累积总票房'.ljust(13), '上映天数', sep='\t',end=f'\n{x_line}\n')
            for result in results:
                print(
                    result['movieName'][:10].ljust(9),  # 电影名称
                    result['boxSplitUnit'][:8].rjust(10),  # 综合票房
                    result['boxRate'][:8].rjust(13),  # 票房占比
                    result['avgSeatView'][:8].rjust(13),  # 场均上座率
                    result['avgShowView'][:8].rjust(13),  # 场均人次
                    result['showCount'][:8].rjust(13),  #  '排片场次'
                    result['showCountRate'][:8].rjust(13), # 排片占比
                    result['sumBoxDesc'][:8].rjust(13), # 累积总票房
                    result['releaseInfo'][:8].rjust(13),  # 上映信息
                    sep='\t', end='\n\n'
                )
            time.sleep(4)
    def get_parse(self):
        '''
        网页是否成功获取,频繁操作会有验证
        :return:
        '''
        try:
            response = requests.get(self.url, headers=self.headers)
            if response.status_code == 200:
                # print("success!")
                return response.json()
        except requests.ConnectionError as e:
            print("ERROR:",e)
            return None

    def parse(self,result_json):
        '''
        获取数据
        :return:
        '''
        if result_json:
            movies = result_json['movieList']['data']['list']
            # movies = [{},{},{}]
            # 场均上座率, 场均人次, 票房占比, 电影名称,
            # 上映信息(上映天数), 排片场次, 排片占比, 综合票房,累积总票房
            ticks = ['avgSeatView', 'avgShowView', 'boxRate', 'movieName',
             'releaseInfo', 'showCount', 'showCountRate', 'boxSplitUnit', 'sumBoxDesc']
            for movie in movies:
                self.piaofang = {}
                for tick in ticks:
                    # 数字和单位分开需要join
                    if tick == 'boxSplitUnit':
                        movie[tick] = ''.join([str(i) for i in movie[tick].values()])
                    # 多层字典嵌套
                    if tick == 'movieName' or tick == 'releaseInfo':
                        movie[tick] = movie['movieInfo'][tick]
                    if movie[tick] == '':
                        movie[tick] = '此项数据为空'
                    self.piaofang[tick] = str(movie[tick])
                yield self.piaofang

if __name__ == '__main__':
    pf = PF()
    pf.main()

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值