爬取貓眼實時票房數據

爬取貓眼實時票房數據

來自專欄 display3d9 人贊了文章

今天《復仇者聯盟3:無限戰爭》在內地首映,但它早在半個月前就已經在其它國家上映了,並且成為全球最快破十億美元的影片,IMDb 8.9高分,豆瓣評分 8.9分,看這架勢內地3天12億很正常。

匆匆忙忙寫了一個爬蟲,爬取貓眼的實時票房數據,然後在控制台輸出效果:

控制台輸出

貓眼實時票房數據可以在這查看:https://piaofang.maoyan.com/dashboard

要獲取這些票房數據,直接請求上面這個 url 是無法獲取到的,因為這些數據是通過 Ajax 非同步載入進來的,需要從 Ajax 相關文件提取所需要的數據,如:某部電影的今日票房、票房佔比、排片、排片佔比、上映天數等。

Ajax

在開發者工具中可以看到網頁不斷地接收到 second.json 這個文件,其實這個 json 文件就包含有票房數據,也就是數據介面:https://box.maoyan.com/promovie/api/box/second.json

Request URL

一些基本信息在 data 這個欄位,如 totalBoxtotalBoxUnit 是今日總票房及其單位(萬),帶有 split 關鍵字開頭的都是分賬數據

baseinfo

而具體每一部電影的詳細信息則在 **list** 這個欄位的子欄位中,**0** 欄位是今天票房排第一名的電影詳細數據,如

  • movieName: 電影名稱
  • boxInfo: 票房
  • boxRate: 票房佔比
  • avgSeatView: 場均上座率
  • avgShowView: 場均人次
  • avgViewBox: 平均票價
  • releaseInfo: 上映天數
  • showInfo: 排片場次
  • showRate: 排片佔比
  • sumBoxInfo: 總票房

詳細信息

思路

  • 請求介面。經過觀察可以發現頁面每隔 4 秒發送一次請求,所以可以構建一個死循環,每隔 4 秒(或以上)發送一次請求即可,然後 json() 方法將 response 以 dict 類型返回
  • 提取數據。利用 dict 對象的 get() 方法提取欄位值
  • 輸出控制台。以製表符 作為欄位間的分隔符,並且固定一些數據(字元串)的長度,以保證輸出可以對齊
  • 清屏。使用了 os 模塊的 system() 方法,傳入命令行的清屏命令字元串,如 Win 下是 cls,Linux下是 clear

代碼

以下代碼還有很多需要改進優化的地方,只供參考

import osimport timeimport requestsclass maoyan(): def __init__(self): self.headers = { Host: 貓眼專業版-實時票房, Referer: 貓眼專業版-實時票房, User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 LBBROWSER, X-Requested-With: XMLHttpRequest } def get_page(self): url = https://box.maoyan.com/promovie/api/box/second.json try: response = requests.get(url, self.headers) if response.status_code == 200: return response.json() except requests.ConnectionError as e: print(Error, e.args) def parse_page(self, json): if json: data = json.get(data) for index, item in enumerate(data.get(list)): self.piaofang = {} # 場均上座率 self.piaofang[avgSeatView] = item.get(avgSeatView) # 場均人次 self.piaofang[avgShowView] = item.get(avgShowView) # 平均票價 self.piaofang[avgViewBox] = item.get(avgViewBox) # 票房 self.piaofang[boxInfo] = item.get(boxInfo) # 票房佔比 self.piaofang[boxRate] = item.get(boxRate) # 電影名稱 self.piaofang[movieName] = item.get(movieName) # 上映天數 self.piaofang[releaseInfo] = item.get(releaseInfo) # 排片場次 self.piaofang[showInfo] = item.get(showInfo) # 排片佔比 self.piaofang[showRate] = item.get(showRate) # 總票房 self.piaofang[sumBoxInfo] = item.get(sumBoxInfo) yield self.piaofangif __name__ == "__main__": while True: my = maoyan() json = my.get_page() results = my.parse_page(json) os.system(cls) print(json.get(data)[updateInfo]) print(今日總票房: %s % json.get(data)[totalBox]+json.get(data)[totalBoxUnit]) x_line = - * 155 print(x_line) print(電影名稱 綜合票房(萬) 票房佔比 場均上座率 場均人次 平均票價 排片場次 排片佔比 累積總票房 上映天數) print(x_line) for result in results: print( result[movieName][:7].ljust(8) + + result[boxInfo][:8].rjust(8) + + result[boxRate][:8].rjust(8) + + result[avgSeatView][:8].rjust(8) + + result[avgShowView][:8].rjust(8) + + result[avgViewBox][:8].rjust(8) + + result[showInfo][:8].rjust(8) + + result[showRate][:8].rjust(8) + + result[sumBoxInfo][:8].rjust(8) + + result[releaseInfo][:8] +
) time.sleep(4)

微信公眾號:display3D

https://wx1.sinaimg.cn/thumb180/bfcc6bc7gy1ft2oyj1xrqj209k09k3yg.jpg?

wx1.sinaimg.cn


推薦閱讀:

TAG:python爬蟲 | 復仇者聯盟3:無限戰爭電影 | requests |