使用 Python 抓取 IMDb:真正能跑的程式碼

最後更新於 April 16, 2026

如果你最近搜尋過「scrape IMDb with Python」,大概很快就會發現一件事:你找到的大多數教學都已經壞掉了。不是那種「有點過時」的壞,而是那種「直接回傳 0 筆結果,還滿屏 NoneType 錯誤」的壞。

過去幾週,我幾乎把找得到的 IMDb 抓取教學都實測了一輪——GeeksforGeeks、Medium、freeCodeCamp、Kaggle notebooks,能試的我都試了。在超過 裡,大多數還在用 td.titleColumntd.ratingColumn 這類 CSS selector;但這些東西早在 IMDb 於 2023 年 6 月重新設計 Top 250 頁面時就已經不存在了。結果就是:論壇上滿是開發者在問「為什麼程式回傳空白?」而像 「除了把每個 parser 都修一遍,沒什麼別的辦法。」這篇指南會介紹兩種目前真的能用的 Python 方法、如何處理分頁與常見錯誤、什麼情況下 Python 根本不是最佳選擇,以及如何讓你的爬蟲更耐用,別跟其他失效方案一起進入墳場。

用 Python 抓取 IMDb 是什麼意思?

網頁爬取(web scraping)就是透過程式自動擷取網頁資料——不是手動複製貼上,而是寫一支腳本幫你做完。如果我們說「抓取 IMDb」,意思就是使用 Python 從 IMDb 網頁中提取結構化的電影資料,例如片名、評分、類型、演員、片長、投票數等。

Python 常見的技術組合通常有三個函式庫:requests(抓取網頁)、BeautifulSoup(解析 HTML 並找到資料)、pandas(整理並匯出結果)。有些教學也會用 SeleniumPlaywright 處理需要 JavaScript 渲染的頁面,不過你會看到,其實有更快的做法。

先提醒一個重要前提:本文所有內容都以 2025 年年中 IMDb 的現行頁面結構為準。如果你是 2027 年才看到這篇文章,那麼某些 selector 可能已經變了。(我也會說明怎麼處理這種情況。)

為什麼要用 Python 抓 IMDb?真實世界的用途

在動手寫任何一行程式碼之前,先問一個問題:你到底會怎麼用 IMDb 資料?答案其實很看你的角色。

IMDb 影評資料集是全球最常被使用的 NLP 基準之一——Maas 等人於 2011 年發表的奠基論文已累積 ,而且這份資料集已內建於 TensorFlow、Keras 和 PyTorch。在 Hugging Face 上,stanfordnlp/imdb 資料集每月有 213,321 次下載,並被用來訓練超過 1,500 個模型。所以如果你是做機器學習的,對 IMDb 資料大概不陌生。

但它的用途絕不只學術研究:

用途適合對象需要的資料欄位
電影推薦引擎資料科學家、業餘開發者片名、類型、評分、演員
串流平台內容策略產品/內容團隊評分、投票數、上映年份、類型
情緒分析/NLP 訓練機器學習研究者、學生評論、評分
競品內容分析娛樂產業分析師票房、上映日期、評分趨勢
影視旅遊研究旅遊局、旅遊公司拍攝地點、熱門程度指標
學術研究大學研究人員各種結構化電影中繼資料

光是影視旅遊市場,2025 年全球估值就預估達到 。Netflix 2024 年在內容上的支出超過 170 億美元,其中 來自個人化推薦。重點是:IMDb 資料確實支撐著各行各業的實際決策。

在動手寫程式前,你可以怎麼取得 IMDb 資料?

這一段是大多數教學完全略過的部分。他們直接叫你 pip install beautifulsoup4,卻沒先問你:你現在真的需要用 Python 抓資料嗎?

完整選項如下:

