Python爬虫与数据可视化教程

对于经常写爬虫的技术来说了,可视化大大的提高工作效率,可以让获取的数据更直观的展示在面前,下面我将通过具体实操给大家展示下多种可视化具体教程,希望能都帮助大家。

在这里插入图片描述

下面是一个完整的Python爬虫和数据可视化解决方案,我们将爬取豆瓣电影Top250数据并进行多种可视化展示。

import requests
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.font_manager import FontProperties
import time
import random
from wordcloud import WordCloud
import jieba
from collections import Counter# 设置中文字体
font = FontProperties(fname=r"simhei.ttf", size=12)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号# 爬取豆瓣电影Top250数据
def scrape_douban_top250():base_url = "https://movie.douban.com/top250"headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}movies = []for start in range(0, 250, 25):url = f"{base_url}?start={start}"try:response = requests.get(url, headers=headers)response.raise_for_status()soup = BeautifulSoup(response.text, 'html.parser')items = soup.find_all('div', class_='item')for item in items:# 排名rank = item.find('em').text# 标题title = item.find('span', class_='title').text# 信息info = item.find('div', class_='bd').p.text.strip().split('\n')[0].strip()# 评分rating = item.find('span', class_='rating_num').text# 评价人数num_ratings = item.find('div', class_='star').find_all('span')[-1].text[:-3]# 简介quote_tag = item.find('span', class_='inq')quote = quote_tag.text if quote_tag else ""# 提取年份和地区info_parts = info.split('/')year = info_parts[0].strip()[-4:]  # 提取年份region = info_parts[1].strip() if len(info_parts) > 1 else "未知"movies.append({'排名': int(rank),'标题': title,'年份': int(year) if year.isdigit() else 0,'地区': region,'评分': float(rating),'评价人数': int(num_ratings.replace(',', '')) if num_ratings else 0,'简介': quote})# 随机延时,避免请求过快time.sleep(random.uniform(1, 2))except Exception as e:print(f"爬取第 {start//25 + 1} 页时出错: {e}")return movies# 数据可视化
def visualize_movie_data(df):# 1. 创建画布plt.figure(figsize=(18, 12))plt.suptitle('豆瓣电影Top250数据分析', fontsize=20, fontweight='bold', fontproperties=font)# 2. 评分分布直方图plt.subplot(2, 3, 1)sns.histplot(df['评分'], bins=20, kde=True, color='skyblue')plt.title('电影评分分布', fontproperties=font)plt.xlabel('评分', fontproperties=font)plt.ylabel('电影数量', fontproperties=font)plt.axvline(df['评分'].mean(), color='red', linestyle='dashed', linewidth=1)plt.text(df['评分'].mean()+0.05, 20, f'平均分: {df["评分"].mean():.2f}', color='red')# 3. 评分与年份的关系plt.subplot(2, 3, 2)sns.scatterplot(x='年份', y='评分', data=df, hue='评分', palette='coolwarm', size='评价人数', sizes=(20, 200))plt.title('评分与年份的关系', fontproperties=font)plt.xlabel('年份', fontproperties=font)plt.ylabel('评分', fontproperties=font)plt.xticks(rotation=45)# 4. 各地区电影数量plt.subplot(2, 3, 3)region_counts = df['地区'].value_counts().head(8)colors = plt.cm.Paired(np.linspace(0, 1, len(region_counts)))region_counts.plot(kind='pie', autopct='%1.1f%%', colors=colors, shadow=True, startangle=90)plt.title('各地区电影占比', fontproperties=font)plt.ylabel('')# 5. 评分TOP10电影plt.subplot(2, 3, 4)top10 = df.sort_values('评分', ascending=False).head(10)sns.barplot(x='评分', y='标题', data=top10, palette='viridis')plt.title('评分TOP10电影', fontproperties=font)plt.xlabel('评分', fontproperties=font)plt.ylabel('电影标题', fontproperties=font)for i, v in enumerate(top10['评分']):plt.text(v - 0.4, i, str(v), color='white', va='center', fontweight='bold')# 6. 评价人数TOP10电影plt.subplot(2, 3, 5)top10_popular = df.sort_values('评价人数', ascending=False).head(10)sns.barplot(x='评价人数', y='标题', data=top10_popular, palette='magma')plt.title('评价人数TOP10电影', fontproperties=font)plt.xlabel('评价人数', fontproperties=font)plt.ylabel('电影标题', fontproperties=font)# 7. 年份分布plt.subplot(2, 3, 6)sns.countplot(x='年份', data=df, order=df['年份'].value_counts().index.sort_values(), palette='Set2')plt.title('电影年份分布', fontproperties=font)plt.xlabel('年份', fontproperties=font)plt.ylabel('数量', fontproperties=font)plt.xticks(rotation=90)plt.tight_layout(rect=[0, 0, 1, 0.96])plt.savefig('movie_analysis.png', dpi=300)plt.show()# 8. 词云图 - 电影标题关键词all_titles = ' '.join(df['标题'])word_list = jieba.cut(all_titles)word_count = Counter(word_list)# 过滤单字词filtered_words = {word: count for word, count in word_count.items() if len(word) > 1 and word not in ['电影', '豆瓣']}wc = WordCloud(font_path='simhei.ttf',background_color='white',max_words=200,width=1000,height=700).generate_from_frequencies(filtered_words)plt.figure(figsize=(12, 8))plt.imshow(wc, interpolation='bilinear')plt.title('电影标题关键词词云', fontsize=16, fontproperties=font)plt.axis('off')plt.savefig('movie_wordcloud.png', dpi=300)plt.show()# 主函数
def main():print("开始爬取豆瓣电影Top250数据...")movies = scrape_douban_top250()print(f"成功爬取 {len(movies)} 部电影数据")# 创建DataFramedf = pd.DataFrame(movies)# 保存到CSVdf.to_csv('douban_top250.csv', index=False, encoding='utf_8_sig')print("数据已保存到 douban_top250.csv")# 数据可视化print("开始数据可视化...")visualize_movie_data(df)print("可视化完成,结果已保存为 movie_analysis.png 和 movie_wordcloud.png")if __name__ == "__main__":main()

