前言

前面构造了movieList数据集,但对于我们人为的去读取不是很友好,所以我们将调整其存放格式,并保存为csv文件。


数据构造

从movieList的结构我们可以看出,它是一个有元组构成的列表,为了方便查看我们将让他存储为DataFrame,并以日期作为索引。

新增一个构造DataFrame的方法,参数为movieList和日期:

def buildDataFrame(movieList, date):index = [date for i in range(len(movieList))]df = pd.DataFrame(movieList, columns=['name', 'box', 'boxRatio', 'playRatio', 'attendance'], index=index)df['box'] = df['box'].astype('float64')return df

再执行看一下效果

if __name__ == "__main__":data = getData(url)html = getHtml(data)movieList = parseHtml(html)df = buildDataFrame(movieList, '2017-08-01')print df

输出结果为

In [92]: runfile('C:/Users/Administrator/.spyder2/temp.py', wdir='C:/Users/Administrator/.spyder2')name       box boxRatio playRatio attendance
2017-08-01           战狼2  29249.43    86.3%     56.4%      42.4%
2017-08-01          建军大业   3248.29     9.6%     22.3%      19.3%
2017-08-01         神偷奶爸3    464.67     1.4%      4.7%      13.7%
2017-08-01   大耳朵图图之美食狂想曲    225.61     0.7%      3.9%      10.0%
2017-08-01    绣春刀II:修罗战场    186.07     0.5%      3.0%      11.4%
2017-08-01          闪光少女    137.56     0.4%      1.4%      15.6%
2017-08-01           悟空传    130.83     0.4%      2.2%      10.2%
2017-08-01           豆福传     66.90     0.2%      2.8%       6.9%
2017-08-01          父子雄兵     44.96     0.1%      0.9%      11.4%
2017-08-01           大护法     29.90     0.1%      0.4%      10.5%
2017-08-01          阿唐奇遇     23.77     0.1%      0.5%       9.8%
2017-08-01          夜半凶铃     17.66     0.1%      0.7%       9.1%
2017-08-01          血战湘江     17.26     0.1%      0.0%      64.3%
2017-08-01       京城81号II      9.74     0.0%      0.2%       9.3%
2017-08-01  绿野仙踪之奥兹国奇幻之旅      7.40     0.0%      0.2%       6.9%
2017-08-01         深夜食堂2      7.34     0.0%      0.1%      12.1%
2017-08-01      地球:神奇的一天      4.25     0.0%      0.0%       100%
2017-08-01          冈仁波齐      4.04     0.0%      0.1%      12.2%
2017-08-01           李三娘      2.26     0.0%      0.0%      70.2%
2017-08-01           喵星人      2.06     0.0%      0.1%      10.1%
2017-08-01            战狼      1.75     0.0%      0.0%       5.5%
2017-08-01           鲛珠传      1.73     0.0%      0.0%       100%
2017-08-01         阳光萌星社      1.64     0.0%      0.0%      69.4%
2017-08-01         我是马布里      1.60     0.0%      0.0%      76.7%
2017-08-01         重返·狼群      1.59     0.0%      0.0%       9.5%

我们可以看到,这种展示对于我们来说就非常友好了。

我们尝试找一下2017-08-01当天票房超过100W的电影

In [93]: df[df.box > 100]
Out[93]: name       box boxRatio playRatio attendance
2017-08-01          战狼2  29249.43    86.3%     56.4%      42.4%
2017-08-01         建军大业   3248.29     9.6%     22.3%      19.3%
2017-08-01        神偷奶爸3    464.67     1.4%      4.7%      13.7%
2017-08-01  大耳朵图图之美食狂想曲    225.61     0.7%      3.9%      10.0%
2017-08-01   绣春刀II:修罗战场    186.07     0.5%      3.0%      11.4%
2017-08-01         闪光少女    137.56     0.4%      1.4%      15.6%
2017-08-01          悟空传    130.83     0.4%      2.2%      10.2%

获取多天数据

时间参数化

为了获取多天数据,我们就需要将url中的日期参数进行参数化传入。

修改我们的getData方法,并将名字改为getDataByDate:

def getDataByDate(date):url = 'https://piaofang.maoyan.com/dayoffice?date=%s&cnt=10' % dateheaders={"authority": "piaofang.maoyan.com","method": "GET","path": "/dayoffice?date=%s&cnt=10" % date,"scheme": "https","accept": "*/*","accept-encoding": "gzip, deflate, br","accept-language": "zh-CN,zh;q=0.8","referer": "https://piaofang.maoyan.com/?date=%s" % date,"uid": "e4e5902fc42ad5e198b207d76af1d82e7056cb82","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36","x-requested-with": "XMLHttpRequest"}req = requests.get(url, headers=headers)return req.content

然后我们获取2017-08-02的数据

if __name__ == "__main__":day = '2017-08-02'data = getDataByDate(day)html = getHtml(data)movieList = parseHtml(html)df = buildDataFrame(movieList, day)print df

输出结果为:

In [107]: runfile('C:/Users/Administrator/.spyder2/temp.py', wdir='C:/Users/Administrator/.spyder2')name       box boxRatio playRatio attendance
2017-08-02           战狼2  27898.31    88.8%     59.1%      39.2%
2017-08-02          建军大业   2229.18     7.1%     20.4%      15.5%
2017-08-02         神偷奶爸3    431.69     1.4%      4.8%      12.8%
2017-08-02   大耳朵图图之美食狂想曲    203.25     0.6%      3.8%       9.4%
2017-08-02    绣春刀II:修罗战场    168.69     0.5%      2.8%      11.3%
2017-08-02          闪光少女    122.52     0.4%      1.4%      14.4%
2017-08-02           悟空传    108.73     0.3%      2.0%       9.6%
2017-08-02           豆福传     59.12     0.2%      2.5%       7.0%
2017-08-02          父子雄兵     41.56     0.1%      0.8%      11.9%
2017-08-02          血战湘江     27.31     0.1%      0.0%      61.7%
2017-08-02           大护法     25.56     0.1%      0.4%      10.3%
2017-08-02          阿唐奇遇     21.95     0.1%      0.5%       8.5%
2017-08-02          夜半凶铃     15.29     0.0%      0.6%       9.3%
2017-08-02       京城81号II      8.72     0.0%      0.2%       8.4%
2017-08-02         皮绳上的魂      7.07     0.0%      0.0%      99.2%
2017-08-02  绿野仙踪之奥兹国奇幻之旅      5.30     0.0%      0.2%       6.3%
2017-08-02         我是马布里      4.38     0.0%      0.0%      93.1%
2017-08-02         深夜食堂2      4.31     0.0%      0.1%       9.5%
2017-08-02          冈仁波齐      4.25     0.0%      0.1%      13.0%
2017-08-02           李三娘      3.86     0.0%      0.0%      69.3%
2017-08-02         阳光萌星社      2.30     0.0%      0.0%      65.6%
2017-08-02           喵星人      2.25     0.0%      0.1%      13.1%
2017-08-02           破·局      1.93     0.0%      0.0%      75.2%
2017-08-02           龙之战      1.52     0.0%      0.0%      98.0%
2017-08-02         重返·狼群      1.46     0.0%      0.0%      10.3%
2017-08-02            战狼      1.37     0.0%      0.0%       1.7%
2017-08-02         穆桂英挂帅      1.12     0.0%      0.0%       100%

获取时间范围数据

现在获取特定日期的数据已经实现了,那么我们再进一步抽象和封装,可以获取指定时间范围的数据

增加一个方法用于构造日期的列表

from datetime import date, timedeltadef buildDates(start, days):day = timedelta(days=1)for i in range(days):yield start + day*i

将原来main函数里的执行逻辑进行封装,封装为一个新的getData方法,用于获取指定日期范围内的所有数据

def getData(Y, M, D, days):    start = date(Y, M, D)df = pd.DataFrame()for d in buildDates(start, days):day = str(d)data = getDataByDate(day)html = getHtml(data)movieList = parseHtml(html)temp = buildDataFrame(movieList, day)df = df.append(temp)return df

在主函数里执行下看看效果,获取从2017-08-01至2017-08-03的数据:

if __name__ == "__main__":df = getData(2017, 8, 1, 3)print df

执行结果如下:

runfile('C:/Users/Administrator/.spyder2/temp.py', wdir='C:/Users/Administrator/.spyder2')name       box boxRatio playRatio attendance
2017-08-01           战狼2  29249.43    86.3%     56.4%      42.4%
2017-08-01          建军大业   3248.29     9.6%     22.3%      19.3%
2017-08-01         神偷奶爸3    464.67     1.4%      4.7%      13.7%
2017-08-01   大耳朵图图之美食狂想曲    225.61     0.7%      3.9%      10.0%
2017-08-01    绣春刀II:修罗战场    186.07     0.5%      3.0%      11.4%
2017-08-01          闪光少女    137.56     0.4%      1.4%      15.6%
2017-08-01           悟空传    130.83     0.4%      2.2%      10.2%
2017-08-01           豆福传     66.90     0.2%      2.8%       6.9%
2017-08-01          父子雄兵     44.96     0.1%      0.9%      11.4%
2017-08-01           大护法     29.90     0.1%      0.4%      10.5%
2017-08-01          阿唐奇遇     23.77     0.1%      0.5%       9.8%
2017-08-01          夜半凶铃     17.66     0.1%      0.7%       9.1%
2017-08-01          血战湘江     17.26     0.1%      0.0%      64.3%
2017-08-01       京城81号II      9.74     0.0%      0.2%       9.3%
2017-08-01  绿野仙踪之奥兹国奇幻之旅      7.40     0.0%      0.2%       6.9%
2017-08-01         深夜食堂2      7.34     0.0%      0.1%      12.1%
2017-08-01      地球:神奇的一天      4.25     0.0%      0.0%       100%
2017-08-01          冈仁波齐      4.04     0.0%      0.1%      12.2%
2017-08-01           李三娘      2.26     0.0%      0.0%      70.2%
2017-08-01           喵星人      2.06     0.0%      0.1%      10.1%
2017-08-01            战狼      1.75     0.0%      0.0%       5.5%
2017-08-01           鲛珠传      1.73     0.0%      0.0%       100%
2017-08-01         阳光萌星社      1.64     0.0%      0.0%      69.4%
2017-08-01         我是马布里      1.60     0.0%      0.0%      76.7%
2017-08-01         重返·狼群      1.59     0.0%      0.0%       9.5%
2017-08-02           战狼2  27898.31    88.8%     59.1%      39.2%
2017-08-02          建军大业   2229.18     7.1%     20.4%      15.5%
2017-08-02         神偷奶爸3    431.69     1.4%      4.8%      12.8%
2017-08-02   大耳朵图图之美食狂想曲    203.25     0.6%      3.8%       9.4%
2017-08-02    绣春刀II:修罗战场    168.69     0.5%      2.8%      11.3%
...                  ...       ...      ...       ...        ...
2017-08-02           龙之战      1.52     0.0%      0.0%      98.0%
2017-08-02         重返·狼群      1.46     0.0%      0.0%      10.3%
2017-08-02            战狼      1.37     0.0%      0.0%       1.7%
2017-08-02         穆桂英挂帅      1.12     0.0%      0.0%       100%
2017-08-03           战狼2  22786.77    54.7%     44.7%      43.4%
2017-08-03      三生三世十里桃花  16933.81    40.7%     32.2%      43.7%
2017-08-03          建军大业   1186.55     2.8%     10.2%      16.7%
2017-08-03         神偷奶爸3    259.93     0.6%      3.2%      10.4%
2017-08-03   大耳朵图图之美食狂想曲    134.45     0.3%      2.4%       9.1%
2017-08-03          闪光少女     58.17     0.1%      0.7%      11.8%
2017-08-03    绣春刀II:修罗战场     53.99     0.1%      1.1%       8.6%
2017-08-03          谁是球王     51.46     0.1%      2.0%      28.5%
2017-08-03           心理罪     33.21     0.1%      0.0%      88.4%
2017-08-03           豆福传     26.74     0.1%      1.2%       5.7%
2017-08-03           悟空传     26.13     0.1%      0.7%       7.0%
2017-08-03          血战湘江     24.51     0.1%      0.0%      49.9%
2017-08-03          阿唐奇遇     12.50     0.0%      0.3%       7.8%
2017-08-03          父子雄兵     11.56     0.0%      0.3%       8.8%
2017-08-03           大护法     10.00     0.0%      0.2%       8.0%
2017-08-03          夜半凶铃      7.45     0.0%      0.3%       8.0%
2017-08-03         我是马布里      6.35     0.0%      0.0%      41.6%
2017-08-03           李三娘      3.60     0.0%      0.0%       0.0%
2017-08-03  绿野仙踪之奥兹国奇幻之旅      3.01     0.0%      0.1%       5.5%
2017-08-03         阳光萌星社      2.69     0.0%      0.0%      66.2%
2017-08-03       京城81号II      2.15     0.0%      0.1%       9.1%
2017-08-03          冈仁波齐      1.94     0.0%      0.0%      10.0%
2017-08-03         深夜食堂2      1.45     0.0%      0.0%       8.6%
2017-08-03            战狼      1.19     0.0%      0.0%       4.7%
2017-08-03           喵星人      1.17     0.0%      0.0%      19.8%
2017-08-03         重返·狼群      1.10     0.0%      0.0%      11.7%[78 rows x 5 columns]