方案最適合優點缺點
Python + BeautifulSoup學習、客製化擷取完全可控、彈性高容易壞,selector 常失效
JSON-LD / __NEXT_DATA__ 擷取想要穩定性的開發者可處理 JS 內容、較耐變動需要理解 JSON 結構
IMDb 官方資料集大規模分析、學術用途合法、完整、超過 2,600 萬筆標題、每日更新TSV 格式,沒有評論/圖片
Cinemagoer(IMDbPY)函式庫程式化單片查詢Python 風格 API、欄位豐富88 個未解問題,最後一次發布是 2023 年 5 月
TMDb API電影中繼資料 + 圖片免費 API 金鑰、JSON、文件完整來源不同(不是 IMDb 評分)
Thunderbit(無程式碼)不寫程式的人、快速匯出兩步抓取、AI 自動建議欄位、可匯出到 Excel/Sheets大量抓取會消耗點數

這些選項有幾個補充說明。Cinemagoer 自 2023 年 5 月後就沒有 PyPI 新版,而 IMDb 在 2025 年 6 月重新設計後,它的大部分 parser 都壞了——我目前不建議用在正式環境。TMDb 很好用,但它用的是自己的評分系統,不是 IMDb。至於 IMDb 的官方企業級 API,透過 AWS Data Exchange 一年要 ,對多數人來說根本不現實。

如果你完全不想寫程式, 可以直接讀取 IMDb 頁面,自動建議擷取欄位(片名、評分、年份、類型等),兩下就能匯出到 Excel、Google Sheets、Airtable 或 Notion。當 IMDb 版面改動時,AI 也會跟著調整,所以你不用維護 selector。這部分後面再詳細說。

如果你想寫 Python,下面是兩種真的能用的方法。

方法 1:用 BeautifulSoup 抓取 IMDb(傳統作法)

這是你在大多數教學裡會看到的經典方法。它確實能用,但先講白一點:在我介紹的幾種方式裡,它也是最脆弱的一種。IMDb 的 CSS class 名稱是自動產生的,版面一改就可能跟著變。不過,這仍然是學習網頁爬取基礎最好的方式。

步驟 1:安裝並匯入 Python 函式庫

你需要四個套件:

1pip install requests beautifulsoup4 pandas lxml

它們各自的用途如下:

  • requests — 發送 HTTP 請求,抓取網頁內容
  • beautifulsoup4 — 解析 HTML,方便搜尋特定元素
  • pandas — 將擷取出的資料整理成表格並匯出 CSV/Excel
  • lxml — 快速的 HTML parser(BeautifulSoup 可把它當後端使用)

匯入寫法如下:

1import requests
2from bs4 import BeautifulSoup
3import pandas as pd

步驟 2:向 IMDb 發送 HTTP 請求

這裡通常是新手第一次卡住的地方。IMDb 會封鎖沒有帶正確 User-Agent 標頭的請求——你會直接收到 403 Forbidden 錯誤。Python Requests 預設的 user-agent(python-requests/2.31.0)很容易立刻被擋下。

1url = "https://www.imdb.com/chart/top/"
2headers = {
3    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
4    "Accept-Language": "en-US,en;q=0.9"
5}
6response = requests.get(url, headers=headers)
7if response.status_code != 200:
8    print(f"Failed to fetch page: {response.status_code}")
9else:
10    print("Page fetched successfully")

Accept-Language 也很重要——如果沒設,IMDb 可能會依照你 IP 的地理位置回傳不同語言內容。

步驟 3:用 BeautifulSoup 解析 HTML

拿到 HTML 後,建立 BeautifulSoup 物件,然後開始找正確的元素。你可以在 Chrome 中打開 IMDb Top 250 頁面,對某個電影標題按右鍵,選擇「Inspect」查看底層 HTML 結構。

1soup = BeautifulSoup(response.text, "lxml")

截至 2025 年年中,Top 250 頁面使用的 selector 如下:

  • 電影容器li.ipc-metadata-list-summary-item
  • 片名h3.ipc-title__text
  • 年份span.cli-title-metadata-item(第一個 span)
  • 評分span.ipc-rating-star--rating

要注意的是,這些以 ipc- 開頭的 class 名稱是 IMDb 的元件系統自動產生的。它們自 2023 年 6 月改版後一直相對穩定,但沒有人能保證未來不會再變。

步驟 4:擷取電影資料(片名、年份、評分)

