Python 爬蟲教程 | 豆瓣 TOP250 數據抓取與分析實戰

一、項目背景與數據價值

豆瓣TOP250是影視行業的重要榜單,具有以下數據價值:

  • 評分與評價人數:衡量電影市場熱度;

  • 導演與演員信息:分析人才價值與影視趨勢;

  • 類型 / 地區 / 年份:洞察電影類型與年代變遷;

  • 經典臺詞:可用于 NLP 情感分析或推薦系統訓練數據。


二、技術棧與環境配置

安裝核心 Python 庫:

pip install requests beautifulsoup4 pandas numpy matplotlib seaborn fake_useragent

版本建議:

應用場景版本要求
requests網絡請求≥ 2.25
BeautifulSoupHTML 解析≥ 4.9
pandas數據處理≥ 1.2
fake_useragent偽裝 User?Agent≥ 1.1
time、random請求延時Python 標準庫

三、網頁結構深入解析

目標頁面:https://movie.douban.com/top250。通過瀏覽器開發者工具(F12)分析頁面結構存在以下關鍵點:

  • 電影單元數據 位于 <div class="item"> 內,包含標題、導演、評分等;

  • 翻頁機制 使用參數 start=0, 25, … 225 控制頁面切換 。


四、反爬策略與突破技巧

豆瓣可能設置以下反爬措施:

  1. User?Agent 檢測:使用 fake_useragent 隨機生成請求頭;

  2. 頻率限制:結合 time.sleep()random.uniform() 實現隨機延遲;

  3. IP 封鎖防范:配置代理 IP 池,實現請求匿名化。

示例代碼:

from fake_useragent import UserAgent
import random, timeheaders = {'User-Agent': UserAgent().random
}
time.sleep(random.uniform(1.5, 3.5))

五、完整代碼實現

以下為完整爬蟲流程,包括抓取、解析、異常處理和數據存儲:

import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
import random
import re
from fake_useragent import UserAgentdef scrape_douban_top250():base_url = "https://movie.douban.com/top250?start={}"movies = []ua = UserAgent()for page in range(0, 250, 25):url = base_url.format(page)headers = {'User-Agent': ua.random,'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8','Connection': 'keep-alive','Referer': 'https://movie.douban.com/','Cookie': 'bid=123456789;'}try:print(f"正在抓取第{page // 25 + 1}頁數據...")response = requests.get(url, headers=headers, timeout=15)response.encoding = 'utf-8'if response.status_code != 200:print(f"請求失敗,狀態碼: {response.status_code}")continuesoup = BeautifulSoup(response.text, 'html.parser')grid_view = soup.find('ol', class_='grid_view')if not grid_view:print("未找到電影列表,可能頁面結構有變化")continueitems = grid_view.find_all('li')for item in items:# 解析內容(排名、標題、導演、年份、地區、類型、評分、評價人數、經典臺詞)rank = item.find('em').text if item.find('em') else "N/A"title = item.find('span', class_='title').text.strip() if item.find('span', class_='title') else "未知標題"other_title = item.find('span', class_='other').text.strip() if item.find('span', class_='other') else ""bd = item.find('div', class_='bd')info_text = bd.find('p').get_text(strip=True).replace('\xa0', ' ') if bd and bd.find('p') else ""director = info_text.split("導演:")[1].split("主演")[0].strip().split('/')[0] if "導演:" in info_text else ""year = re.search(r'\d{4}', info_text).group(0) if re.search(r'\d{4}', info_text) else ""parts = info_text.split("/")region = parts[-2].strip() if len(parts) >= 2 else ""genre = parts[-1].strip() if len(parts) >= 1 else ""rating = item.find('span', class_='rating_num').text if item.find('span', class_='rating_num') else "0.0"star_div = item.find('div', class_='star')spans = star_div.find_all('span') if star_div else []votes = spans[3].text.replace('人評價', '') if len(spans) >= 4 else "0"quote = item.find('span', class_='inq').text if item.find('span', class_='inq') else ""movies.append({'排名': rank,'標題': title,'其他標題': other_title,'導演': director,'年份': year,'地區': region,'類型': genre,'評分': float(rating) if rating.replace('.', '', 1).isdigit() else 0.0,'評價人數': int(votes.replace(',', '')) if votes.isdigit() else 0,'經典臺詞': quote})print(f"成功抓取第{page // 25 + 1}頁數據,共{len(movies)}條記錄")time.sleep(random.uniform(3, 7))except Exception as e:print(f"第{page // 25 + 1}頁抓取失敗: {str(e)}")return pd.DataFrame(movies)df = scrape_douban_top250()
if not df.empty:df['年份'] = pd.to_numeric(df['年份'], errors='coerce').fillna(0).astype(int)df.to_csv('douban_top250.csv', index=False, encoding='utf-8-sig')print(f"數據抓取完成,共{len(df)}條記錄,已保存至 douban_top250.csv")print("\n前 5 條數據預覽:")print(df.head())
else:print("未抓取到任何數據,請檢查網絡或反爬策略是否生效")

