山东科技大学 Python数据处理结课作业

一、数据分析内容简介

这是一个电影信息爬取和分析的项目,该项目从豆瓣网站上爬取了2023年国内外的电影信息。通过爬取,获得了每部电影的标题、评分、类型和地区等关键信息,并进一步进行了数据清理和处理。随后,利用这些数据绘制了多个图表,如评分分布图和类型占比图,以直观地展示电影数据的不同方面。

二、应用技术介绍

    (1)首先使用爬虫技术从豆瓣网页中提取所需的电影信息。使用了自动化测试和网页操作的工具Selenium和Beautiful Soup库来获取和解析HTML内容,提取目标信息。

由于需要在网页的筛选栏中选择2023年代,所以使用了Selenium来模拟打开网页、选择年代为2023的操作,获得需要的页面数据。

chrome_options = Options()

chrome_options.add_argument('--ignore-ssl-errors=yes')

chrome_options.add_argument('--ignore-certificate-errors')

driver = webdriver.Chrome( options=chrome_options)

url = "https://movie.douban.com/explore"

driver.get(url)

# 选择年代为2023

year_selector = driver.find_element(By.CLASS_NAME, 'base-selector-title')

year_selector.click()

year_selector.send_keys(Keys.DOWN)

year_selector.send_keys(Keys.ENTER)

# 获取页面源码

html_content = driver.page_source

(2)在上一段代码获得页面数据后,使用BeautifuSoup库对页面的数据进行提取,获得电影标题、评分、所属地区和类型。

for li_tag in soup.find_all('li'):

    title_tag = li_tag.find('span', class_='drc-subject-info-title-text')

    rating_tag = li_tag.find('span', class_='drc-rating-num')

    subtitle_tag = li_tag.find('div', class_='drc-subject-info-subtitle')

(3)接着对从网页上爬取的原始数据进行清理和处理。使用了Pandas库,对电影评分进行转换、切分电影类型、处理地区信息等,以便进行后续的统计和分析。

例如此处使用Pandas库找到电影类型,并计算平均分

csv_file_path = 'movie_data.csv'

df = pd.read_csv(csv_file_path)

# 清理数据并将评分转换为浮点数,将'暂无 评分'排除

df['rating'] = pd.to_numeric(df['rating'], errors='coerce')

# 切分电影类型字段,一个电影可能属于多个类型

df['genres'] = df['genre'].str.split()

# 计算所有电影的平均评分

overall_avg_rating = df['rating'].mean()

(4)数据可视化: 利用Matplotlib库进行数据可视化,以图表的形式展示电影数据的各种特征。

此处,用Matplotlib库绘制出了各类型电影平均分的柱状图。

# 绘制柱状图

plt.figure(figsize=(14, 8))

genre_avg_ratings = df.explode('genres').groupby('genres')['rating'].mean().sort_values(ascending=False)

genre_avg_ratings.plot(kind='bar', color='skyblue', edgecolor='black')

plt.axhline(y=overall_avg_rating, color='red', linestyle='--', label='所有电影的平均评分')

plt.text(-0.5, overall_avg_rating, f'平均分: {overall_avg_rating:.2f}', color='red', ha='right')

plt.title('每种类型电影的平均评分')

plt.xlabel('电影类型')

plt.ylabel('平均评分')

plt.xticks(rotation=45, ha='right')  # 旋转x轴标签,使其更易读

plt.legend()  # 显示图例

plt.show()

三、数据采集与数据清洗

      (1)首先使用Selenium和Beautiful Soup库来获取和解析HTML内容,提取目标信息。使用了Selenium来模拟打开网页、选择年代为2023的操作,获得需要的页面数据。

chrome_options = Options()

chrome_options.add_argument('--ignore-ssl-errors=yes')

chrome_options.add_argument('--ignore-certificate-errors')

driver = webdriver.Chrome( options=chrome_options)

url = "https://movie.douban.com/explore"

driver.get(url)

# 选择年代为2023

year_selector = driver.find_element(By.CLASS_NAME, 'base-selector-title')

year_selector.click()

year_selector.send_keys(Keys.DOWN)

year_selector.send_keys(Keys.ENTER)

# 获取页面源码

html_content = driver.page_source

(2)获得页面数据后,使用BeautifuSoup库对页面的数据进行提取,获得电影标题、评分、所属地区和类型。

for li_tag in soup.find_all('li'):

    title_tag = li_tag.find('span', class_='drc-subject-info-title-text')

    rating_tag = li_tag.find('span', class_='drc-rating-num')

    subtitle_tag = li_tag.find('div', class_='drc-subject-info-subtitle')