這裡我和大多數教學不一樣:我加了 try/except 錯誤處理。我看過的競品指南幾乎都沒有這一步,所以當 selector 改變時,它們的程式常常默默壞掉。

1movies = []
2movie_items = soup.select("li.ipc-metadata-list-summary-item")
3for item in movie_items:
4    try:
5        title_tag = item.select_one("h3.ipc-title__text")
6        title = title_tag.text.strip() if title_tag else "N/A"
7        year_tag = item.select_one("span.cli-title-metadata-item")
8        year = year_tag.text.strip() if year_tag else "N/A"
9        rating_tag = item.select_one("span.ipc-rating-star--rating")
10        rating = rating_tag.text.strip() if rating_tag else "N/A"
11        movies.append({
12            "title": title,
13            "year": year,
14            "rating": rating
15        })
16    except Exception as e:
17        print(f"Error parsing movie: {e}")
18        continue
19print(f"Extracted {len(movies)} movies")

步驟 5:用 Pandas 存成 CSV 或 Excel

1df = pd.DataFrame(movies)
2df.to_csv("imdb_top_250.csv", index=False)
3df.to_excel("imdb_top_250.xlsx", index=False)
4print(df.head())

範例輸出:

1                          title  year rating
20  1. The Shawshank Redemption  1994    9.3
31           2. The Godfather    1972    9.2
42     3. The Dark Knight        2008    9.0
53  4. The Godfather Part II     1974    9.0
64         5. 12 Angry Men       1957    9.0

這樣是能跑的。但它是靠一堆可能隨時失效的 CSS selector 撐著——所以才有下一個我更推薦的方法。

方法 2:JSON-LD 技巧——直接跳過 HTML 解析

這是多數競品文章完全沒提到的技術,也是我在正式專案裡最想採用的方法。IMDb 會在每個頁面的 <script type="application/ld+json"> 標籤中嵌入結構化資料()。這些資料遵循 Schema.org 標準,Google 也會用它來產生豐富搜尋結果,而且比 CSS class 名稱穩定得多。

Apify 的 IMDb Scraper 這類正式級工具,採用的擷取優先順序就是:「JSON-LD > NEXT_DATA > DOM」。我也會建議你用這個順序。

為什麼 JSON-LD 比 CSS selector 更可靠

方法可處理 JS 內容?能抵抗 UI 變動?速度複雜度
BeautifulSoup + CSS selector❌ 否⚠️ 脆弱(class 名稱會變)
JSON-LD 擷取✅ 是✅ 遵循 Schema.org 標準低到中
__NEXT_DATA__ JSON 擷取✅ 是✅ 相當穩定低到中
Selenium / Playwright✅ 是⚠️ 脆弱中到高
Thunderbit(無程式碼,兩步)✅ 是(AI 直接讀頁面)✅ AI 會自動適應

ipc-metadata-list-summary-item 這種 CSS class,是 IMDb 的 React 元件系統自動生成的,每次改版都可能變。JSON-LD 則代表真正的資料模型,而不是畫面上的呈現方式。差別就像是讀一本書的目錄,跟硬要靠字體大小去猜哪一段是章節一樣。

css-selectors-vs-json-ld.webp

逐步教你從 JSON-LD 擷取 IMDb 資料

步驟 1:抓取頁面

和前面一樣,使用帶有正確 User-Agent 標頭的 requests

1import requests
2from bs4 import BeautifulSoup
3import json
4import pandas as pd
5url = "https://www.imdb.com/chart/top/"
6headers = {
7    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
8    "Accept-Language": "en-US,en;q=0.9"
9}
10response = requests.get(url, headers=headers)
11soup = BeautifulSoup(response.text, "lxml")

步驟 2:找到 JSON-LD 的 script 標籤

1script_tag = soup.find("script", {"type": "application/ld+json"})
2if not script_tag:
3    print("No JSON-LD found on this page")
4else:
5    data = json.loads(script_tag.string)
6    print(f"Found JSON-LD with type: {data.get('@type', 'unknown')}")

步驟 3:解析結構化資料

