【Python】爬取中国历史票房榜,可视化分析
最近电影《哪吒之魔童转世》票房已经超过《流浪地球》,《复联4》。升到中国内地票房第二位。就好有哪些电影排进了历史票房前100,写了简单爬虫,爬取数据并数据可视化。
一,爬取思路
F12研究了下,通过ajax请求,返回json数据,所以可以模拟ajax请求,然后再解析得到的json数据就行了。
除此之外,在内容页面中还可以爬虫到演员和导演。
二,代码实现
def parser_page(url):
#解析电影详细页内容,获取导演以及演员
text = downloadpage(url)
html = etree.HTML(text)
actor_selectors = html.xpath('//*[@id="top"]/div[3]/div[2]/div/div[1]/div[2]/div[2]/ul/li[1]')
actors = '/'.join(actor_selectors[0].xpath('//h5/a/text()')[:2])
director_selectors = html.xpath('//*[@id="tabcont1"]/dl/dd[1]/p/a/text()')
directors = '/'.join(director_selectors)
return {
'actor':actors,
'director':directors
}
def parser_json(jsonlist):
#解析json数据,并保存至数据库
mysqlclent = MySQLClient()
for jsondate in json.loads(jsonlist): #转成字典格式
MovieUrl = 'http://www.cbooo.cn/m/'+jsondate.get('MovieID')
actor_director = parser_page(MovieUrl)
jsondate['url'] = MovieUrl
jsondate['actor'] = actor_director.get('actor')
jsondate['director'] = actor_director.get('director')
mysqlclent.insert('chinamovie',jsondate) #传递字典,这里会根据key,value 直接生成sql
def insert(self,table,data): #插入数据的方法,
"""
:param table: 表名
:param data: 数据 dict
:return:
"""
cursor = self.conn.cursor()
keys = ','.join(data.keys())
values = ','.join(['%s']*len(data))
sql = 'insert into {table}({key}) values({value});'.format(table=table,key=keys,value=values)
try:
if cursor.execute(sql,tuple(data.values())):
self.conn.commit()
print('inserted Successfully')
except Exception as e:
print('insert faided')
print("error:", str(e))
self.conn.rollback()
finally:
cursor.close()
def calculate(col):
#统计演员以及导演名称的出现次数
mysqlclent = MySQLClient()
model = collections.defaultdict(lambda: 0) #构建字典 做词频统计,初始为0
result_lists = mysqlclent.select('chinamovie',col)
result_dict = {}
for key,value in enumerate(result_lists):
result_lists[key] = ''.join(value).split('/')
features = [j for i in result_lists for j in i] #列表展开
for f in features: #统计词频,也就是导演或是演员在前100 中出现的次数
model[f] += 1
for key,value in model.items():
result_dict['name'] = key
result_dict['count'] = value
result_dict['type'] = col
mysqlclent.insert('word_freq',result_dict)
三,数据可视化
寒假档和暑假档上映的电影票房都不差,热门电影都是选择这两个时间段上映。不知道为什么10月份没有高票房电影?
票房榜中这5位演员的影片数是最多的,但是影片多不代表票房是最高的。
吴京凭借《战狼2》和《浏览地球》成功反超钢铁侠,沈腾和黄渤。登顶票房。
而在导演中凭借漫威宇宙电影,罗素兄弟也傲视群雄,吴京则是凭借《战狼2》一部影片就排在第二名。
综合两个排行榜,吴京是双丰收呀!
最后,看下与票房关系最直接的两个因素:票价和场次。
1,票价在[30,40]之间应该是大众普遍可以接收的价格区间,不过为了自己喜欢的电影,再贵也是值得的。
2,从放映场次来看,放映越多,还是对票房有很大的提供,但是,也不是越多越好,电影要好看,在增加放映场次的同时,也才能保持高上座率,才会人去二刷!
这些只是博主自己小小的分析,不喜勿喷,有建议欢迎讨论!!