(3)接着将上一步提取到的数据按格式存在csv文件中。

movie_info = {

'title': title,

'rating': rating,

'year': year,

'country': country,

'genre': genre

 }

movie_list.append(movie_info)

# 将数据写入CSV文件

csv_file_path = 'movie_data.csv'

fields = ['title', 'rating', 'year', 'country', 'genre']

with open(csv_file_path, 'w', newline='', encoding='utf-8') as csv_file:

    writer = csv.DictWriter(csv_file, fieldnames=fields)

   

    # 写入表头

    writer.writeheader()

   

    for movie in movies:

        writer.writerow(movie)

(4)打开此csv文件,结果如下:

       title rating  year    country     genre

0     年会不能停!    8.2  2023       中国大陆     剧情 喜剧

1        三大队    7.8  2023       中国大陆     剧情 犯罪

2    一闪一闪亮星星    6.1  2023       中国大陆     爱情 奇幻

3        金手指    6.5  2023  中国香港 中国大陆     剧情 犯罪

4         潜行    6.0  2023  中国大陆 中国香港  剧情 动作 犯罪

..       ...    ...   ...        ...       ...

495      奇美拉    8.2  2023  意大利 法国 瑞士        剧情

496   一个人的朝圣    7.5  2023         英国        剧情

497     一个好人    6.9  2023         美国        剧情

498    圣诞多美好    4.3  2023         美国  喜剧 悬疑 恐怖

499     奇遇天缘   暂无评分  2023       中国大陆  剧情 爱情 奇幻

四、数据分析

        1.电影评分分布图

使用Matplotlib库绘制2023年电影评分分布图。

# 绘制电影评分分布图,以0.5为一格

plt.figure(figsize=(10, 6))

plt.hist(df['rating'].dropna(), bins=np.arange(0, 10.5, 0.5), color='skyblue', edgecolor='black')

plt.title('电影评分分布图')

plt.xlabel('评分')

plt.ylabel('电影数量')

plt.grid(axis='y', linestyle='--', alpha=0.7)

plt.show()

结果如下:

从柱状图可以直观的看到:2023年电影评分集中分布在6-8分之间,评分中上,说明2023年上映电影整体质量较好,用户评价也较为满意。同时注意到9分以上的电影数量极少,说明2023年缺少难得一遇的“好片”。

        2.国内外电影数占比和评分图

通过绘制饼状图,可以很清楚的看出国内外电影所占比例。

# 绘制饼状图

labels = [f'中国电影\n(平均评分: {china_movies_avg_rating:.2f})', f'国外电影\n(平均评分: {foreign_movies_avg_rating:.2f})']

sizes = [china_movies_count, foreign_movies_count]

colors = ['lightcoral', 'lightskyblue']

fig, ax = plt.subplots(figsize=(8, 8))

ax.pie(sizes, labels=labels, autopct='%1.1f%%', colors=colors, startangle=140)

ax.set_title('中国电影和国外电影比例')

在图中我们可以看到:中国电影在2023年上映电影总数中约占1/3,比例极大,2023中国电影市场较为繁荣,人们观影兴趣较高,上映电影数量多。但是国内电影评分较国外总体低约0.7,较总平均分低约0.5。量大管饱但并不好吃,国内电影总体水平还需要提高。

        3.各类型电影占比图

为寻找2023年最受欢迎的电影类型,可以使用饼状图做出各类型电影比例,查看哪种类型上映最多。

# 统计每个类型的数量

genre_counts = df['genres'].explode().value_counts()

# 将低于1%的类型合并为“其他”

threshold = 0.01

other_genres = genre_counts[genre_counts / genre_counts.sum() < threshold].index

df['genres'] = df['genres'].apply(lambda x: ['其他'] if any(genre in other_genres for genre in x) else x)

genre_counts = df['genres'].explode().value_counts()

# 绘制饼状图

labels = genre_counts.index

sizes = genre_counts.values

colors = plt.cm.Paired(range(len(labels)))  # 使用Paired色彩映射

plt.figure(figsize=(10, 10))

plt.pie(sizes, labels=labels, autopct='%1.1f%%', colors=colors, startangle=140)

plt.title('电影类型比例')

plt.show()

从图中可以看到:

(1)从图中可以看到2023年上映数量最多的电影是剧情片,占比达到1/5,

这说明观众对于故事情节和人物发展较为感兴趣,电影产业对于深刻、引人入胜的叙事较为重视。

(2)尽管剧情片居于首位,但喜剧、动作、惊悚和犯罪类电影也在上映数量中占据了显著比例,各占10%-5%。这说明观众对于轻松幽默、紧张刺激、以及复杂犯罪情节的欣赏。