在 Top 250 頁面中,JSON-LD 會包含一個 itemListElement 陣列,裡面有全部 250 部電影。每個項目都包含排名、名稱、URL、aggregateRating、datePublished、genre、description、director 和 actor 陣列。

1movies = []
2for item in data.get("itemListElement", []):
3    movie = item.get("item", {})
4    rating_info = movie.get("aggregateRating", {})
5    movies.append({
6        "rank": item.get("position"),
7        "title": movie.get("name"),
8        "url": movie.get("url"),
9        "rating": rating_info.get("ratingValue"),
10        "vote_count": rating_info.get("ratingCount"),
11        "date_published": movie.get("datePublished"),
12        "genre": ", ".join(movie.get("genre", [])),
13        "description": movie.get("description"),
14    })

步驟 4:匯出成 CSV

1df = pd.DataFrame(movies)
2df.to_csv("imdb_top_250_json_ld.csv", index=False)
3print(df.head())

範例輸出:

1   rank                      title                                     url  rating  vote_count date_published              genre
20     1  The Shawshank Redemption  https://www.imdb.com/title/tt0111161/     9.3     2900000     1994-10-14     Drama
31     2            The Godfather   https://www.imdb.com/title/tt0068646/     9.2     2000000     1972-03-24     Crime, Drama
42     3          The Dark Knight   https://www.imdb.com/title/tt0468569/     9.0     2800000     2008-07-18     Action, Crime, Drama

一次拿到 250 部電影。乾淨、結構化,而且不用跟 CSS selector 玩猜謎遊戲。又因為這份資料遵循 Schema.org 標準(Google 搜尋結果也依賴它),所以比視覺版面穩定得多。

加碼:在單一電影頁使用 __NEXT_DATA__

如果你想從單一影片頁面取得更完整的資訊(片長、完整演員表、劇情簡介、海報圖片),IMDb 也會嵌入 __NEXT_DATA__ JSON 物件。這是 React 用來 hydrate 頁面的資料——沒有它,網站本身就會壞掉。

1# 在單一電影頁,例如 /title/tt0111161/
2next_data_tag = soup.find("script", {"id": "__NEXT_DATA__"})
3if next_data_tag:
4    next_data = json.loads(next_data_tag.string)
5    above_fold = next_data["props"]["pageProps"]["aboveTheFoldData"]
6    title = above_fold["titleText"]["text"]
7    year = above_fold["releaseYear"]["year"]
8    rating = above_fold["ratingsSummary"]["aggregateRating"]
9    runtime_seconds = above_fold.get("runtime", {}).get("seconds", 0)
10    genres = [g["text"] for g in above_fold["genres"]["genres"]]
11    plot = above_fold["plot"]["plotText"]["plainText"]

列表/排行榜頁面用 JSON-LD,單一電影頁用 __NEXT_DATA__。這就是正式級做法。

為什麼你的 IMDb 爬蟲一直壞掉?以及怎麼修

這是我查過的所有 IMDb 抓取論壇裡,最常被提到的痛點。使用者會寫:「有些程式因為 UI 變更而壞掉了」「2024 不能用了!」——而回覆通常不是沉默,就是「試試 Selenium」。

根本原因在於 IMDb 持續往 React / Next.js 前端遷移。以下是幾個重大破壞性變動的時間線:

日期變更內容受影響的內容
2022 年 11 月Name Pages 重新設計舊版 name-page 抓取器
2023 年 6 月Top 250 頁面重新設計所有 td.titleColumn / td.ratingColumn selector
2023 年 4 月Title 子頁面重新設計個人簡介、獎項、新聞抓取器
2023 年 10 月Advanced Search 重新設計搜尋型爬蟲
2025 年 6 月/reference 頁面重新設計Cinemagoer 函式庫(大部分 parser)

也就是說,大約每 6 到 12 個月就會有一次重大破壞性變動。如果你的爬蟲依賴 CSS class 名稱,那你基本上就是在跑一台不停轉動的跑步機。

常見錯誤與修法

結果空白/NoneType 錯誤