代码功能说明

1. 数据爬取部分

  • 使用requests库爬取豆瓣电影Top250的10个页面
  • 使用BeautifulSoup解析HTML
  • 提取每部电影的排名、标题、年份、地区、评分、评价人数和简介
  • 添加随机延时避免请求过快被封禁

2. 数据可视化部分

创建了7个可视化图表和1个词云图:

  1. 评分分布直方图:展示电影评分的分布情况,包含平均分参考线
  2. 评分与年份关系散点图:展示电影评分随年份的变化趋势
  3. 地区分布饼图:展示电影的地区分布比例
  4. 评分TOP10电影:展示评分最高的10部电影
  5. 评价人数TOP10电影:展示评价人数最多的10部电影
  6. 年份分布图:展示电影在不同年份的数量分布
  7. 电影标题关键词词云:展示电影标题中出现频率最高的关键词

3. 数据保存

  • 将爬取的数据保存为CSV文件(douban_top250.csv)
  • 将可视化结果保存为PNG图片

运行要求

  1. 安装必要的Python库:
pip install requests beautifulsoup4 pandas matplotlib seaborn jieba wordcloud
  1. 需要中文字体支持:
  • 代码中使用了"simhei.ttf"(黑体),请确保系统中存在该字体
  • 或者替换为其他支持中文的字体文件路径

注意事项

  1. 网络爬虫可能受到网站反爬策略的限制,如果爬取失败,请尝试:

    • 增加请求头中的User-Agent信息
    • 增加请求之间的延时
    • 使用代理IP
  2. 本代码仅用于学习目的,请尊重网站的数据使用政策

