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.pswp.cn/pingmian/86550.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/86550.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/86550.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于ubuntu 20.04系統安裝分區和重復登錄無法加載桌面的問題解決

1. 想要安裝Ubuntu 20.04版本&#xff0c;有兩塊硬盤&#xff0c;所以在分區列表設置的格式為如下&#xff1a; 其中各個/boot 、/home的格式為如下&#xff08;Ubuntu20.04分區方案_ubuntu20.04手動分區-CSDN博客&#xff09; 2.安裝完死活輸完密碼進不去主界面 必須禁用Nou…

26考研|數學分析:隱函數定理及其應用

前言 本章主要圍繞隱函數、隱含數組的計算展開&#xff0c;本章的核心還是在于計算的運用&#xff0c;在理論層面要掌握隱函數&#xff08;隱函數組&#xff09;存在性定理&#xff0c;在計算方面&#xff0c;要掌握隱函數、隱函數組的計算方法&#xff0c;此外&#xff0c;本…

PyQtNode Editor 第三篇創建節點(節點的定義)

在 PyQtNode Editor 的開發之旅中,經過前兩篇博客對基礎環境搭建和核心類結構的探索,我們已經邁出了堅實的步伐。今天,我們將聚焦于node_scene文件,深入解析其中的代碼邏輯。這段代碼構建了Scene類,它如同整個節點編輯器的 “管理中樞”,承擔著組織和協調節點、邊等關鍵元…

通過docker安裝nginx服務

nginx配置文件 https://gitee.com/Cairo-SR8/nginx-configuration.git一、安裝nginx 1.1 拉去ARM鏡像 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/linux_arm64_nginx:latest1.2 拉去x86鏡像 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/…

盲法在臨床試驗中的應用與挑戰