這是最常見的錯誤。你會看到 AttributeError: 'NoneType' object has no attribute 'text'。這代表 BeautifulSoup 找不到你要的元素——通常是 CSS class 名稱已變動,或內容是由 JavaScript 渲染。

修法:改用 JSON-LD 擷取(上面的方法 2)。這些資料就在初始 HTML 回應裡,不需要 JavaScript。

403 Forbidden

IMDb 使用 來偵測並封鎖機器人。最常見的觸發原因是缺少或明顯偽造的 User-Agent 標頭。這在 開源專案與 都有記錄,甚至有 IMDb 員工承認這個問題。

修法:永遠帶上看起來像瀏覽器的 User-AgentAccept-Language: en-US 標頭。最好使用 requests.Session() 做連線池管理。

只回傳 25 筆結果

IMDb 的搜尋頁和「Most Popular」列表採用 lazy loading——一開始只載入大約 25 筆,接著在你捲動時透過 AJAX 逐步載入更多。

修法:使用 URL 參數分頁(下一段會說),或改抓 Top 250 頁面,因為它會在單次回應中一次載入 250 部電影。

selector 突然失效

過去常見但現在已失效的 selector 包括:td.titleColumntd.ratingColumn.lister-item-header.inline-block.ratings-imdb-rating。如果你的程式用了這些,基本上已經壞了。

修法:優先使用 data-testid 屬性(例如 h1[data-testid="hero-title-block__title"]),不要用自動產生的 class 名稱。更好的方式是直接用 JSON-LD。

決策框架:短期修補 vs. 長期方案

  • 快速修補:在每個 selector 外層加上 try/except,檢查 HTTP status code,記錄錯誤,不要直接崩潰
  • 中期修補:把 CSS selector 改成 JSON-LD 擷取(方法 2)
  • 長期方案:如果要做大規模分析,直接用 ,或像 這樣每次都用 AI 重新讀頁面結構的工具——不用維護 selector,AI 會自動適應版面變化

超過 25 筆限制:IMDb 分頁與大資料集怎麼抓

我看過的每一篇競品教學都只抓一個頁面,沒有一篇講分頁。但如果你要的不只是一個列表,很快就會卡住。

不需要分頁的頁面

好消息是:Top 250 頁面會在單一伺服器回應中載入全部 250 部電影。JSON-LD 與 __NEXT_DATA__ 裡也都包含完整資料集。這種情況不需要分頁。

IMDb 搜尋分頁怎麼運作

IMDb 搜尋頁會使用 start= URL 參數,每次增加 50:

1https://www.imdb.com/search/title/?groups=top_1000&start=1
2https://www.imdb.com/search/title/?groups=top_1000&start=51
3https://www.imdb.com/search/title/?groups=top_1000&start=101

下面這段 Python 迴圈可以抓取多頁結果:

1import time
2all_movies = []
3for start in range(1, 1001, 50):  # 分頁抓取 top 1000
4    url = f"https://www.imdb.com/search/title/?groups=top_1000&start={start}"
5    response = requests.get(url, headers=headers)
6    if response.status_code != 200:
7        print(f"Failed at start={start}: {response.status_code}")
8        break
9    soup = BeautifulSoup(response.text, "lxml")
10    # 使用你偏好的方法擷取電影資料
11    # ...
12    print(f"Scraped page starting at {start}")
13    time.sleep(3)  # 禮貌一點——據傳 IMDb 在約 50 次快速請求後會開始封鎖

time.sleep(3) 很重要。社群回報顯示,IMDb 大約在 50 次快速請求後就會開始封鎖 IP。隨機延遲 2–5 秒是個好習慣。

什麼時候應該完全不要抓:IMDb 官方大量資料集

如果你真的有大型分析需求,IMDb 提供 7 個免費 TSV 檔案,放在 ,每天更新:

檔案內容大小
title.basics.tsv.gz片名、類型、類別、片長、年份約 800 MB
title.ratings.tsv.gz平均評分、投票數約 25 MB
title.crew.tsv.gz導演、編劇約 300 MB
title.principals.tsv.gz主要演員/工作人員約 2 GB
title.akas.tsv.gz各地區別名約 1.5 GB
title.episode.tsv.gz電視劇集資訊約 200 MB
name.basics.tsv.gz人物:姓名、出生年、代表作約 700 MB