(3)历史类、传记类、音乐类等其他类型电影占比相对较低,约为1%左右。说明大多数观众对于较为严肃和需要一定观赏门槛的电影不太感兴趣。

(4)各种类型电影的占比多样,观众的口味相对多样化,对于不同类型的电影都有一定的兴趣。

        4.各类型电影平均评分

通过matplotlib库,可以计算各类型电影的平均分

# 切分电影类型字段,一个电影可能属于多个类型

df['genres'] = df['genre'].str.split()

# 计算所有电影的平均评分

overall_avg_rating = df['rating'].mean()

# 绘制柱状图

plt.figure(figsize=(14, 8))

genre_avg_ratings = df.explode('genres').groupby('genres')['rating'].mean().sort_values(ascending=False)

genre_avg_ratings.plot(kind='bar', color='skyblue', edgecolor='black')

plt.axhline(y=overall_avg_rating, color='red', linestyle='--', label='所有电影的平均评分')

plt.text(-0.5, overall_avg_rating, f'平均分: {overall_avg_rating:.2f}', color='red', ha='right')

plt.title('每种类型电影的平均评分')

plt.xlabel('电影类型')

plt.ylabel('平均评分')

plt.xticks(rotation=45, ha='right')  # 旋转x轴标签,使其更易读

plt.legend()  # 显示图例

plt.show()

上面的柱状图显示:

(1)音乐、纪录片、和传记类等受欢迎程度较低的电影往往拥有较高的评分,这类电影更注重艺术性、深度和对现实生活的真实反映,它们往往有深刻的故事叙述、人物描绘,以及对于特定主题的独立探索,而这些因素可能为高评分的原因之一。

(2)而大众化的动作、惊悚类电影评分低于平均值,它们通常追求视觉效果和刺激。这可能导致观众对于这类电影的评分存在较大的差异,一部分观众可能会喜欢其中的动作场面和紧张气氛,而另一部分观众可能对这种类型的电影不太感兴趣,从而给予较低的评分。

(3)剧情、喜剧类电影评分在平均值附近,它们更能平衡深刻的故事情节和观众的娱乐需求。这类电影可能能够吸引较广泛的观众,从而获得相对平均的评分。

四、项目总结

1.在完成这个项目事使用了以下的技术和方法:

(1)网页爬取: 使用Selenium和Beautiful Soup库获取和解析HTML内容,从豆瓣网页源代码中提取电影信息。

(2)数据清理与处理: 使用Pandas库进行数据清理和处理,包括将评分转换为浮点数、切分电影类型、处理地区信息等。

(3)数据可视化: 使用Matplotlib库进行数据可视化,绘制了电影评分分布图、电影类型比例饼状图、每种类型电影的平均评分柱状图等。

2.在完成项目时,也遇到了一些问题:

(1)打开后的豆瓣电影网页并非目的网页,只有在选择栏中选择年代为2023后的,动态加载的新页面才是需要爬取的页面,所以项目不再使用request库,而是使用了selenium库模拟人工操作。

(2)在Matplotlib库绘制评分分布图时,由于没有对一些暂无评分的电影进行过滤,导致了“ValueError”,解决方法为将'暂无 评分'的数据排除,并将剩余的评分数据转换为浮点数。

(3)Matplotlib库在显示中文时出现问题,文字显示中出现方框而非要求的中文说明,通过设置默认字体为'SimHei'字体,解决了中文输出问题。

(4)在绘制电影类型占比图时,一些类型的电影数量太少,导致饼状图电影类型说明文字重叠,通过把占比低于1%的类型的描述文字省略,并将它们一起显示为其它优化了显示。

五、学习心得

学习了Python数据处理课程之后,我受益匪浅,积累了许多宝贵的数据处理和分析技能。学到了很多关于Python和数据处理的知识。

首先,通过课程我掌握了Python编程语言的基础知识,包括变量、数据类型、循环、条件语句等。这为后续在数据处理中的编程提供了坚实的基础。

之后,深入理解了Pandas库,它是Python中用于数据处理和分析的工具。我学会了如何使用Pandas进行数据清理、处理、过滤、合并等操作,对数据结构有了更深的理解。

此外我学到了如何使用Matplotlib创建各种类型的图表,包括折线图、柱状图、散点图等。这让我能够更好地展示和解释数据,提高了数据可视化的能力。

通过完成结课作业我收获了实际项目经验,深入了解了在真实场景中如何处理和分析数据。这样的实际经验对我在实际工作中应用所学知识起到了很大的帮助。

  • 22
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值