保存为csv文件

将DataFrame保存为CSV文件很简单,直接使用DataFrame中的方法to_csv就行

def writeToCSV(df, path):df.to_csv(path)

主函数内调用该方法,将三天的数据存入csv文件中

if __name__ == "__main__":df = getData(2017, 8, 1, 3)writeToCSV(df, 'data\out.csv')

执行完成后可以看到指定目录下,新增了out.csv文件,打开后可以看到我们的数据都被存入了。


完整代码

为了后面好操作,已将占比都改为了数字,本节完整代码如下:

#-*- coding: utf-8 -*-import json
import re
import requests
import pandas as pd
from datetime import date, timedeltadef getHtml(jsonData):data = json.loads(jsonData)return data['ticketList'].encode('utf-8').replace('\n', '').replace(' ','')def parseHtml(html):reg = r"<ul.+?><liclass='c1'><b>(.+?)</b>.+?</li>"reg += r"<liclass=\"c2\"><b>(.+?)</b>.+?</li>"reg += r"<liclass=\"c3\">(.+?)%</li>"reg += r"<liclass=\"c4\">(.+?)%</li>"reg += r"<liclass=\"c5\"><spanstyle=\"margin-right:-.1rem\">(.+?)%</span>"pattern = re.compile(reg)movieList = re.findall(pattern, html)return movieListdef getDataByDate(date):    url = 'https://piaofang.maoyan.com/dayoffice?date=%s&cnt=10' % dateheaders={"authority": "piaofang.maoyan.com","method": "GET","path": "/dayoffice?date=%s&cnt=10" % date,"scheme": "https","accept": "*/*","accept-encoding": "gzip, deflate, br","accept-language": "zh-CN,zh;q=0.8","referer": "https://piaofang.maoyan.com/?date=%s" % date,"uid": "e4e5902fc42ad5e198b207d76af1d82e7056cb82","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36","x-requested-with": "XMLHttpRequest"}req = requests.get(url, headers=headers)return req.contentdef buildDataFrame(movieList, date):index = [date for i in range(len(movieList))]df = pd.DataFrame(movieList, columns=['name', 'box', 'boxRatio', 'playRatio', 'attendance'], index=index)df['box'] = df['box'].astype('float64')df['boxRatio'] = df['boxRatio'].astype('float64')df['playRatio'] = df['playRatio'].astype('float64')df['attendance'] = df['attendance'].astype('float64')return dfdef buildDates(start, days):day = timedelta(days=1)for i in range(days):yield start + day*idef getData(Y, M, D, days):    start = date(Y, M, D)df = pd.DataFrame()for d in buildDates(start, days):day = str(d)data = getDataByDate(day)html = getHtml(data)movieList = parseHtml(html)temp = buildDataFrame(movieList, day)df = df.append(temp)return dfdef writeToCSV(df, path):df.to_csv(path)if __name__ == "__main__":df = getData(2017, 8, 1, 3)print dfwriteToCSV(df, 'data\out.csv')