代碼亮點:

  • 隨機延時防止被封;

  • 異常捕獲增強穩定性;

  • 數據清洗:評分轉為 float,票數轉為 int;

  • 通過結構化字典構建 DataFrame 。


六、數據清洗與轉換建議

建議在 DataFrame 構建后進一步處理:

df['year'] = df['year'].apply(lambda x: re.search(r'\d{4}', x).group() if re.search(r'\d{4}', x) else None)
df['director'] = df['director'].str.split('/').str[0]
df['quote'] = df['quote'].fillna('無')

這些能優化數據可用性,便于后續分析。


七、數據可視化分析范例

結合 Matplotlib 和 Seaborn,展示深度分析流程:

import matplotlib.pyplot as plt
import seaborn as snsplt.figure(figsize=(15,10))# 1. 評分分布直方圖
plt.subplot(2,2,1)
sns.histplot(df['評分'], bins=20, kde=True)
plt.title('豆瓣TOP250評分分布')# 2. 年代趨勢(TOP10)
plt.subplot(2,2,2)
sns.countplot(x='年份', data=df, order=df['年份'].value_counts().index[:10])
plt.xticks(rotation=45)
plt.title('電影上映年代分布TOP10')# 3. 導演上榜數TOP10
plt.subplot(2,2,3)
top_directors = df['導演'].value_counts().head(10)
sns.barplot(x=top_directors.values, y=top_directors.index)
plt.title('導演上榜作品數量TOP10')# 4. 評分與評價人數關系(對數坐標)
plt.subplot(2,2,4)
sns.scatterplot(x='評價人數', y='評分', data=df, hue='評分', palette='viridis')
plt.xscale('log')
plt.title('評分 vs 投票數(對數刻度)')plt.tight_layout()
plt.savefig('douban_analysis.png', dpi=300)

數據洞察:

  1. 評分偏左集中,均值約為 8.9,最低約 8.3;

  2. 1994–2004 年份涌現大量經典影片;

  3. 宮崎駿電影上榜數量最多,全勝導演之一;

  4. 投票數超過 150 萬的影片評分均超過 9.0 。


八、常見問題與解決方案一覽

問題現象解決方案
返回 403 內升級 UA 庫、更換代理 IP
數據部分缺失添加備用 CSS 選擇路徑
爬取速度過慢縮短延時為 1–2 秒
pandas 中文亂碼使用 encoding='utf-8-sig' 保存
請求超時增加重試機制或設置更高 timeout

九、項目拓展建議

  • 推薦系統構建:使用 TF-IDF 分析臺詞文本,構建內容推薦模型;

  • 自動定時更新:部署定時任務(如 crontab 或 Airflow)實現數據自動抓取與增量更新。


結語

本文全面涵蓋了從豆瓣 TOP 250 數據 抓取 → 清洗 → 可視化 → 洞察 的完整流程,核心技巧包括:

  • 動態 UA 和代理 IP 破解反爬;

  • 穩定的異常處理機制;

  • 深度數據清洗與類型轉換;

  • 多維數據分析洞察趨勢。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94223.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94223.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94223.shtml

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

相關文章

第04章 SPSS簡介與數據庫構建

