爬取貓眼實時票房數據
來自專欄 display3d9 人贊了文章
今天《復仇者聯盟3:無限戰爭》在內地首映,但它早在半個月前就已經在其它國家上映了,並且成為全球最快破十億美元的影片,IMDb 8.9高分,豆瓣評分 8.9分,看這架勢內地3天12億很正常。
匆匆忙忙寫了一個爬蟲,爬取貓眼的實時票房數據,然後在控制台輸出效果:
貓眼實時票房數據可以在這查看:https://piaofang.maoyan.com/dashboard
要獲取這些票房數據,直接請求上面這個 url 是無法獲取到的,因為這些數據是通過 Ajax 非同步載入進來的,需要從 Ajax 相關文件提取所需要的數據,如:某部電影的今日票房、票房佔比、排片、排片佔比、上映天數等。
在開發者工具中可以看到網頁不斷地接收到 second.json 這個文件,其實這個 json 文件就包含有票房數據,也就是數據介面:https://box.maoyan.com/promovie/api/box/second.json
一些基本信息在 data 這個欄位,如 totalBox
、totalBoxUnit
是今日總票房及其單位(萬),帶有 split
關鍵字開頭的都是分賬數據
而具體每一部電影的詳細信息則在 **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
推薦閱讀:
TAG:python爬蟲 | 復仇者聯盟3:無限戰爭電影 | requests |