运行此代码后,我们将获得一个包含爬取数据的CSV文件和多张高质量的可视化图表图片,总体来说数据展示的还是挺直观的,如有任何问题可以留言讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/87467.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/87467.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【GHS】Green Hills软件MULTI-IDE的安装教程

前言:MULTI-IDE作为一款Green Hills开发的支持C/C、Ada等语言的嵌入式开发环境,由于其优异的性能,所以在汽车电子软件的开发中占有重要地位。但是这款IDE需要付费使用,对于个人学习而言不太友好,所以这里介绍一款PJ版本…

Web攻防-文件上传黑白名单MIMEJS前端执行权限编码解析OSS存储分域名应用场景

知识点: 1、WEB攻防-文件上传-前端&黑白名单&MIME&文件头等 2、WEB攻防-文件上传-执行权限&解码还原&云存储&分站等 3、WEB攻防-文件上传-JS提取&特定漏洞&第三方编辑器 4、WEB攻防-文件上传-思维导图形成 常规文件上传&#xff1a…

Odoo系统大型业务优化实战

目录 背景说明ORM与模型优化数据量处理策略接口与报表优化系统架构优化监控与诊断工具项目实战总结(案例)后续优化建议性能优化检查清单总结 一、背景说明 在 Odoo 项目中,随着业务不断扩展,系统常常面临如下挑战: …

【2.4 漫画SpringBoot实战】

🚀 漫画SpringBoot实战 🎯 学习目标:掌握SpringBoot企业级开发,从零到一构建现代化Java应用 📋 目录 SpringBoot核心特性自动配置原理Web开发实战数据访问与事务监控与部署🎭 漫画引言 小明: “为什么SpringBoot这么受欢迎?” 架构师老王: “SpringBoot就像全自动…

美国站群服务器的优势和应用与选择指南

在当今数字化时代,互联网业务的蓬勃发展促使各类企业和个人不断寻求高效、稳定且功能强大的网络解决方案。美国站群服务器作为一种备受瞩目的网络基础设施,正逐渐成为众多从事跨境电商、搜索引擎优化(SEO)、内容分发、数据采集等业…

智能合约基础:Solidity语法速成

目录 智能合约基础:Solidity语法速成引言:区块链的可编程世界1. Solidity基础语法1.1 合约结构1.2 数据类型2. 核心概念详解2.1 可见性修饰符2.2 状态可变性2.3 错误处理2.4 事件与日志3. 高级特性3.1 继承与接口3.2 修饰器3.3 委托调用与代理合约4. 完整DeFi质押合约实现5. …

SmartDV推出先进的H.264和H.265视频编码器和解码器IP

向全球市场提供灵活、高度可配置、可定制的半导体设计知识产权(IP)和验证IP(VIP)的开发商SmartDV™ Technologies近日宣布:公司现已提供即刻可用的H.264和H.265视频编码器和解码器IP解决方案。针对每一种技术&#xff…

数据结构学习day8---strstr+symlink+remove+rename+link+truncate

一、strstr 1.头文件 #include <string.h> 2.函数原型 char *strstr(const char *haystack, const char *needle);3.功能 在一个字符串haystack中查找另一个字符串needle的第一次出现&#xff0c;并返回该位置的指针&#xff0c;如果找不到&#xff0c;则返回NULL。 …

智能设备远程管理:基于OpenAI风格API的自动化实践

在数字化转型的浪潮中&#xff0c;智能设备的远程管理功能变得越来越重要。通过API接口实现对智能设备的自动化操作&#xff0c;不仅可以提高工作效率&#xff0c;还可以增强系统的灵活性和可扩展性。本文将详细介绍如何利用Python和openai库&#xff0c;结合一个类似OpenAI风格…

数字电路工作原理

1、数字电路的分类 2、基本结构和特点 3、电路特性 4、电路互连 5、电路选型基本原则 1、数字电路的分类 GaAs 该电路类型 速度快,功耗大,原料剧毒,至今尚未被大量应用 硅 出现了单极型 PMOS NMOS CMOS 双极性 TTL STTL、LSTTL、ALSTTL、FTTL、LVTTL ECL MEC…

C# 进行音视频编解码开发

一、音视频编解码基础 1.1 基本概念 音视频编解码是数字媒体处理的核心技术,主要涉及将原始音视频数据进行压缩编码以便存储和传输,以及将压缩数据解码为可播放的原始格式。在 C# 环境下开发音视频编解码器,需要先了解几个关键概念: 编码 (Encoding):将原始音视频数据转…

YOLOv11深度解析:Ultralytics新一代目标检测王者的创新与实践(附网络结构图+训练/推理/导出全流程代码详解)

🔥 一、YOLOv11为何成为新标杆? 2024年底,Ultralytics正式推出YOLOv11,在COCO数据集上以更少参数量(减少22%) 实现了超越YOLOv8的精度,成为边缘设备与云端部署的新宠。其核心创新在于: 轻量化设计:深度可分离卷积(DWConv)大幅降低计算量注意力增强:C2PSA模块提升…

live server插件vscode的配置

安装完其实就可以直接使用了&#xff0c;一般来说不必手动配置&#xff0c;点击右下角的go live按钮就可以运行。默认端口是5500 好的&#xff0c;为你详细说明如何在 VS Code 中配置 Live Server 插件。这是一个非常有用的插件&#xff0c;我们不仅会讲如何安装和使用&#x…

基于MATLAB的风力发电机无人机巡检路径优化研究

基于MATLAB的风力发电机无人机巡检路径优化研究 摘要 本文针对风力发电机无人机巡检路径优化问题,提出了一种基于三维参数建模与智能优化算法的解决方案。通过建立风力发电机的三维几何模型,综合考虑无人机的飞行约束条件和巡检任务需求,设计了多目标优化函数,并采用改进…

经纬度哈希编码实现方式

背景&#xff1a;在大数据数仓建设的过程中&#xff0c;有时会遇到经纬度类型的数据信息&#xff0c;但在进行关联分析和数仓建设的时候用经纬度去关联&#xff0c;难免不够便捷&#xff0c;于是我们可以开发UDF使用地理经纬度信息哈希编码的方案进行开发&#xff0c;非常有效 …

支持向量机(SVM)深度解析:从数学根基到工程实践

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…

矩阵的范数和逆矩阵的范数的关系

文章目录 前提条件关键结论推导过程简述注意事项示例说明&#x1f4d8; 谱范数定义✅ 步骤一&#xff1a;计算 A T A A^T A ATA✅ 步骤二&#xff1a;求 A T A A^T A ATA 的特征值✅ 步骤三&#xff1a;取最大特征值的平方根✅ 对 A − 1 A^{-1} A−1 做同样的操作✅ 最终结…

成像光谱遥感技术中的AI革命:ChatGPT在遥感领域中的应用

课程将最新的人工智能技术与实际的遥感应用相结合&#xff0c;提供不仅是理论上的&#xff0c;而且是适用和可靠的工具和方法。无论你是经验丰富的研究人员还是好奇的从业者&#xff0c;本课程都将为分析和解释遥感数据开辟新的、有效的方法&#xff0c;使你的工作更具影响力和…

Debian12 安装 sippts

试了试&#xff0c;貌似不复杂&#xff0c;记录如下&#xff1a; apt-get install -y python3 python3 --version # 3.11.2 apt-get install -y python3-pip pip3 --version # 24.3.1 rm /usr/lib/python3.11/EXTERNALLY-MANAGED cd /usr/src git clone https://github.com/…

VR Panorama 360 PRO Renderer保姆级别教程

总览: 全景图及全景视频录制插件有两个 一个是件(以下简称VR360插件) 一个是Unity官方的Unity Recorder插件(以下简称Recorder插件) 在图片清晰度上VR 360插件要高于Recorder插件,所以渲染全景图时,优先使用VR 360插件,当然全景视频也可以使用VR360插件。 但VR 360插件…