作者:小李子,某外企分析师,主要从事IT行业,但个人非常喜欢电影市场分析,所以经常会写一些电影领域的文章。

博客:http://blog.sina.com.cn/leonmovie

不知不觉又过了一年,挥别2019,让我们拥抱这全新的2020,祝各位新年快乐!

最近在处理一些和有关电影的工作,需要用到一些北美电影票房数据,而这部分数据最权威的网站当属Box Office Mojo(以下简称BOM),于是就上去查看了一下。估计经常关注这个网站的盆友们都知道,这个网站最近刚刚进行了改版,网页排版全面更新,还专门针对移动设备进行了优化(以前的网站页面只有电脑版的),页面虽然好看了不少,但却少了很多数据,之前的网站几乎所有数据都能查到,而现在则只能查到部分数据,有些数据则要到BOM Pro版才能查到,而这个服务是收费的。为了更好地使用数据,还想不花钱,那就只有自己动手丰衣足食,所以笔者就自己写了个Python爬虫,爬取了过去多年的票房数据。以下就以“北美票房每日票房数据”为例,介绍一下如何爬取,其他票房数据类似,只需修改少数代码即可。

图一 要抓取的部分网页的截图

这个爬虫程序完全采用Python语言完成,使用软件为Anaconda 2019.10版(这个目前是最新版的,理论上其包含的各种Python库也是最新的或接近最新的,所以下面的爬虫程序在部分老版软件上可能会出问题,如有问题请及时更新)。爬虫程序主要包括两部分:爬取并存储数据,以及根据数据简单绘制图片。下面就一一讲解一下。

一、爬取和存储数据

首先把需要的包都导入进来。

import requests
import pandas as pd
import time
import matplotlib.pyplot as plt
import matplotlib.dates as mdate
import pylab as mpl  # 导入中文字体,避免显示乱码

这个是我们要用到的每日票房的URL,中间的%s是一会儿要替换的年份

urltemplate = r'https://www.boxofficemojo.com/daily/%s/?view=year'

这个是数据保存的地方,放在了桌面的一个Excel文档中,因为数据很少,所以根本用不到数据库,Excel足以,当然这里也可以用CSV格式。这里我的路径中包含中文,使用时没有问题,如果大家出现问题,最好使用英文路径。

fileLoc = r'C:\Users\leon\Desktop\BoxOffice\Box Office Mojo票房爬虫\Daily-每日\daily-data.xlsx'

这个是爬虫头部,防止网站的反爬机制。

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}

下面是爬虫主体部分,这里有三点要说明,一是mode='a'这里,这个是0.25.1版pandas以后才有的功能,之前的老版本没有这个功能;二是,不知道是不是我的网络有问题,在爬取过程中有掉线的现象出现,所以在这里用了requests.ConnectionError来处理掉线问题;三是,用了一个小窍门,如果直接用pd.read_html(url)也可以读取网页中的数据,但这里先用requests读取网页,再把requests读取的网页代码放入pd.read_html中,这样既可避免网站的反爬虫机制,也可以加快读取速度,因为pd.read_html直接读取网页实在太慢了。

def scraper(file, headers, urltemp, year_start, year_end):writer = pd.ExcelWriter(file, engine='openpyxl', mode='a') # 笔者用的文件是xlsx类型,所以这里要指定engine='openpyxl',如果是xls类型,则不用for i in range(year_start, year_end+1):url = urltemp % itry:r = requests.get(url, headers=headers)if r.status_code == 200:source_code = r.textdf = pd.read_html(source_code)df = df[0]df.to_excel(writer, sheet_name=str(i), index=False)time.sleep(3)# 稍微放慢一下速度,别把人家网站累坏了except requests.ConnectionError:print('Can not get access to the %s year daily data now' % i)returnwriter.save()writer.close()scraper(fileLoc, headers, urltemplate, 1977, 2019)

因为网站只提供到最早1977年的数据,所以就把1977年到2019年数据都给抓下来。

