python爬取近十年中國電影票房數據與分析


Python爬取近十年中國電影票房數據與分析

一、選題背景

Q:為什么選擇選擇此題?

隨着網絡的迅速發展,萬維網成為大量信息的載體,如何有效地提取並利用這些信息成為一個巨大的挑戰。

Q:達到什么預期目標?

爬取中國近10年的電影票房,並數據可視化。

Q:項目背景

“2013年受市場熱捧的電影行業其實是個現金流狀況很差的行業。中國每年會拍七百多部電影,只有兩百多部能夠上映,其中票房能夠超過五億的屈指可數。即使賺了五億的票房“大獲成功”的電影,扣除分給院線的一半,再扣除發行費,宣傳費,制片方能夠拿到手的大概只有2億多一點。再扣除給編劇、導演、制片和演員的薪酬以及拍攝中的各種成本,最后剩下的凈利潤可能只有幾千萬。”

這句話讓我對中國的電影市場產生了好奇,想了解一下近年來中國電影市場的發展,於是想爬取近十年的中國電影票房。

二、主題式網絡爬蟲設計

Q:主題是網絡爬蟲名稱

爬取近十年中國電影票房數據

Q:主題式網絡爬蟲的內容

爬取中國近10年的電影票房,並實現數據可視化。

Q:設計方案描述

使用 beautifulsoup 里面的 find_all 函數來進行定位其他 xpath 等方法,都不大行得通。爬取的票房數據要進行預處理,因為票房數據中可能含有中文。

三、主頁體面的結構特征分析

這是一個中國電影票房的首頁界面

 

 

結構特征

 

結構分析

 

四、網絡爬蟲程序分析

# 引入庫

import pandas as pd

import time

import urllib.request

from lxml.html import fromstring

from bs4 import BeautifulSoup

 

# 下載鏈接

def download(url):

    print('Downloading:', url)

    request = urllib.request.Request(url)

    request.add_header('User-agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36') #進行偽裝

    resp = urllib.request.urlopen(request)

    html = resp.read().decode('utf-8')

    return html

 

# 待爬取內容

name = []

year = []

Box_office = []

 

# 循環爬取每頁內容

for k in range(10):

    movie_year = 2010+k

    url = download('http://www.boxofficecn.com/boxoffice{}'.format(movie_year))

    time.sleep(3)   #間隔3s,防止被封禁

    tree = fromstring(url)

    soup = BeautifulSoup(url)

    length_string = soup.find('div',{'class':'entry-content'}).p.get_text()

    length = int(re.search('[0-9]{1,3}(?=部)',length_string).group())

    for k in range(length):

        name.append(soup.find_all('tbody')[0].find_all('td')[4*k+2].get_text())

        year.append(movie_year)

        Box_office.append(soup.find_all('tbody')[0].find_all('td')[4*k+3].get_text())

 

# 將list轉化為dataframe

name_pd = pd.DataFrame(name)

year_pd = pd.DataFrame(year)

Box_office_pd = pd.DataFrame(Box_office)

 

# 拼接

movie_Box_office_data = pd.concat([name_pd,year_pd,Box_office_pd],axis=1)

movie_Box_office_data.columns=['電影','年份','票房']

 

movie_Box_office_data.head()

 

# 數據預處理

## 提取數字部分

f = lambda x: re.search('[0-9]*(\.[0-9]*)?',x).group()

movie_Box_office_data['票房'] = movie_Box_office_data['票房'].apply(f)

## 缺失值填充為0

empty = movie_Box_office_data['票房'] == ''

movie_Box_office_data.loc[empty,'票房'] = 0

## 轉化成浮點數

movie_Box_office_data['票房'] = movie_Box_office_data['票房'].apply(lambda x: float(x))

 

 

# 輸出

outputpath='c:/Users/wzj/Desktop/修身/與自己/數據分析/數據分析/爬蟲/中國電影票房/movie_box_office.csv' ## 路徑需要自己改!

movie_Box_office_data.to_csv(outputpath,sep=',',index=False,header=True,encoding='utf_8_sig')

 

 

 

 

引入庫,導入數據

#matplotlib inline

import matplotlib.pyplot as plt

import seaborn

import pandas as pd

import numpy as np

from pylab import *

mpl.rcParams['font.sans-serif'] = ['SimHei']

data = pd.read_csv('movie_box_office.csv')

data.head()

 

len(data)

 

 

#十年top10

data.sort_values(by='票房',ascending=False).head(10)

 

data.iloc[2111,2]=142241.3

data.sort_values(by='票房',ascending=False).head(10).plot.bar(x='電影',y='票房',title='top 10')

 

# 年度top5

data[data['年份']==2010].sort_values(by='票房',ascending=False).head(5).plot.bar(x='電影',y='票房',title='2010 top 5')

 

data[data['年份']==2011].sort_values(by='票房',ascending=False).head(5).plot.bar(x='電影',y='票房',title='2011 top 5')

 

data[data['年份']==2012].sort_values(by='票房',ascending=False).head(5).plot.bar(x='電影',y='票房',title='2012 top 5')

 

data[data['年份']==2013].sort_values(by='票房',ascending=False).head(5).plot.bar(x='電影',y='票房',title='2013 top 5')

 

data[data['年份']==2014].sort_values(by='票房',ascending=False).head(5).plot.bar(x='電影',y='票房',title='2014 top 5')

 

data[data['年份']==2015].sort_values(by='票房',ascending=False).head(5).plot.bar(x='電影',y='票房',title='2015 top 5')

 

data[data['年份']==2016].sort_values(by='票房',ascending=False).head(5).plot.bar(x='電影',y='票房',title='2016 top 5')

 

data[data['年份']==2017].sort_values(by='票房',ascending=False).head(5).plot.bar(x='電影',y='票房',title='2017 top 5')

 

data[data['年份']==2018].sort_values(by='票房',ascending=False).head(5).plot.bar(x='電影',y='票房',title='2018 top 5')

 

data[data['年份']==2019].sort_values(by='票房',ascending=False).head(5).plot.bar(x='電影',y='票房',title='2019 top 5')

 

# 每年電影數

groupby_year = data.groupby('年份').size()

groupby_year.plot.bar(title = '每年電影數')

 

# 每年總票房

data.groupby('年份')['票房'].sum().plot.bar(title = '每年總票房')

 

# 電影票房中的二八原則

data[data['年份']==2019]['票房'].plot.hist()

 

data[data['年份']==2018]['票房'].plot.hist()

 

percent = []

for k in range(10):

    Boxoffice=  data[data['年份']==(2010+k)]['票房']

    q80 = np.percentile(Boxoffice ,80)

    percent.append(Boxoffice[Boxoffice >= q80].sum()/ Boxoffice.sum())

percent

 

五、總結

在學習python爬取近十年中國電影票房數據和分析后,對爬取知識有了一個深的了解,並且實現了數據的可視化。使用BeautifulSoup更加熟練。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM