当前位置: 首页 > news >正文

Python实例题:Web 爬虫与数据可视化

目录

Python实例题

题目

要求:

解题思路:

代码实现:

Python实例题

题目

Web 爬虫与数据可视化

要求

  • 编写一个爬虫,从豆瓣电影 Top250 页面(豆瓣电影 Top 250)抓取电影名称、评分、导演、主演和上映年份。
  • 将数据存储到 SQLite 数据库中。
  • 基于数据库数据,使用 Matplotlib 生成柱状图,展示评分最高的 10 部电影。
  • 添加异常处理(如网络请求失败、解析错误、数据库操作失败等)。

解题思路

  • 使用 requests 和 BeautifulSoup 实现网页爬取与解析。
  • 使用 sqlite3 建立数据库并存储数据。
  • 使用 matplotlib 绘制柱状图。
  • 添加重试机制和异常捕获。

代码实现

import requests
from bs4 import BeautifulSoup
import sqlite3
import matplotlib.pyplot as plt
from requests.exceptions import RequestException
import timedef fetch_movie_data(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'}max_retries = 3for attempt in range(max_retries):try:response = requests.get(url, headers=headers, timeout=10)response.raise_for_status()return response.textexcept RequestException as e:print(f"请求失败 ({attempt+1}/{max_retries}): {e}")if attempt < max_retries - 1:time.sleep(2)  # 等待2秒后重试return Nonedef parse_movie_data(html_content):if not html_content:return []soup = BeautifulSoup(html_content, 'html.parser')movies = []for item in soup.select('div.item'):try:title = item.select_one('span.title').text.strip()rating = float(item.select_one('span.rating_num').text)info = item.select_one('div.bd p').text.strip()# 解析导演、主演和年份director, *actors = info.split('\xa0\xa0\xa0')[0].replace('导演: ', '').split('主演: ')year = info.split('\n')[-1].strip().split('/')[0]movies.append({'title': title,'rating': rating,'director': director.strip(),'actors': actors[0].strip() if actors else '','year': year})except (AttributeError, ValueError, IndexError) as e:print(f"解析错误: {e}")return moviesdef save_to_database(movies):conn = sqlite3.connect('douban_movies.db')c = conn.cursor()try:c.execute('''CREATE TABLE IF NOT EXISTS movies(id INTEGER PRIMARY KEY AUTOINCREMENT,title TEXT NOT NULL,rating REAL NOT NULL,director TEXT,actors TEXT,year TEXT)''')for movie in movies:c.execute('''INSERT INTO movies (title, rating, director, actors, year)VALUES (?, ?, ?, ?, ?)''',(movie['title'], movie['rating'], movie['director'], movie['actors'], movie['year']))conn.commit()except sqlite3.Error as e:print(f"数据库错误: {e}")conn.rollback()finally:conn.close()def plot_top_movies():conn = sqlite3.connect('douban_movies.db')c = conn.cursor()try:c.execute('SELECT title, rating FROM movies ORDER BY rating DESC LIMIT 10')top_movies = c.fetchall()if not top_movies:print("数据库中没有电影数据")returntitles, ratings = zip(*top_movies)plt.figure(figsize=(10, 6))plt.barh(titles, ratings, color='skyblue')plt.xlabel('评分')plt.ylabel('电影名称')plt.title('豆瓣电影评分Top10')plt.tight_layout()plt.savefig('top_movies.png')plt.show()except sqlite3.Error as e:print(f"数据库错误: {e}")finally:conn.close()if __name__ == "__main__":all_movies = []for start in range(0, 250, 25):url = f"https://movie.douban.com/top250?start={start}"html = fetch_movie_data(url)movies = parse_movie_data(html)all_movies.extend(movies)print(f"已抓取 {start+25}/250 部电影")time.sleep(1)  # 避免请求过快if all_movies:save_to_database(all_movies)plot_top_movies()else:print("未抓取到任何电影数据")
http://www.lqws.cn/news/503371.html

相关文章:

  • 《AI大模型核心技术揭秘与商业落地实战》学习内容系统总结
  • Android APP内切换语言无感重启到当前界面
  • Jenkins+Jmeter+Ant接口持续集成
  • 6.24_JAVA_微服务_Elasticsearch搜索
  • Temporal Join,一探究竟
  • 【服务器】教程 — Linux上如何挂载服务器NAS
  • GitHub Actions 的深度解析与概念介绍
  • 智能制造——解读基于AI框架的智能工厂设计思路【附全文阅读】
  • 【论文阅读 | CVPRW 2023 |CSSA :基于通道切换和空间注意力的多模态目标检测】
  • CSS 实现文本溢出省略号(三种主流方式,适配单行 多行)
  • PHP 华为云H5上传文件:临时链接上传文件和POST表单直传
  • 华为云Flexus+DeepSeek征文|基于华为云Flexus Dify复用优秀 AI Agent 应用教程
  • Elasticsearch | 索引和模板字段管理:增加新字段的详细操作
  • 《C++初阶之类和对象》【初始化列表 + 自定义类型转换 + static成员】
  • React性能优化精髓之一:频繁setState导致滚动卡顿的解决方案
  • Jmeter接口自动化测试框架
  • 从零开始学习Spring Cloud Alibaba (一)
  • Gradio可视化构建聊天机器人
  • 开源模型应用落地-让AI更懂你的每一次交互-用Redis Stack与LangChain解锁大模型的长期记忆潜能(二)
  • 前端后端文件下载防抖实现方案
  • 【大模型学习】项目练习:套壳DeepSeek
  • 阿里最新开源:Mnn3dAvatar 3D数字人框架, 无需联网,本地部署可离线运行,支持多模态实时交互
  • 索引优化SEO帮助你的网站内容更快被搜索引擎发现
  • Python的GUI库选择指南(深度拓展)
  • C++ —— STL容器 —— vector的模拟实现
  • 【Java开发日记】我们详细地讲解一下 Java 异常及要如何处理
  • 快速sincos算法,stm32测试
  • 如何轻松地将照片从 iPhone 传输到计算机
  • 【LLaMA-Factory 实战系列】三、命令行篇 - YAML 配置与高效微调 Qwen2.5-VL
  • iOS应用开发中的性能调试与数据分析:一套完整实战工具流程