实战:战狼2票房数据分析——(2)票房数据构造及保存相关推荐

  1. 实战:战狼2票房数据分析——(3)数据读取及分析

    前言 前面我们已经成功的把数据从网站上抓取下来并存入了csv文件当中,那么本章就演练将数据从csv中读取出来,并作相应的分析 数据读取 可以使用pandas的函数read_csv来读取数据,默认情况下 ...

  2. 实战:战狼2票房数据分析——(1)数据获取及解析

    前言 战狼最近大火,为了紧跟热度,根据之前学的做一个关于战狼2票房售卖情况的数据分析. 要做数据分析,首先要有数据,数据从哪儿来呢? 网上有专门做票房时时统计的网站,他们会把最新的票发信息公布在网上, ...

  3. python电影数据分析报告_【python数据分析实战】电影票房数据分析(二)数据可视化...

    在上一部分<[python数据分析实战]电影票房数据分析(一)数据采集> 已经获取到了2011年至今的票房数据,并保存在了mysql中. 本文将在实操中讲解如何将mysql中的数据抽取出来 ...

  4. 战狼5天票房10亿,吴京抵押房产贷款赚大了

    近几天要数最火的是什么,肯定是2017阅兵和<战狼2 >的火爆观影潮,一声"开火"引爆了这个夏天的热情. 由吴京导演和主演的<战狼2>上映5天,累计票房已经 ...

  5. 大赞 《战狼2》破40亿 刷新华语票房纪录

    鑫飞资讯 上映不到十天票房突破31亿,继打破<美人鱼>33.9亿登顶华语电影票房总冠军后,截至8月10日,<战狼2>票房突破40亿大关,再次刷新纪录鑫飞. <战狼2> ...

  6. 《战狼》背后的大数据分析

    最近几天<战狼2>票房纪录一遍一遍地刷新票房纪录,<战狼2>已超越2016年票房第一的<美人鱼>,登顶华语电影票房冠军. 笔者将从以下3个角度进行分析: 全网的舆情 ...

  7. Python-Django毕业设计影城在线售票及票房数据分析系统(程序+Lw)

    该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行 环境配置: Pychram社区版+ python3.7.7 + Mysql5.7 + HBuilderX+list pip+N ...

  8. Python爬虫实战:分析《战狼2》豆瓣影评

    一.介绍: 环境:win10 ,jupyter notebook, python3.6,,re, bs4,requests 爬取豆瓣电影<战狼2> 主页: https://movie.do ...

  9. DataEase看中国 - 中国影星“成龙”电影票房数据分析

    背景介绍 说起成龙,我们并不陌生,著名的动作明星.以武打动作片出道,凭借动作片<红番区>打入好莱坞,该片打破北美外语片票房纪录.         目前,由成龙.郭麒麟等主演的新片<龙 ...

最新文章

  1. Thrown KeeperErrorCode = Unimplemented for /services exception
  2. VTK:Parallel之ExodusIIWriter
  3. navicat 导入SQL文件出错
  4. nyoj 寻找最大数
  5. mysql-proxy完成mysql读写分离
  6. NSValue包装自定义结构体
  7. php符号 set,PHP 符号大全
  8. object.\__mro__
  9. Startup Script for Python(x,y)
  10. MySQL数据库的红黑树优化_为什么Mysql用B+树做索引而不用B-树或红黑树
  11. 安卓9 怎么运行老程序_PLC怎么连接电脑?怎么把在电脑编程好的程序放入PLC运行?...
  12. 《智能计算系统》课程报告——《An Efficient FPGA Accelerator Optimized for High Throughput Sparse CNN Inference》学习笔记
  13. mysql 递归查找父节点_MySQL递归查询父子节点
  14. 筱筱看博客(uni-app、mumu模拟器、真机测试)
  15. 四川大学计算机学院管理手册,机房管理_规章制度_计算机基础教学实验中心 - Powered by 四川大学计算机基础教学实验中心...
  16. 踩坑系列之 memcache的有效期
  17. 男人很容易喜欢一个女人,却不轻易深爱一个女人。
  18. routeDone with a webviewId 12 that is not the current page(env: Windows,mp,1.06.2301040; lib: 2.30.0
  19. 安装 window10 系统
  20. python之拉格朗日插值算法完成计算

热门文章

  1. DDR3及DDR4的传输带宽
  2. 腾讯云企业网盘正式入驻数字工具箱
  3. xorDecode 解密
  4. 接口测试 - 从0不到1的心路历程 (二)
  5. Python按键精灵自动化
  6. WAV文件格式解析及处理
  7. 辽宁计算机考研学校二本,二本院校逆袭985到底有多难?
  8. Ubuntu16.04下安装MATLAB 2016b!完美运行
  9. Robocup新手指南
  10. c语言位数组如何实现,C语言实现位数组(bit数组)与位数组的简单应用举例