參考&#xff1a;SPSS實戰與統計思維 - 武松編著 - 微信讀書 4.1 SPSS簡介 發展歷史 全稱Statistical Product and Service Solutions&#xff0c;由美國斯坦福大學三位研究生于1968年開發。 對比其他軟件成立時間&#xff1a;SAS&#xff08;1976年&#xff09;、Stata&…

【ABAP4】數據字典

ABAP數據字典ABAP數據字典概述數據字典的基本對象域數據元素表類型系統創建自定義透明表創建自定義結構鎖對象ABAP數據字典概述 ABAP數據字典是SAP定義和管理數據的工具&#xff0c;包含了程序使用的所有對象&#xff0c;數據字典中包括數據庫表、視圖、數據類型、域、搜索幫助…

不知道Pycharm怎么安裝?Pycharm安裝教程(附安裝包)

Pycharm安裝教程&#xff08;附安裝包&#xff09;獲取方式&#xff1a;python開發工具包丨夸克網盤-資源免費下載 有位朋友剛開始學習python&#xff0c;不知道Pycharm要怎么安裝&#xff0c;于是問我要一個安裝教程。 先介紹一下Pycharm吧&#xff0c;PyCharm是一款python開…

在 Docker 容器中查看 Python 版本

博客目錄前言方法一&#xff1a;交互式進入容器查看方法二&#xff1a;啟動時直接執行命令方法三&#xff1a;啟動后使用 exec 執行命令方法四&#xff1a;直接運行并查看版本&#xff08;容器退出&#xff09;方法比較與選擇指南實際應用中的注意事項進階技巧批量檢查多個鏡像…

React:Umi + React + Ant Design Pro的基礎上接入Mock數據

為什么需要Mock數據 前端開發依賴后端接口時的阻塞問題 獨立開發和測試的需求 快速迭代和原型驗證的重要性 當前版本及框架 React18 Umi 4.0 Ant Design Ant Design Pro 其實這些都不重要&#xff0c;主要是有Umijs&#xff0c;因為Umijs具有開箱即用Mock功能的能力&#…

VMware centos磁盤容量擴容教程

目錄前言相關概念磁盤磁盤分區文件系統掛載點物理卷、VG&#xff08;卷組&#xff09;、LV&#xff08;邏輯卷&#xff09;、LVM&#xff08;邏輯卷管理&#xff09;解決方案前言 這篇博客主要分享我在VM中通過docker搭建dify大模型應用平臺時&#xff0c;遇到了分配的磁盤容量…

kubernetes中的認證和授權

一 kubernetes API 訪問控制Authentication&#xff08;認證&#xff09;認證方式現共有8種&#xff0c;可以啟用一種或多種認證方式&#xff0c;只要有一種認證方式通過&#xff0c;就不再進行其它方式的認證。通常啟用X509 Client Certs和Service Accout Tokens兩種認證方式。…

雅菲奧朗SRE知識墻分享(四):『AI已開始重塑勞動力市場,美國年輕科技從業者首當其沖』

近日&#xff0c;據《商業內幕》報道&#xff0c;AI正在重塑美國就業市場&#xff0c;年輕的科技從業者正首當其沖地感受到沖擊。高盛首席經濟學家Jan Hatzius在本周一撰文指出&#xff1a;“AI 確實開始在各類數據中顯現出更加明顯的跡象。”據高盛的分析&#xff0c;科技行業…

Python爬蟲入門指南:從零開始的網絡數據獲取之旅

文章目錄前言1. 什么是網絡爬蟲&#xff1f;2. 爬蟲的倫理與法律邊界3. Python爬蟲的基本工具庫3.1 Requests&#xff1a;HTTP請求庫3.2 Beautiful Soup&#xff1a;HTML/XML解析庫3.3 lxml&#xff1a;高效XML/HTML解析器3.4 Selenium&#xff1a;自動化瀏覽器工具4. 第一個爬…

說說你對JVM的垃圾回收機制的理解?

Java 虛擬機&#xff08;JVM&#xff09;的垃圾回收&#xff08;Garbage Collection&#xff0c;GC&#xff09;機制是自動管理內存的核心&#xff0c;其核心目標是識別并回收不再被使用的對象所占用的內存&#xff0c;避免內存泄漏和溢出。以下從垃圾判斷方法、垃圾回收算法和…