把它們載入 Pandas 很簡單:

1ratings = pd.read_csv("title.ratings.tsv.gz", sep="\t", compression="gzip")
2basics = pd.read_csv("title.basics.tsv.gz", sep="\t", compression="gzip", low_memory=False)
3# 以 tconst(IMDb 標題 ID)合併
4merged = basics.merge(ratings, on="tconst")
5top_movies = merged[merged["titleType"] == "movie"].nlargest(250, "averageRating")

這些資料集涵蓋超過 2,600 萬個標題。沒有分頁、沒有 selector、沒有 403 錯誤。授權僅限個人與非商業用途——你不能重新發布或轉售這些資料。

無程式碼捷徑:Thunderbit 幫你處理分頁

如果你需要分頁式 IMDb 資料,但不想自己寫分頁邏輯, 原生支援點擊式分頁與無限捲動。你只要告訴它要抓什麼,剩下的它會自己處理——包括捲動載入的內容。

用 Python 抓取 IMDb:完整可執行程式碼(可直接複製貼上)

下面提供兩個可立即執行的完整腳本。

腳本 A:BeautifulSoup 方法(CSS selector)

1import requests
2from bs4 import BeautifulSoup
3import pandas as pd
4url = "https://www.imdb.com/chart/top/"
5headers = {
6    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
7    "Accept-Language": "en-US,en;q=0.9"
8}
9response = requests.get(url, headers=headers)
10if response.status_code != 200:
11    print(f"Error: {response.status_code}")
12    exit()
13soup = BeautifulSoup(response.text, "lxml")
14movie_items = soup.select("li.ipc-metadata-list-summary-item")
15movies = []
16for item in movie_items:
17    try:
18        title = item.select_one("h3.ipc-title__text")
19        year = item.select_one("span.cli-title-metadata-item")
20        rating = item.select_one("span.ipc-rating-star--rating")
21        movies.append({
22            "title": title.text.strip() if title else "N/A",
23            "year": year.text.strip() if year else "N/A",
24            "rating": rating.text.strip() if rating else "N/A",
25        })
26    except Exception as e:
27        print(f"Skipping movie due to error: {e}")
28df = pd.DataFrame(movies)
29df.to_csv("imdb_top250_bs4.csv", index=False)
30print(f"Saved {len(df)} movies")
31print(df.head())

腳本 B:JSON-LD 方法(推薦)

1import requests
2from bs4 import BeautifulSoup
3import json
4import pandas as pd
5url = "https://www.imdb.com/chart/top/"
6headers = {
7    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
8    "Accept-Language": "en-US,en;q=0.9"
9}
10response = requests.get(url, headers=headers)
11if response.status_code != 200:
12    print(f"Error: {response.status_code}")
13    exit()
14soup = BeautifulSoup(response.text, "lxml")
15script_tag = soup.find("script", {"type": "application/ld+json"})
16if not script_tag:
17    print("No JSON-LD data found")
18    exit()
19data = json.loads(script_tag.string)
20movies = []
21for item in data.get("itemListElement", []):
22    movie = item.get("item", {})
23    rating_info = movie.get("aggregateRating", {})
24    directors = movie.get("director", [])
25    director_names = ", ".join(
26        d.get("name", "") for d in (directors if isinstance(directors, list) else [directors])
27    )
28    movies.append({
29        "rank": item.get("position"),
30        "title": movie.get("name"),
31        "url": movie.get("url"),
32        "rating": rating_info.get("ratingValue"),
33        "votes": rating_info.get("ratingCount"),
34        "year": movie.get("datePublished", "")[:4],
35        "genre": ", ".join(movie.get("genre", [])),
36        "director": director_names,
37        "description": movie.get("description"),
38    })
39df = pd.DataFrame(movies)
40df.to_csv("imdb_top250_jsonld.csv", index=False)
41print(f"Saved {len(df)} movies")
42print(df.head())

