中国电影票房python数据源 中国电影票房数据库_中国电影票房python数据源


获取URL

我们先打开猫眼票房http://piaofang.maoyan.com/dashboard?date=2019-10-22 ,查看当日票房信息,

但是在通过xpath对该url进行解析时发现获取不到数据。

于是按F12打开Chrome DevTool,按照如下步骤抓包


中国电影票房python数据源 中国电影票房数据库_数据库的数据传入页面_02


再打开获取到的url:http://pf.maoyan.com/second-box?beginDate=20191022


中国电影票房python数据源 中国电影票房数据库_数据_03


可以看到是json数据,并且url是以日期结尾的,也就是每日的票房数据都保存在对应日期的url中,这样我们就可以通过构造url来爬取每天的票房数据。

开始采集

先创建了两个函数,

一个用来获取制定年份的所有日期,例如,传入2019,返回['20190101', '20190102'...'20191230', '20191231']。

当然也可以传入多个年份的列表,如[2016,2017,2018'],返回 ['20160101','20160102', ...'20170101',...'20180101',...'20181231']

这里没有使用任何库,用笨方法手动构造了全年的日期列表。

def get_calendar(years): """ 传入年份(可用list传入多个年份),得到年份中的所有日期 :param years: 可传入list、int、str :return: 年份中全部日期的list,日期格式: "2019-09-30" """ mmdd = [] # 判断传入参数的格式,如果是list则排序,如果是str或int则转为list if isinstance(years, list): years.sort() else: years = [int(years)] # 先为每个月都加入31天,然后删掉2,4,6,9,11的31日和2月的30日,再判断闰年来删掉2月29日 for year in years: for m in range(1, 13): for d in range(1, 32): mmdd.append(str(year) + str(m).zfill(2) + str(d).zfill(2)) for i in [2, 4, 6, 9, 11]: mmdd.remove(str(year) + str(i).zfill(2) + "31") mmdd.remove(str(year) + "0230") if not calendar.isleap(year): mmdd.remove(str(year) + "0229") return mmdd

第二个函数很简单,传入上一个函数得到的日期列表,返回对应日期的url列表。

def get_urls(datas): """ 通过日历函数得到的每年全部日期,构造出全部日期的url :param datas: 全部日期 :return: 全部url """ urls = [] for date in datas: url = "http://pf.maoyan.com/second-box?beginDate={}".format(date) urls.append(url) return urls

存入MYSQL

对于将数据存到mysql还是excel中,差别只在于写入的方法不同,前面对url的解析以及对数据的处理和获取都基本相同,

所以这里直接把存入mysql和存入excel写到了一个函数中,和后面的两个函数分别配合完成数据储存操作。

参数说明和判断储存方式在函数注释里写的很详细,这里简单说一下函数逻辑,

因json里的数据项很多,并且都以英文作为key,所有我们这里先手动创建要获取的数据项的中英文对照表,放到dict中,并根据这个dict来匹配主要的数据项。

最终返回一个由字典组成的list,返回的list其实没什么用,因为后面可视化的数据来源是直接通过sql取自mysql的,所以返回的list主要是调试时用着方便。

def get_movie_data(url, excel_or_db): """ 采集一个页面,并将数据写入excel或数据库, 需要在函数外创建excel工作薄和工作表或连接好数据库,将worksheet或Connection类作为参数传入本函数 如果传入的是worksheet类,函数会把数据保存到已创建excel中; 如果传入的是Connection类,函数会把数据保存在已连接的数据库的movies_data表中,数据库表名手动在sql中调整,本函数内1处、get_data_save_db()函数内两处。 :param url: 要采集的页面 :param excel_or_db: openxl的worksheet类 或 pymysql的Connection类 :return: 返回页面的全部数据 """ headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit' '/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36'} main_key = {"avgSeatView": "上座率