Python项目实战:某瓣热门电影分析(爬虫+数据分析)

项目需求

  1. 获取某瓣前100名热门电影详细内容,包括:名称、类型、制片国家、语言、上映时间、片长、评分、评价人数。
  2. 根据获取的数据分析,包括:上映时间分布情况、评分分布情况、类型分布情况

项目难点

  1. 获取数据时,有部分内容保存在
    下,无法直接使用Xpath获取
  2. 上映时间有多个,按照国内上映时间分布,这里需要处理一下
  3. 类型分布中,一个电影多个类型,需要分解处理

这个是本文的重点。

数据抓取

  1. 在进行实际的数据抓取的过程中,发现数据实际保存在Json数据包中,原网页无法获取,前100名电影的实际地址。
  2. 每一页只显示20个数据,且每次以20个为一组的新增。
  3. Json我们需要的url数据保存在['subjects'][m]['url']中,其中m为循环,每一组循环20次。

代码实例

  1. 获取前100名电影的实际url地址
 def get_move_url():
     move_url = []   
     for i in range(0,100,20):
         url = f'https://xxx.xxx.xxx/j/search_subjects?type=movie&tag=热门&sort=recommend&page_limit=20&page_start={i}'
         r_response = get(url=url,headers=headers).json()
         for m in range(20):
             move_url.append(r_response['subjects'][m]['url'])
     return move_url
  1. 根据每个url地址,获取相应的内容,注意br下内容、上映时间,这里全部处理,并保存excel文件。
 def get_data():
     move_url = get_move_url()
     df = pd.DataFrame(columns=['电影名','电影类型','制片国家','语言','上映时间','片长','评分','评价人数'])
     for m in range(len(move_url)):
         r_resopnse = get(url=move_url[m],headers=headers).text
         res = Selector(r_resopnse)
         name = res.xpath('//*[@id="content"]/h1/span[1]/text()').get()
         move_type = res.xpath('*//span[@property="v:genre"]/text()').getall()
         # ! 上映时间需要处理,以第一个时间为基准,且还要去掉()里面的内容 
         move_time = res.xpath('*//span[@property="v:initialReleaseDate"]/text()').getall()
         move_time = Move_Time(move_time=move_time)
         move_len = res.xpath('*//span[@property="v:runtime"]/text()').get()
         move_len = Move_Len(move_len=move_len)
         move_score = res.xpath('//*[@id="interest_sectl"]/p[1]/p[2]/strong/text()').get()
         move_people_num = res.xpath('//*[@id="interest_sectl"]/p[1]/p[2]/p/p[2]/a/span/text()').get()
         # ! 语言与制片地区在
下,需要特殊处理 move_br = res.xpath('/html/body/p[3]/p[1]/p[2]/p[1]/p[1]/p[1]/p[1]/p[2]/descendant-or-self::text()').getall() for i in range(len(move_br)): if move_br[i] == '制片国家/地区:': country = move_br[i+1] # ? 去除里面所有的空格 move_country = country.replace(" ","") elif move_br[i] == '语言:': language = move_br[i+1] move_language = language.replace(" ","") # ! 后面就不需要了 break df.loc[m]=[name,move_type,move_country,move_language,move_time,move_len,move_score,move_people_num] df.to_excel('./result.xlsx',index=False)
 def Move_Time(move_time):
     # ? 以中国上映时间为基准,去掉()与里面中文的内容
     time = re.sub('[一-龥]','',move_time[0])
     # ? 测试时,发现有些数据不是很全面,用下列方法,多次删除无用数据
     time = time.strip('(').strip(')').strip(r'/').strip('(')    
     return time
 def Move_Len(move_len):
     # ! 注意 时长类型 byte 需要修改为 str
     len = re.sub('[一-龥]','',str(move_len))  
     len = len.strip('()') 
     return len     
  1. 数据分析

df2 = df['上映时间'].value_counts()

 plt.figure(figsize=(20,8),dpi=80)
 plt.hist(df['评分'].values,bins=20)
 max_ = df['评分'].max()
 min_ = df['评分'].min()
 t1 = np.linspace(min_,max_,21)
 plt.xticks(t1)
 plt.show()
 # ! 电影类型分布
 move_type = df['电影类型'].str.split(",")
 move_type = move_type.apply(pd.Series)
 move_type = move_type.apply(pd.value_counts)
 move_type.unstack()
 move_type = move_type.unstack().dropna().reset_index()
 move_type.columns =['level_0','type','counts']
 movie_type_m = move_type.drop(['level_0'],axis=1).groupby('type').sum().sort_values(by=['counts'],ascending=False).reset_index()
 
 # print(movie_type_m['counts'].to_list())
 size= movie_type_m['counts'].to_list()
 name = movie_type_m['type'].to_list()
 colors = ['steelblue','#9999ff','red','indianred', 'green','yellow','orange']
 plot = squarify.plot(
 sizes=size, # 指定绘图数据
 color = colors,# 指定 定义颜 
 label=name,# 指定标签
 value=size,# 添加数值标签
 alpha = 0.6,# 指定透明度
 edgecolor = 'white',# 设置边界框为 
 linewidth =3 # 设置边框宽度为3
 )
 plt.rc('font', size=12)
 # 设置标题 
 plot.set_title('电影类型分布情况',fontdict = {'fontsize':20})
 # 去除坐标轴
 plt.axis('off')
 # 去除上边框和右边框刻度
 plt.tick_params(top = 'off', right = 'off')
 plt.rcParams['font.sans-serif']=['SimHei']
 
 plt.rcParams['axes.unicode_minus'] = False
 # 显 图形
 plt.show()

重点提示

 plt.rcParams['font.sans-serif']=['SimHei']
 
 plt.rcParams['axes.unicode_minus'] = False
 move_br = res.xpath('/html/body/p[3]/p[1]/p[2]/p[1]/p[1]/p[1]/p[1]/p[2]/descendant-or-self::text()').getall()
         for i in range(len(move_br)):
             if move_br[i] == '制片国家/地区:':
                 country = move_br[i+1]
                 # ? 去除里面所有的空格
                 move_country = country.replace(" ","")
             elif move_br[i] == '语言:':
                 language = move_br[i+1]
                 move_language = language.replace(" ","")
                 # ! 后面就不需要了
                 break



展开阅读全文

投稿时间:2022-05-24  最后更新:2022-05-24

标签:数据   爬虫   电影   边框   基准   制片   实战   评分   热门   类型   语言   情况   项目   内容

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2022 All Rights Reserved. Powered By Q578.com 闽ICP备11008920号-1
闽公网安备35020302032606号

Top