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
英文地址,請注明出處:http://en.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插件…