這兩個腳本都包含錯誤處理,並會產生乾淨的 CSV 輸出。腳本 B 能拿到更多資料——導演、描述、URL——而且對版面變動的耐受度更高。

如何完全不寫程式抓 IMDb(使用 Thunderbit)

不是每個人都需要或想寫 Python。也許你是營運分析師,只是想把本週高分電影放進試算表;也許你是內容策略人員,想比較不同年份的類型趨勢。這種情況下,自己寫爬蟲其實太大材小用了。

以下是用 取得相同資料的方法:

開始前:

  • 難度:初學者
  • 所需時間:約 2 分鐘
  • 你需要準備:Chrome 瀏覽器、(免費方案可用)

步驟 1:打開你要抓取的 IMDb 頁面。 在 Chrome 中開啟 IMDb Top 250(或任何其他 IMDb 列表/搜尋頁面)。

步驟 2:在 Thunderbit 側欄點選「AI Suggest Fields」。 AI 會掃描頁面並建議欄位——通常會包含 Title、Year、Rating、Genre 等,視頁面而定。你會看到一個預覽表格與建議欄位。

步驟 3:視需要調整欄位。 刪掉不需要的欄位,或按「+ Add Column」新增自訂欄位,直接用自然語言描述你要的內容(例如「導演姓名」或「投票數」)。

步驟 4:按下「Scrape」。 Thunderbit 會開始擷取資料。若頁面有無限捲動或分頁,它也會自動處理。

步驟 5:匯出。 點選匯出按鈕,選擇格式——Excel、Google Sheets、CSV、Airtable 或 Notion。幾秒內資料就會到位。

這裡最大的優勢不只是方便,而是 Thunderbit 的 AI 每次都會重新讀取頁面結構。當 IMDb 改版時(它一定會改),AI 也會一起適應。你不用更新 selector,也不用修程式。對任何曾在截止前 2 點睡前被壞掉的爬蟲搞崩的人來說,這個價值非常高。

Thunderbit 也支援子頁面抓取——你可以點進每部電影的詳細頁,補充演員、導演、片長以及列表頁看不到的其他欄位。如果你想看實際操作,可以去看

抓取 IMDb 合法嗎?你需要知道的事

使用者在論壇上常會直接問:「像這樣做是否合法?IMDb 不希望人們抓他們的網站。」 這是合理的問題,而且多數競品文章都沒有回答。

IMDb 的 robots.txt:Top 250 圖表(/chart/top/)、單一標題頁(/title/ttXXXXXXX/)、以及人物頁(/name/nmXXXXXXX/)都沒有被 robots.txt 封鎖。被封鎖的路徑包括 /find/_json/*/search/name-text/user/ur*/ratings 以及一些 AJAX endpoint。也沒有設定 Crawl-delay

IMDb 的使用條款:相關條款寫道:「除非得到我們明確的書面同意,否則你不得在本網站上使用 data mining、robot、screen scraping 或類似的資料收集與擷取工具。」 另外還有條款禁止轉售或商業使用抓取來的資料。

實務上代表什麼:2024 年的幾項法院判決(Meta v. Bright Data、X Corp v. Bright Data)認為,如果使用者從未同意 Terms of Service,那麼條款未必能對他們生效——如果你是在未登入的情況下抓取公開可見資料,條款的可執行性其實有爭議。不過這仍是快速變動中的法律領域。

較安全的替代方案:IMDb 的 明確允許個人與非商業用途。TMDb 的 API 只要有免費 API key 也相當寬鬆。如果你想更安心,這兩者都是很好的選擇。

實務建議:如果你真的要抓,請維持合理的爬取速度(每次請求間隔 time.sleep(3))、設定正確的標頭,並避免碰觸 robots.txt 封鎖的路徑。若是商業專案,請諮詢法律專業人士,或直接使用官方資料集/API。

我們在 Thunderbit 部落格也有深入整理

結論:選對抓取 IMDb 的方式