图二 抓取的部分数据的截图

二、根据数据简单绘图

下面这个str_to_datetime函数,是除掉数据Date列中一些不必要的文字,比如有些数据带有“New Year’s Eve”字样,要把这些东西去掉

def str_to_datetime(x):if len(x) > 14:temp = x.split('2019')x = temp[0]+'2019'return x

这个str_to_num函数是把“Top 10 Gross”列的数据都转换成数值,因为这些数据从Excel读取到pandas后,都是string格式的数据,要转换成数值格式

def str_to_num(x):x = x.replace('$', '')x = x.replace(',', '')x = int(x)return x

在这里我们要做一个“2019年每日票房数据的线形图”,所以要在刚才抓取的文件中读取相应数据,并简单处理一下

table = pd.read_excel(fileLoc, sheet_name='2019')
data = table[['Date', 'Top 10 Gross']]
data['Date'] = data['Date'].apply(str_to_datetime)
data['Top 10 Gross'] = data['Top 10 Gross'].apply(str_to_num)

设置x轴和y轴的数据,x轴是时间数据,y轴是票房数据,其值太大,所以改小点,方便作图

x = pd.to_datetime(data['Date'])
y = data['Top 10 Gross']/1000000

找出票房数据中最大的那个值和其在序列y中的位置,然后找出对应x序列的位置,也就是对应的哪一天

max_loc = y.idxmax()
max_y = y.max()
max_date = x.loc[max_loc]

设置相关参数

mpl.rcParams['font.sans-serif'] = ['SimHei']  # 设置为黑体字
fig = plt.figure(figsize=(16, 6.5))
ax = fig.add_subplot(111)  # 本例的figure中只包含一个图表
ax.set_ylim([0, 200])
plt.tick_params(labelsize=13)

下面这行代码是设置x轴为时间格式,这点很重要,否则x轴显示的将是类似于‘796366’这样的转码后的数字格式

ax.xaxis.set_major_formatter(mdate.DateFormatter('%Y-%m-%d'))
plt.xticks(pd.date_range(x[len(x)-1], x[0], freq='M'), rotation=90)
text = r'票房最高的一天是%s,其票房为%.2f亿' % (max_date.date(), max_y/100)
plt.annotate(text, xy=(max_date, max_y), fontsize=14, \xytext=(max_date+pd.Timedelta(days=10), max_y+10), \arrowprops=dict(arrowstyle="->", connectionstyle="arc3"), \xycoords='data')
plt.ylabel('票房/百万美元', fontdict={'size':14})
plt.plot(x, y)

完成后这个图片效果如下

图三 2019年北美票房每日数据图

三、结语

上面这个爬虫程序比较简单,并没有用到数据库、多线程等复杂技术,我们更多地应该从所得到的数据中来挖掘更多的价值,笔者接下来会从这些数据中来分析一下好莱坞电影行业过去一年的发展,届时会分享给大家,敬请期待。

▼点击成为社区注册会员      喜欢文章,点个在看