一、盲法分級與科學價值 1.1 開放標簽 1.1.1 受盲對象 無隱藏。 1.1.2 適用場景 外科手術、器械試驗等無法偽裝的操作。 1.1.3 偏倚控制目標 僅客觀終點(生存率、實驗室指標)。 1.2 單盲 1.2.1 受盲對象 患者。 1.2.2 適用場景 患者報告結局(PRO)為主的試驗(如…

VNware啟動虛擬機報錯:虛擬化性能計數器需要版本為 3 或以上的架構性能監控。

Vmware版本&#xff1a;17.5 結論&#xff1a; 【編輯虛擬機設置-硬件-處理器-虛化計數器】沒勾就勾上&#xff0c;勾了就不勾保存&#xff0c;然后重新打勾 備注&#xff1a;不知道是不是顯示問題&#xff0c;之前勾著的時候報錯。取消報錯&#xff0c;再勾上報錯能正常啟動虛…

微機系統 - 第7章 -可編程接口芯片

可編程并行輸入/輸出接口芯片 8255A -1:結構 8255A為40引腳、雙列直插封裝。 內部結構由數據端口、組控制電路、數據總線緩沖器、讀/寫控制邏輯四部分組成。 數據總線緩沖器&#xff1a;三態8位雙向緩沖器&#xff0c;D7-D0同系統數據總線相連。CPU通過執行輸入/輸出指令來實…

解析云計算虛擬化基石:KVM、QEMU與Libvirt的協同

在云計算和容器化大行其道的今天&#xff0c;傳統虛擬化技術仍是企業IT架構的核心支柱。理解KVM、QEMU和Libvirt的關系&#xff0c;是掌握現代虛擬化技術的關鍵一步。 一、虛擬化技術演進&#xff1a;從軟件模擬到硬件加速的進化之路 虛擬化技術通過在單臺物理服務器上創建多個…

Mac mini 跑 DeepSeek R1 及 QwQ-32B模型實測報告

測試對象&#xff1a;2025 款 Mac mini&#xff08;M4 / M4 Pro 芯片&#xff09; 測試模型&#xff1a;DeepSeek-R1&#xff08;14B/32B&#xff09;、QwQ-32B&#xff08;原版/量化版&#xff09; 測試目標&#xff1a;硬件性能適配性、推理速度、內存占用及優化方案 一、Mac…

github常用插件

一&#xff0c;文檔輔助閱讀系列&#xff1a;自動化wiki處理 1&#xff0c;deepwiki https://deepwiki.com/ 將我們看不懂的官方code文檔轉換為wiki&#xff0c;更加便于理解。 其實能夠翻閱的倉庫很有限&#xff0c;比如說&#xff1a; 但是有很多倉庫并沒有index&#xff…

洛谷P11963 [GESP202503 六級] 環線-普及/提高-

題目描述 小 A 喜歡坐地鐵。地鐵環線有 n n n 個車站&#xff0c;依次以 1 , 2 , ? , n 1,2,\cdots,n 1,2,?,n 標號。車站 i ( 1 ≤ i < n ) i\ (1\leq i<n) i (1≤i<n) 的下一個車站是車站 i 1 i1 i1。特殊地&#xff0c;車站 n n n 的下一個車站是車站 1 …

大網絡辦公區的二層生成樹優化問題

辦公區有華為和思科交換機&#xff0c;此次改造&#xff0c;在辦公火墻上、下聯&#xff0c;做3層IP地址互聯&#xff0c;可以讓大核心不參與辦公區的STP網絡收斂&#xff0c;就不會因為下面辦公區的交換機stp收斂問題導致&#xff0c;核心連接的其他區域網絡出現動蕩&#xff…

重點解析(軟件工程)

一. 概述 什么是軟件、軟件危機、軟件工程 軟件是可執行的指令&#xff08;程序&#xff09;、操作信息的數據以及描述程序操作和使用的文檔的集合。 軟件危機指軟件開發速度跟不上需求增長&#xff0c;導致設計拙劣、維護困難&#xff0c;可能造成經濟損失或災難。 軟件工程是…

Jina-Embeddings-V4:多模態向量模型的革命性突破與實戰指南

當Jina-Embeddings-V4帶著38億參數和多模態能力登場時&#xff0c;它就像向量模型界的"變形金剛"——不僅能處理30語言的文本&#xff0c;還能把圖像、表格甚至混合排版文檔統統"吞"進同一個語義空間。傳統方案如CLIP需要分別處理圖像和文本再強行對齊&…

數據結構進階 - 第四,五章 串、數組和廣義表

數據結構進階 - 串、數組和廣義表 第四章 串&#xff08;String&#xff09; 4.1 串的基本概念 4.1.1 串的定義 串是受限的線性表&#xff1a;組成串的元素只能為字符串的特點&#xff1a; 操作位置受限元素類型受限&#xff08;只能是字符&#xff09;是線性表的推廣和受限…

【力扣 困難 C】940. 不同的子序列 II

目錄 題目 解法一&#xff1a;動態規劃 題目 解法一&#xff1a;動態規劃 int distinctSubseqII(char* s) {const int mod 1000000007;int dp[26] {0};int cnt 1;int len strlen(s);for (int i 0; i < len; i) {int new (cnt - dp[s[i] - a] mod) % mod;cnt (cnt…

【用戶權限】chmod的簡單使用(一)

一、用戶和權限的基本概念 用戶是 Linux 系統工作中重要的一環&#xff0c;用戶管理包括用戶與組管理。在 Linux 系統中&#xff0c;不論是由本機或是遠程登錄系統&#xff0c;每個系統都必須擁有一個賬號&#xff0c;并且對于不同的系統資源擁有不同的使用權限。在Linux中&am…

Electron桌面程序初體驗

Electron 是網頁應用 (web apps) 的一個原生包裝層&#xff0c;在 Node.js 環境中運行。所以需要開發者對 Node.js 和前端 Web 開發有一定地了解。下面我們就來初始化一個項目&#xff0c;試試看。 提示&#xff1a;本人使用的是npm命令&#xff0c;yarn命令也是可以的 1.初…

生信軟件47 - 超低測序深度的全基因組測序cfDNA腫瘤分數估計工具ichorCNA

1. ichorCNA簡介 ichorCNA是一種用于估計來自超低測序深度的全基因組測序&#xff08;ULP-WGS&#xff0c;0.1x覆蓋率&#xff09;的cfDNA中腫瘤分數的工具。ichorCNA使用概率模型&#xff0c;應用隱馬爾可夫模型&#xff08;HMM&#xff09;&#xff0c;以同時分割基因組&…

Python 解壓縮(支持.zip/.rar/.7z格式)

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點睡覺 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄 Python 解壓縮&#xff08;支持.zip/.rar/.7…