《復(fù)仇者聯(lián)盟3:無限戰(zhàn)爭(zhēng)》今天在中國(guó)內(nèi)地首映,但半個(gè)月前就已在其他國(guó)家上映,并成為全球最快突破10億美元的電影,在IMDb上獲得8.9分,在豆瓣上獲得8.9分的高分??催@勢(shì)頭三天12億在中國(guó)大陸很正常。
我趕緊寫了一個(gè)爬蟲,爬取貓眼的實(shí)時(shí)票房數(shù)據(jù),然后在控制臺(tái)輸出效果:
貓眼控制臺(tái)輸出的實(shí)時(shí)票房數(shù)據(jù)可以在這里查看:
要獲取這些票房數(shù)據(jù),直接請(qǐng)求上面的url是不行的,因?yàn)檫@些數(shù)據(jù)是通過Ajax異步加載的,需要從Ajax相關(guān)文件中提取所需的數(shù)據(jù),比如:今天的票房和票房份額某部電影的。比例、排片時(shí)間、排片比例、上映天數(shù)等
在Ajax開發(fā)者工具中,可以看到網(wǎng)頁(yè)繼續(xù)接收到文件second.json。其實(shí)這個(gè)json文件中包含的是票房數(shù)據(jù),也就是數(shù)據(jù)接口:
請(qǐng)求URL的一些基本信息位于數(shù)據(jù)字段中。例如,totalBox和totalBoxUnit是今天的總票房及其單位(10,000)。以split關(guān)鍵字開頭的是拆分帳戶數(shù)據(jù)。
baseinfo和每部電影的詳細(xì)信息在**list**字段的子字段中。**0**字段是今日票房排名第一的電影的詳細(xì)數(shù)據(jù),比如
movieName:影片名稱boxInfo:票房boxRate:票房份額avgSeatView:平均上座率avgShowView:平均上座率avgViewBox:平均票價(jià)releaseInfo:上映天數(shù)showInfo:排定演出數(shù)showRate:排程份額sumBoxInfo:總票房明細(xì)信息010-1010請(qǐng)求接口。經(jīng)過觀察可以發(fā)現(xiàn)頁(yè)面每4秒發(fā)送一次請(qǐng)求,因此可以構(gòu)建一個(gè)無限循環(huán),每4秒(或更長(zhǎng))發(fā)送一次請(qǐng)求,然后json()方法將響應(yīng)以dict類型返回提取數(shù)據(jù)。使用dict對(duì)象的get()方法提取字段值并將其輸出到控制臺(tái)。使用制表符\t作為字段之間的分隔符,并固定一些數(shù)據(jù)(字符串)的長(zhǎng)度,以保證輸出能夠?qū)R并清屏。os模塊的system()方法用于傳入命令行的清屏命令串,如Win下的cls,Linux下的clear
思路
。下面的代碼還有很多地方需要改進(jìn)和優(yōu)化。僅供參考。
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)#平均出席率場(chǎng)次、平均上座率、平均票價(jià)、票房、票房占比、影片名稱、上映信息(上映天數(shù))、上座率、排片、排片比例、總票房維度=[avgSeatView,avgShowView,avgViewBox,boxInfo,boxRate,movieName,releaseInfo,SeatRate,showInfo,showRate,sumBoxInfo]為索引,枚舉中的項(xiàng)目(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),票房占比,平均上座率,平均上座率,平均票價(jià),排片場(chǎng)數(shù),排片比例,累計(jì)總票房,上映天數(shù),sep=\t,end=f\n{x_line}\n)結(jié)果為results:print(result[movieName][:7].ljust(8),result[boxInfo][:8].rjust(8),result[boxRate][:8].rjust(8),result[avgSeatView][:8].rjust(8),結(jié)果[avgShowView][:8].rjust(8),結(jié)果[avgViewBox][:8].rjust(8),結(jié)果[showInfo][:8].rjust(8),結(jié)果[showRate][:8].rjust(8),結(jié)果[sumBoxInfo][:8].rjust(8),結(jié)果[releaseInfo][:8],sep=\t,end=\n\n)time.sleep(4)if__name__=='__main__':my=maoyan()my.main()微信公眾號(hào):display3D