簡單總結如下:

  • BeautifulSoup + CSS selector:適合學習基礎。預期每 6–12 個月就會壞一次,務必加上錯誤處理。
  • JSON-LD 擷取:我最推薦給任何持續進行的 Python 專案。它遵循 Schema.org 標準,比 CSS class 穩定得多,而且能直接取得乾淨的結構化資料,不需要 JavaScript 渲染。
  • __NEXT_DATA__ JSON:可作為補充,從單一影片頁取得更豐富資料(片長、完整演員、劇情、海報)。
  • IMDb 官方資料集:適合大規模分析的最佳選擇。超過 2,600 萬筆標題、每日更新、無需抓取。僅供個人/非商業用途。
  • :最適合不寫程式的人,或想快速拿到資料又不想維護程式的人。AI 會適應版面變動、處理分頁,並可匯出到 Excel/Sheets/Airtable/Notion。

把這篇指南存起來——等 IMDb 下次改版時,我也會更新。如果你想完全跳過寫程式,歡迎 ,看看你能多快把 IMDb 頁面變成乾淨的試算表。如果你還要處理其他網站,我們這篇 也整理了更完整的流程。

試試 AI 網頁爬蟲,適用於 IMDb 與更多網站

常見問題

抓取 IMDb 合法嗎?

IMDb 的使用條款禁止在未經同意下抓取資料,但在 2024 年一些新的法院判決之後,對公開可存取資料的 ToS 可執行性在法律上仍有爭議。最安全的選擇是使用 IMDb 的 (限個人/非商業用途)或 TMDb API(免費 key)。如果你真的要抓,請尊重 robots.txt、控制請求間隔,並避免被封鎖的路徑;若涉及商業用途,請諮詢法律專業人士。

為什麼我的 IMDb 爬蟲回傳空結果?

幾乎都是因為 CSS selector 過時了——像 td.titleColumntd.ratingColumn 這些 class 名稱自 2023 年 6 月後就不存在。解法是改用 JSON-LD 擷取(解析 <script type="application/ld+json"> 標籤),或更新 selector 到目前以 ipc- 開頭的 class。另外也要確認你有帶正確的 User-Agent 標頭,因為缺少它通常會觸發 403 錯誤,看起來就像是空結果。

我要怎麼抓超過 25 筆 IMDb 結果?

Top 250 頁面會一次載入 250 部電影,所以不需要分頁。對於搜尋結果,請使用 start= URL 參數(每次加 50)來翻頁。例如:start=1start=51start=101。每次請求之間加入 time.sleep(3),避免被封鎖。或者直接使用 IMDb 的官方資料集 ,裡面有超過 2,600 萬筆標題,不需要分頁。

什麼是 __NEXT_DATA__,為什麼我應該用它來抓 IMDb?

__NEXT_DATA__ 是 IMDb 的 React/Next.js 頁面中,嵌在 <script id="__NEXT_DATA__"> 標籤裡的 JSON 物件。它包含 React 用來渲染頁面的完整結構化資料——片名、評分、演員、類型、片長等等。因為它代表的是底層資料模型,而不是視覺版面,所以比 CSS selector 更能抵抗 UI 重新設計。建議把它和 JSON-LD 一起使用,會是最穩健的擷取方式。

可以不寫程式抓 IMDb 嗎?

可以。主要有兩種方式:(1) 下載 IMDb 的 ——7 個 TSV 檔,涵蓋超過 2,600 萬筆標題,每日更新,非商業用途免費;(2) 使用 ,它會讀取 IMDb 頁面、自動建議擷取欄位,並在兩下之內匯出到 Excel、Google Sheets 或 CSV——不需要寫程式,也不用維護 selector。

延伸閱讀

Ke
Ke
CTO @ Thunderbit. Ke is the person everyone pings when data gets messy. He's spent his career turning tedious, repetitive work into quiet little automations that just run. If you've ever wished a spreadsheet could fill itself in, Ke has probably already built the thing that does it.
目錄

試試 Thunderbit

只要 2 次點擊,就能抓取潛在客戶與其他資料。AI 驅動。

取得 Thunderbit 免費使用
用 AI 擷取資料
輕鬆將資料轉移到 Google Sheets、Airtable 或 Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week