用 Python 爬取分析每日票房数据相关推荐

  1. 使用Python爬取分析政府采购网数据

    好久没写博客了,一直觉得之前写的都没啥技术性,这次分享个最近觉得很值得记录的一次操作吧~.         Leader临时分配给我个任务,要我爬取下政府采购网近一个月公开招标中二三甲医院的数据,这一 ...

  2. python爬取旅游信息_用Python爬取分析全国旅游数据-Go语言中文社区

    前言: Python对于本人来讲也是一个在逐渐学习掌握的过程,这次的内容就从旅游开始讲起,进入正文前首先附(fang)上(du)最令我垂涎欲滴的海鲜盛宴. 数据爬取: 最近几天朋友圈被大家的旅行足迹刷 ...

  3. 使用python爬取中国电影票房数据并写入csv文件

    环境 PyCharm 2021.1.2 x64 爬取的目标网页 一.代码 import requests from bs4 import BeautifulSoup url = "http: ...

  4. 用Python爬取分析全国旅游数据

    前言: Python对于本人来讲也是一个在逐渐学习掌握的过程,这次的内容就从旅游开始讲起,进入正文前首先附(fang)上(du)最令我垂涎欲滴的海鲜盛宴. 数据爬取: 最近几天朋友圈被大家的旅行足迹刷 ...

  5. python爬取分析超级大乐透历史开奖数据

    python爬取分析超级大乐透历史开奖数据 博主作为爬虫初学者,本次使用了requests和beautifulsoup库进行数据的爬取 爬取网站:http://datachart.500.com/dl ...

  6. python实战|python爬取58同城租房数据并以Excel文件格式保存到本地

    python实战|python爬取58同城租房数据并以Excel文件格式保存到本地 一.分析目标网站url 目标网站:https://cq.58.com/minsuduanzu/ 让我们看看网站长啥样 ...

  7. Python爬取京东任意商品数据实战总结

    利用Python爬取京东任意商品数据 今天给大家展示爬取京东商品数据 首先呢还是要分思路的,我分为以下几个步骤: 第一步:得到搜索指定商的url 第二步:获得搜索商品列表信息 第三步:对得到的商品数据 ...

  8. python爬取气象台每日天气图代码

    特别鸣谢以下更多python教程请到友情连接: 菜鸟教程https://www.piaodoo.com 初中毕业读什么技校 http://cntkd.net 茂名一技http://www.enechn ...

  9. 用python爬取基金网信息数据,保存到表格,并做成四种简单可视化。(爬虫之路,永无止境!)

    用python爬取基金网信息数据,保存到表格,并做成四种简单可视化.(爬虫之路,永无止境!) 上次 2021-07-07写的用python爬取腾讯招聘网岗位信息保存到表格,并做成简单可视化. 有的人留 ...

最新文章

  1. Oracle 12C -- 扩展varchar2、nvarchar2、和raw数据类型的大小限制
  2. jQuery 遍历方法
  3. 如何控制让PO的数量不超过PR数量
  4. MvvmLight学习心得三
  5. idea编辑器无法识别jdk
  6. 虚拟局域网软件开源_ZeroTier虚拟局域网免费远程桌面体验--替代TeamViewer
  7. 软件定义汽车带来的困境---如何破局?
  8. 设置hive的执行引擎_0506-如何将Hue4.0版本中默认执行引擎设置为Hive而非Impala
  9. python实现算法改进_独门秘籍,如何从零开始用Python实现感知算法?
  10. Kafka详解与总结(七)-Kafka producer拦截器(interceptor)
  11. Gson将json转Map的那些坑
  12. 敌退我进 锂电产业链中日韩三国演义
  13. raid控制器缓存和硬盘缓存
  14. 深度解密Go语言之map
  15. IOS UTI统一类型标识符:判断文件类型通过后缀
  16. java中j=j++和j=++j的理解
  17. C语言基础教学——认识C语言(第一课)
  18. Terracotta 3.2.1简介 (二)
  19. Word2vec工作原理
  20. 忘记了电脑登陆密码,只记得PIN密码时可以登陆电脑怎么修改密码

热门文章

  1. C++: goto语句详解
  2. 辰视智能董事长冯良炳博士接受起点机器人网专访!
  3. 周界报警系统服务器,周界报警系统
  4. 麦田厦门小区信息数据爬取
  5. [英文邮件] 表达感谢的话 + 回复别人的祝福
  6. 蓝桥杯单片机-DS1302时钟模块
  7. xAd:南京大学大二学生开发的视频内广告动态植入技术
  8. 基于MDK开发的TencentOS-Tiny软件包,快速移植物联网操作系统到Keil中!
  9. LeetCode 每日一题1584. 连接所有点的最小费用
  10. PC企业微信HOOK接口,获取指定好友的详细信息