用Python爬取并分析Box Office Mojo网站2019年每日票房数据

news/2024/5/19 21:01:07/文章来源:https://blog.csdn.net/xzsfw/article/details/103995724

最近在处理一些和有关电影的工作,需要用到一些北美电影票房数据,而这部分数据最权威的网站当属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 % i

        try:

            r = requests.get(url, headers=headers)

            if r.status_code == 200:

                source_code = r.text

                df = 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)

            return

    writer.save()

    writer.close()

 

 

scraper(fileLoc, headers, urltemplate, 1977, 2019)

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

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

 

二、根据数据简单绘图

#下面这个str_to_datetime函数,是除掉数据Date列中一些不必要的文字,比如有些数据带有“New Years 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年北美票房每日数据图

 

三、结语

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_865602.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态代理IP对seo网站运营的影响

seo搜索引擎优化,是网站优化的基本操作,利用seo的优化手段,我们网站的关键词就会逐步的向前递增,从而增加网站的权重,引入流量。但是当我们网站的关键词排名靠后,但是使用正常的优化手段在短时间内没有办法…

网络编程–一起来做网站客户端

【iPhone】网络编程–一起来做网站客户端(一) 发表于 2012 年 3 月 31 日 由 Apan 最近几天,一直在学习网络编程方面,我觉得这是移动开发必须了解的知识吧 在实践中学习,才是最好的方法 于是就决定为公司OA系统做一个…

使用IntelliJ IDEA开发SpringMVC网站(二)框架配置

