欢迎访问合肥育英学校!

合肥育英学校

您现在的位置是: 首页 > 学习方法 >爬取猫眼电影top100出现问题(猫眼实时票房数据来源)

爬取猫眼电影top100出现问题(猫眼实时票房数据来源)

发布时间:2024-09-07 21:35:23 学习方法 256次 作者:合肥育英学校

《复仇者联盟3:无限战争》今天在中国内地首映,但半个月前就已在其他国家上映,并成为全球最快突破10亿美元的电影,在IMDb上获得8.9分,在豆瓣上获得8.9分的高分。看这势头三天12亿在中国大陆很正常。

我赶紧写了一个爬虫,爬取猫眼的实时票房数据,然后在控制台输出效果:

爬取猫眼电影top100出现问题(猫眼实时票房数据来源)

猫眼控制台输出的实时票房数据可以在这里查看:

要获取这些票房数据,直接请求上面的url是不行的,因为这些数据是通过Ajax异步加载的,需要从Ajax相关文件中提取所需的数据,比如:今天的票房和票房份额某部电影的。比例、排片时间、排片比例、上映天数等

在Ajax开发者工具中,可以看到网页继续接收到文件second.json。其实这个json文件中包含的是票房数据,也就是数据接口:

请求URL的一些基本信息位于数据字段中。例如,totalBox和totalBoxUnit是今天的总票房及其单位(10,000)。以split关键字开头的是拆分帐户数据。

baseinfo和每部电影的详细信息在**list**字段的子字段中。**0**字段是今日票房排名第一的电影的详细数据,比如

movieName:影片名称boxInfo:票房boxRate:票房份额avgSeatView:平均上座率avgShowView:平均上座率avgViewBox:平均票价releaseInfo:上映天数showInfo:排定演出数showRate:排程份额sumBoxInfo:总票房明细信息010-1010请求接口。经过观察可以发现页面每4秒发送一次请求,因此可以构建一个无限循环,每4秒(或更长)发送一次请求,然后json()方法将响应以dict类型返回提取数据。使用dict对象的get()方法提取字段值并将其输出到控制台。使用制表符\t作为字段之间的分隔符,并固定一些数据(字符串)的长度,以保证输出能够对齐并清屏。os模块的system()方法用于传入命令行的清屏命令串,如Win下的cls,Linux下的clear

思路

。下面的代码还有很多地方需要改进和优化。仅供参考。

importosimporttimeimportrequestsclassmaoyan():def__init__(self):self.headers={Host:piaofang.maoyan.com,Referer:(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/57.0.2987.98Safari/537.36LBBROWSER,X-Requested-With:XMLHttpRequest}defget_page(self):url=(url,self.headers)ifresponse.status_code==200:returnresponse.json()exceptrequests.ConnectionErrorase:print(Error,e.args)defparse_page(self,json):ifjson:data=json.get(data)#平均出席率场次、平均上座率、平均票价、票房、票房占比、影片名称、上映信息(上映天数)、上座率、排片、排片比例、总票房维度=[avgSeatView,avgShowView,avgViewBox,boxInfo,boxRate,movieName,releaseInfo,SeatRate,showInfo,showRate,sumBoxInfo]为索引,枚举中的项目(data.get(list)):self.piaofang={}为维度中的维度:self.piaofang[dimension]=item.get(dimension)yieldself.piaofangdefmain(self):whileTrue:json=self.get_page()results=self.parse_page(json)os.system(cls)print(json.get(data)[updateInfo])x_line=-*155print(f'今日总票房:{json.get(data)[totalBox]}{json.get(data)[totalBoxUnit]}',end=f\n{x_line}\n)print(电影名称,综合票房(10,000),票房占比,平均上座率,平均上座率,平均票价,排片场数,排片比例,累计总票房,上映天数,sep=\t,end=f\n{x_line}\n)结果为results:print(result[movieName][:7].ljust(8),result[boxInfo][:8].rjust(8),result[boxRate][:8].rjust(8),result[avgSeatView][:8].rjust(8),结果[avgShowView][:8].rjust(8),结果[avgViewBox][:8].rjust(8),结果[showInfo][:8].rjust(8),结果[showRate][:8].rjust(8),结果[sumBoxInfo][:8].rjust(8),结果[releaseInfo][:8],sep=\t,end=\n\n)time.sleep(4)if__name__=='__main__':my=maoyan()my.main()微信公众号:display3D