兌換汽水瓶

實現代碼&#xff1a;public static void main(String[] args) {Scanner in new Scanner(System.in);while (in.hasNextInt()) {int n in.nextInt();if (n 0) {break;}System.out.println(n / 2);}}

結合 Flutter 和 Rust 的跨平臺開發方案

結合 Flutter 和 Rust 的跨平臺開發方案 1. 核心思想 本方案的核心思想是Flutter 負責 UI,Rust 負責邏輯 。Flutter 作為一個成熟的 UI 框架,專注于渲染流暢、跨平臺一致的用戶界面。而將那些對性能、安全和并發有高要求的復雜業務邏輯、計算密集型任務或底層系統操作,全部…

理想汽車智駕方案介紹 2|MindVLA 方案詳解

一、引言 MindVLA 主要包括空間智能模塊、語言智能模塊、動作策略模塊、強化學習模塊&#xff0c;這些模塊分別有以下功能&#xff1a; 空間智能模塊&#xff1a;輸入為多模態傳感器數據&#xff0c;使用 3D 編碼器提取時空特征&#xff0c;然后將所有傳感器與語義信息融合成…

計算機網絡基礎(三) --- TCP/IP網絡結構(運輸層)

運輸層1. 概述和運輸服務運輸層協議為運行在不同主機上的應用進程之間提供了邏輯通信功能, 運輸層協議是在端系統中而不是路由器中實現的, 網絡應用程序可以調用多種運輸層協議, 如因特網的兩種協議: TCP 和 UDP ,每種協議都能為調用的應用程序提供一組不同的運輸層服務1.1 運輸…

JdbcTemplate和MyBatis的區別

在 Java 后端開發中&#xff0c;JdbcTemplate&#xff08;Spring 框架提供&#xff09;和 MyBatis&#xff08;持久層框架&#xff09;都是用于簡化數據庫操作的工具&#xff0c;但它們的設計理念、使用方式、靈活性和適用場景有顯著差異。下面從核心定位、核心特性、使用方式、…

埃氏篩|樹dfs|差分計數

lc525把數組里的0換成-1&#xff0c;求子數組和為零的最長長度用哈希表記錄前綴和首次出現的位置通過找相同前綴和的位置差得出最長的0和1數量相等的子數組長度。class Solution { public:int findMaxLength(vector<int>& nums) {unordered_map<int,int>hashta…

(JVM)Java 對象創建的完整過程

在日常開發和面試中&#xff0c;經常會被問到 “Java 中對象是如何被創建的&#xff1f;” 表面上只是一個 new 關鍵字&#xff0c;但 JVM 在幕后完成了一系列復雜操作。 可以總結為以下 六大步驟&#xff1a;類加載檢查 → 分配內存 → 內存清零 → 設置對象頭 → 執行構造函數…

數據庫優化提速(三)JSON數據類型在酒店管理系統搜索—仙盟創夢IDE

在 MySQL 中&#xff0c;JSONB 類型&#xff08;MySQL 中實際為 JSON 類型&#xff0c;功能類似 PostgreSQL 的 JSONB&#xff0c;支持高效的 JSON 數據存儲和查詢&#xff09;非常適合存儲半結構化數據&#xff0c;例如酒店入住客人的復雜信息&#xff08;包含客人基本信息、入…

小程序全局狀態管理:使用MobX進行跨組件數據共享詳解(九)

一、定義全局數據共享&#xff08;又叫&#xff1a;狀態管理&#xff09;是為了解決組件之間數據共享的問題&#xff1b;全局數據共享方案&#xff1a;VueX、Redux、MobX等&#xff1b;二、小程序全局數據共享方案使用mobx-miniprogram配合mobx-miniprogram-bindings實現全局數…

生成模型 | DDPM -> Imrpoved DDPM -> DDIM

DDPM: Denoising Diffusion Probabilistic Models 采樣過程中的迭代計算為&#xff1a; xt?11αt(xt?1?αt1?αˉ?θ(xt,t))β~tzx_{t-1} \frac{1}{\sqrt{\alpha_t}}(x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}}}\epsilon_{\theta}(x_t, t)) \sqrt{\tilde{\beta…