华为软件开发云5月大聚惠,8大服务限时免费,拼手气赢华为Mate9!>>> 摘要: 讲解如何配置SpringMVC框架xml,以及如何在Tomcat中运行 转载请注明出处:Gaussic(一个致力于AI研究却不得不兼顾项目的研…

使用IntelliJ IDEA开发SpringMVC网站(二)框架配置

华为软件开发云5月大聚惠,8大服务限时免费,拼手气赢华为Mate9!>>> 摘要: 讲解如何配置SpringMVC框架xml,以及如何在Tomcat中运行 转载请注明出处:Gaussic(一个致力于AI研究却不得不兼顾项目的研…

外国网站摘录的一个关于Jsoup的简单实例

jsoup HTML parser hello world examples By mkyong | January 16, 2013 | Last Updated : October 9, 2013 Jsoup, a HTML parser, its “jquery-like” and “regex” selector syntax is very easy to use and flexible enough to get whatever you want. Below are three e…

Mac - MAMP - WordPress - 搭建 php+MySQL 网站开发环境

文章目录 下载MAMPWordpress 配置 下载 MAMP MAMP是Mac平台上一款用于Web开发的本地服务器环境的工具。 MAMP这几个首字母代表苹果的OSX系统上的Macintosh、Apache、MySQL和PHP,即 MAMP 内含 Apache 服务器、PHP 安装套件以及MySQL安装套件。 https://www.mamp.i…

推荐几个设计师常去的优秀素材网站!收藏好哦!

1、创客贴 网址:www.chuangkit.com 创客贴是一个专业的平面设计工具网站,功能强大、全面,操作十分简单,有超过10w的各种场景模板,支持在线多人、多终端协作,关键还免费! 2、包图网 网址&#x…

作为一名平面设计师,你必须知道的一些素材网站

随着互联网日新月异的发展速度,平面设计成为了各个行业宣传中一个重要部分。作为一名优秀平面设计师,不管是学习还是工作当中,都少不了需要一些灵感,但是常常为找不到灵感而苦恼,在你灵感枯竭,创意干涸的时…

设计师不可错过的2022年设计类网站大搜集,素材 教程 案例 全都有

经常看大家找素材着急!为没有灵感发疯!特意为大家整理2017最新的一些关于设计的素材网站、自学网站,字体网站、等一些压箱底的干货包含全部链接! 希望能给大家带来帮助。喜欢可以加关注。一起分享设计资源! 花瓣网 ht…

某漫画网站MD5参数分析

原创 Mr.Yang 菜鸟童靴 今天 声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! 练习网站平台: aHR0cHMlM0EvL3R3Lm1hbmh1YWd1aS5jb20v 抓取目标: 抓到对应的漫画,图片地址 开始我们的分析: 根据图上,标注可以很容易看到这里有…

【转载】如何在网站中添加音乐

来源&#xff1a;http://www.ido321.com/1042.html 发现有很多的个人博客中添加了背景音乐&#xff0c;以增强用户体验。LZ搜集到了两种在网站中添加音乐的方式。 一、豆瓣的FM 这个非常简单&#xff0c;一段代码就可以实现。 <p><iframe name"iframe_canvas&quo…

使用JSSDK实现网站的QQ登录

使用JSSDK实现网站的QQ登录 进入QQ互联官网&#xff1a;https://connect.qq.com/index.html 进行开发者注册并审核认证【实名认证】&#xff1a;首先使用QQ账号登录上述的QQ互联官网&#xff1b;接着填写开发者审核认证资料&#xff0c;需提交&#xff1a;开发者类型&#xf…

网站流量统计

常使用web服务器的朋友大都了解&#xff0c;一般的web server有两部分日志&#xff1a; 一是运行中的日志&#xff0c;它主要记录运行的一些信息&#xff0c;尤其是一些异常错误日志信息 二是访问日志信息&#xff0c;它记录的访问的时间&#xff0c;IP&#xff0c;访问的…

利用网页压缩来提升网站浏览速度

网站的访问速度是由多个因素所共同决定的&#xff0c;这些因素例如应用程序的响应速度、网络带宽、服务器性能、与客户端之间的网络传输速度等等。其中最重要的 一个因素是应用程序本身的响应速度&#xff0c;因此当你为网站性能所苦恼时&#xff0c;你第一个需要着手进行处理的…

baidu网址提交|baidu收录网址提交|向百度提交网站

向百度提交网站:http://www.baidu.com/search/url_submit.html 方便百度爬行你的网站&#xff0c;收录你的信息 -------------------------- 新闻&#xff1a; Google天使投资人透露投资策略&#xff1a;团队第一 网站导航: 博客园首页 新闻 .NET频道 社区 博问 闪存…

大型网站技术架构

架构演变第一步&#xff1a;物理分离webserver和数据库 最开始&#xff0c;由于某些想法&#xff0c;于是在互联网上搭建了一个网站&#xff0c;这个时候甚至有可能主机都是租借的&#xff0c;但由于这篇文章我们只关注架构的演变历程&#xff0c;因此就假设这个时候已经是托管…

如何设计通用的网站模板

http://www.serverjia.cn/html/wlpz/c/yy/2009/0311/29412.html 现在网络上已经到处可以看到使用模板开发出来的网站。使用模板开发网站有很多好处&#xff0c;最主要的就是模板与程序完全脱离&#xff0c;用户可以根据规定好的标签任意开发模板&#xff0c;导入到模板引擎里就…

opc-ua技术资料网站汇总

OPC官方网址&#xff1a;https://opcfoundation.org/ OPC中国官网&#xff1a; http://www.chinaopc.org/ ----------------------------------------------------------------- http://www.advosol.com/ 一个收费的国外OPC开发包 ------------------------------------…

大型网站架构技能图谱(Java版)

在大型网站技术架构中&#xff0c;涉及到许多的技术&#xff0c;这些技术是具备大型网站架构设计能力的前提和基础。因为笔者对Java比较熟悉&#xff0c;所以下面的技术图谱都是围绕Java后端工程师展开的。如有不正确或者不完善的地方&#xff0c;欢迎补充。

Fortran在线学习网站

Fortran Tutorialhttps://www.tutorialspoint.com/fortran/index.htm