หากคุณเพิ่งค้นหา "scrape IMDb with Python" เมื่อไม่นานมานี้ คุณอาจสังเกตเห็นอย่างหนึ่ง: บทแนะนำส่วนใหญ่ที่เจอใช้ไม่ได้แล้ว ไม่ใช่แค่ "ล้าสมัยนิดหน่อย" แต่เป็นแบบ "รันแล้วได้ผลลัพธ์เป็นศูนย์ แถมเต็มไปด้วยข้อผิดพลาด NoneType" เลยทีเดียว
ช่วงไม่กี่สัปดาห์ที่ผ่านมา ผมใช้เวลาทดสอบบทแนะนำการดึงข้อมูล IMDb แทบทุกตัวที่หาได้ — GeeksforGeeks, Medium, freeCodeCamp, โน้ตบุ๊กบน Kaggle และอีกมากมาย จาก ที่ติดแท็กเกี่ยวกับ IMDb scraping ส่วนใหญ่ยังอ้างถึง CSS selector (td.titleColumn, td.ratingColumn) ที่ไม่มีอยู่แล้วตั้งแต่เดือนมิถุนายน 2023 ตอน IMDb ปรับหน้า Top 250 ใหม่ ผลลัพธ์คือฟอรั่มเต็มไปด้วยนักพัฒนาที่ถามว่า “ทำไมโค้ดผมถึงได้ค่าว่าง?” และผู้ดูแลไลบรารีดังอย่าง ว่า “ตอนนี้เราทำได้ไม่มาก นอกจากแก้ parser ทีละตัว” คู่มือนี้จะพาคุณไปดู 2 วิธีด้วย Python ที่ใช้งานได้จริงในตอนนี้ วิธีรับมือกับการแบ่งหน้าและข้อผิดพลาดที่พบบ่อย รวมถึงเมื่อไหร่ที่ Python อาจไม่ใช่เครื่องมือที่เหมาะ และวิธีทำให้สคริปต์ของคุณทนต่อการเปลี่ยนแปลงในอนาคต ไม่ต้องกลายเป็นอีกหนึ่งหน้าในสุสานของสคริปต์พังๆ
การดึงข้อมูล IMDb ด้วย Python คืออะไร?
Web scraping คือกระบวนการดึงข้อมูลจากหน้าเว็บแบบอัตโนมัติ — แทนที่จะก็อปปี้แล้ววางเอง คุณเขียนสคริปต์ให้ทำแทน เมื่อพูดถึงการ “scrape IMDb” เราหมายถึงการดึงข้อมูลภาพยนตร์แบบมีโครงสร้าง เช่น ชื่อเรื่อง เรตติ้ง แนว นักแสดง เวลาเล่น และจำนวนโหวต จากหน้าเว็บของ IMDb ด้วย Python
สแต็ก Python ที่มักใช้จะมี 3 ไลบรารีหลัก: requests (ดึงหน้าเว็บ), BeautifulSoup (แยกวิเคราะห์ HTML และหาข้อมูล), และ pandas (จัดระเบียบและส่งออกผลลัพธ์) บางบทความยังใช้ Selenium หรือ Playwright สำหรับหน้าที่ต้องเรนเดอร์ด้วย JavaScript แต่ดังที่คุณจะเห็น มีวิธีที่เร็วกว่า
ข้อควรระวังสำคัญ: ทุกอย่างในคู่มือนี้ถูกตรวจสอบกับโครงสร้างหน้าปัจจุบันของ IMDb ณ กลางปี 2025 แล้ว IMDb เปลี่ยนแปลงประมาณทุก 6–12 เดือน ดังนั้นถ้าคุณอ่านสิ่งนี้ในปี 2027 ตัว selector บางตัวอาจเปลี่ยนไปแล้ว (ผมจะอธิบายวิธีรับมือให้ด้วย)
ทำไมต้องดึงข้อมูล IMDb ด้วย Python? ตัวอย่างการใช้งานจริง
ก่อนจะเขียนโค้ดแม้แต่บรรทัดเดียว คุณจะเอาข้อมูล IMDb ไปทำอะไรจริงๆ? คำตอบขึ้นอยู่กับว่าคุณเป็นใคร
ชุดข้อมูลรีวิวของ IMDb เป็นหนึ่งใน benchmark ด้าน NLP ที่ถูกใช้งานมากที่สุดในโลก — งานวิจัยต้นแบบของ Maas et al. (2011) มียอดอ้างอิงสะสมถึง และชุดข้อมูลนี้ถูกรวมไว้ใน TensorFlow, Keras และ PyTorch บน Hugging Face ชุดข้อมูล stanfordnlp/imdb ถูกดาวน์โหลดเดือนละ 213,321 ครั้ง และถูกใช้ฝึกโมเดลไปแล้วกว่า 1,500 รุ่น ดังนั้นถ้าคุณอยู่สาย machine learning คุณก็น่าจะคุ้นกับข้อมูล IMDb อยู่แล้ว
แต่การใช้งานไม่ได้จำกัดอยู่แค่วงการวิชาการ:
| กรณีใช้งาน | เหมาะกับใคร | ฟิลด์ข้อมูลที่ต้องใช้ |
|---|---|---|
| ระบบแนะนำภาพยนตร์ | นักวิทยาศาสตร์ข้อมูล, คนที่ทำเป็นงานอดิเรก | ชื่อเรื่อง, แนว, เรตติ้ง, นักแสดง |
| กลยุทธ์คอนเทนต์สำหรับแพลตฟอร์มสตรีมมิง | ทีมผลิตภัณฑ์/คอนเทนต์ | เรตติ้ง, จำนวนโหวต, ปีที่ฉาย, แนว |
| วิเคราะห์ความรู้สึก / ฝึก NLP | นักวิจัย ML, นักศึกษา | รีวิว, เรตติ้ง |
| วิเคราะห์คอนเทนต์เชิงการแข่งขัน | นักวิเคราะห์ในอุตสาหกรรมบันเทิง | รายได้บ็อกซ์ออฟฟิศ, วันที่ฉาย, แนวโน้มเรตติ้ง |
| งานวิจัยด้านท่องเที่ยวตามรอยสถานที่ถ่ายทำ | หน่วยงานท่องเที่ยว, บริษัททัวร์ | สถานที่ถ่ายทำ, ตัวชี้วัดความนิยม |
| งานวิจัยเชิงวิชาการ | นักวิจัยมหาวิทยาลัย | เมตาดาต้าภาพยนตร์แบบมีโครงสร้างทุกประเภท |
เฉพาะตลาดท่องเที่ยวตามรอยภาพยนตร์ก็มีมูลค่าประมาณ แล้ว Netflix ใช้เงินกว่า 17 พันล้านดอลลาร์กับคอนเทนต์ในปี 2024 โดย ขับเคลื่อนด้วยคำแนะนำเฉพาะบุคคล สรุปคือ: ข้อมูล IMDb อยู่เบื้องหลังการตัดสินใจจริงในหลายอุตสาหกรรม
ทางเลือกในการดึงข้อมูล IMDb ก่อนเริ่มเขียนโค้ด
นี่คือส่วนที่บทความส่วนใหญ่มักข้ามไป พวกเขากระโดดไป pip install beautifulsoup4 ทันที โดยไม่ถามก่อนว่า Python scraping เหมาะกับสถานการณ์ของคุณจริงหรือเปล่า
ภาพรวมมีดังนี้:
| แนวทาง | เหมาะที่สุดสำหรับ | ข้อดี | ข้อเสีย |
|---|---|---|---|
| Python + BeautifulSoup | การเรียนรู้, การดึงแบบกำหนดเอง | ควบคุมได้เต็มที่, ยืดหยุ่น | selector เปราะบาง, พังบ่อย |
การดึงจาก JSON-LD / __NEXT_DATA__ | นักพัฒนาที่ต้องการเสถียรภาพ | รองรับคอนเทนต์ที่มาจาก JS, ทนต่อการเปลี่ยนแปลงมากกว่า | ต้องเข้าใจโครงสร้าง JSON |
| IMDb Official Datasets | วิเคราะห์ข้อมูลขนาดใหญ่, ใช้เชิงวิชาการ | ถูกกฎหมาย, ครบถ้วน, ชื่อเรื่องกว่า 26 ล้านรายการ, อัปเดตทุกวัน | รูปแบบ TSV, ไม่มีรีวิว/รูปภาพ |
| ไลบรารี Cinemagoer (IMDbPY) | ค้นหาข้อมูลรายเรื่องแบบโปรแกรม | API ใช้งานง่ายแบบ Python, ฟิลด์หลากหลาย | มีปัญหาเปิดค้าง 88 รายการ, รีลีสล่าสุดพฤษภาคม 2023 |
| TMDb API | เมตาดาต้าภาพยนตร์ + รูปภาพ | ได้คีย์ฟรี, JSON, มีเอกสารดี | เป็นคนละแหล่งข้อมูล (ไม่ใช่คะแนน IMDb) |
| Thunderbit (ไม่ต้องเขียนโค้ด) | คนไม่เขียนโค้ด, ต้องการส่งออกเร็ว | ดึงข้อมูลได้ใน 2 คลิก, AI แนะนำฟิลด์, ส่งออกไป Excel/Sheets ได้ | สำหรับการดึงขนาดใหญ่ต้องใช้เครดิต |
ขอเสริมเล็กน้อยเกี่ยวกับตัวเลือกเหล่านี้: Cinemagoer ไม่มีรีลีสบน PyPI ตั้งแต่พฤษภาคม 2023 และ parser ส่วนใหญ่พังหลัง IMDb ปรับดีไซน์ในเดือนมิถุนายน 2025 — ตอนนี้ผมไม่แนะนำให้ใช้กับงาน production ครับ TMDb ดีมาก แต่ใช้ระบบเรตติ้งของตัวเอง ไม่ใช่ของ IMDb และ API สำหรับองค์กรของ IMDb ผ่าน AWS Data Exchange มีค่าใช้จ่าย ซึ่งไม่ใช่ตัวเลือกสำหรับคนส่วนใหญ่
สำหรับผู้อ่านที่ไม่อยากเขียนโค้ดเลย จะอ่านหน้า IMDb แล้วแนะนำฟิลด์สำหรับดึงข้อมูลให้อัตโนมัติ (เช่น title, rating, year, genre) จากนั้นส่งออกไปยัง Excel, Google Sheets, Airtable หรือ Notion ได้ใน 2 คลิก AI จะปรับตามการเปลี่ยนเลย์เอาต์ของ IMDb ให้เอง จึงไม่ต้องมานั่งดูแล selector ต่อ เดี๋ยวจะเล่าต่อในภายหลัง
ทีนี้ สำหรับคนที่อยากเขียน Python จริงๆ — ต่อไปนี้คือ 2 วิธีที่ใช้งานได้
วิธีที่ 1: ดึงข้อมูล IMDb ด้วย Python โดยใช้ BeautifulSoup (แนวทางดั้งเดิม)
นี่คือวิธีคลาสสิกที่คุณจะเจอในบทแนะนำส่วนใหญ่ ใช้ได้จริง แต่ขอพูดตรงๆ ว่าเป็นวิธีที่เปราะบางที่สุดในบรรดาวิธีที่จะพูดถึง IMDb ใช้ชื่อคลาส CSS ที่สร้างอัตโนมัติและเปลี่ยนได้เมื่อมีการรีดีไซน์ ถึงอย่างนั้น มันก็เป็นวิธีที่ดีที่สุดสำหรับการเรียนรู้พื้นฐานของ web scraping
ขั้นที่ 1: ติดตั้งและนำเข้าไลบรารี Python
คุณต้องใช้ 4 แพ็กเกจ:
1pip install requests beautifulsoup4 pandas lxml
แต่ละตัวทำอะไร:
requests— ส่ง HTTP request เพื่อดึงหน้าเว็บbeautifulsoup4— แยกวิเคราะห์ HTML เพื่อค้นหาองค์ประกอบที่ต้องการpandas— จัดระเบียบข้อมูลที่ดึงมาเป็นตาราง และส่งออกเป็น CSV/Excellxml— ตัวแยกวิเคราะห์ HTML ที่รวดเร็ว (BeautifulSoup ใช้เป็น backend ได้)
โค้ดนำเข้า:
1import requests
2from bs4 import BeautifulSoup
3import pandas as pd
ขั้นที่ 2: ส่ง HTTP Request ไปยัง IMDb
นี่คือจุดที่มือใหม่ส่วนใหญ่เจอกำแพงแรก IMDb จะบล็อก request ที่ไม่มี User-Agent header ที่เหมาะสม — คุณจะได้ error 403 Forbidden สตริง user-agent ของ Python Requests เอง (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")
header Accept-Language ก็สำคัญเช่นกัน — ถ้าไม่มี IMDb อาจคืนคอนเทนต์เป็นคนละภาษาตาม geolocation ของ IP คุณ
ขั้นที่ 3: แยกวิเคราะห์ HTML ด้วย BeautifulSoup
เมื่อได้ HTML แล้ว ให้สร้างออบเจ็กต์ BeautifulSoup และเริ่มค้นหาองค์ประกอบที่ถูกต้อง เปิดหน้า IMDb Top 250 ใน Chrome คลิกขวาที่ชื่อภาพยนตร์ แล้วเลือก "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
ขอเตือนไว้ก่อนว่า class ที่ขึ้นต้นด้วย ipc- เหล่านี้ถูกสร้างโดยระบบคอมโพเนนต์ของ IMDb เอง และค่อนข้างเสถียรตั้งแต่การรีดีไซน์ในเดือนมิถุนายน 2023 แต่ไม่มีหลักประกันว่าจะไม่เปลี่ยนอีก
ขั้นที่ 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: บันทึกเป็น CSV หรือ Excel ด้วย Pandas
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 ฝังข้อมูลแบบมีโครงสร้างในรูป (JavaScript Object Notation for Linked Data) ไว้ในแท็ก <script type="application/ld+json"> ทุกหน้า ข้อมูลนี้เป็นไปตามมาตรฐาน Schema.org, Google ใช้สำหรับผลการค้นหาแบบ rich results และเปลี่ยนบ่อยน้อยกว่าชื่อคลาส CSS มาก
Apify IMDb Scraper ซึ่งเป็นเครื่องมือระดับ production ใช้ลำดับความสำคัญในการดึงข้อมูลแบบนี้: “JSON-LD > NEXT_DATA > DOM” และนั่นก็คือโครงแบบที่ผมแนะนำเช่นกัน
ทำไม JSON-LD จึงน่าเชื่อถือกว่า CSS selector
| แนวทาง | รองรับคอนเทนต์ที่มาจาก JS ไหม? | ทนต่อการเปลี่ยน UI ไหม? | ความเร็ว | ความซับซ้อน |
|---|---|---|---|---|
| BeautifulSoup + CSS selector | ❌ ไม่ | ⚠️ เปราะบาง (ชื่อคลาสเปลี่ยน) | เร็ว | ต่ำ |
| การดึง JSON-LD | ✅ ใช่ | ✅ ตามมาตรฐาน Schema.org | เร็ว | ต่ำ-ปานกลาง |
การดึง JSON จาก __NEXT_DATA__ | ✅ ใช่ | ✅ ค่อนข้างเสถียร | เร็ว | ต่ำ-ปานกลาง |
| Selenium / Playwright | ✅ ใช่ | ⚠️ เปราะบาง | ช้า | ปานกลาง-สูง |
| Thunderbit (ไม่ต้องเขียนโค้ด, 2 คลิก) | ✅ ใช่ (AI อ่านหน้าเว็บ) | ✅ AI ปรับตัวอัตโนมัติ | เร็ว | ไม่มี |
ชื่อคลาส CSS อย่าง ipc-metadata-list-summary-item ถูกสร้างอัตโนมัติโดยระบบคอมโพเนนต์ React ของ IMDb และเปลี่ยนไปทุกครั้งที่รีดีไซน์ ส่วน JSON-LD สะท้อนโมเดลข้อมูลจริง ไม่ใช่ชั้นการแสดงผล มันเหมือนกับความต่างระหว่างการอ่านสารบัญหนังสือ กับพยายามเดาบทต่างๆ จากขนาดฟอนต์

ขั้นตอน: ดึงข้อมูล IMDb จาก JSON-LD
ขั้นที่ 1: ดึงหน้าเว็บ
เหมือนเดิม — ใช้ requests พร้อม User-Agent header ที่เหมาะสม
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
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 เรื่อง แต่ละรายการมี position, name, 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 พึ่งพาในการแสดงผลค้นหา) จึงมีโอกาสเปลี่ยนน้อยกว่าหน้าตา UI มาก
โบนัส: __NEXT_DATA__ สำหรับหน้าภาพยนตร์แต่ละเรื่อง
สำหรับข้อมูลที่ละเอียดขึ้นจากหน้ารายการภาพยนตร์แต่ละเรื่อง (runtime, นักแสดงทั้งหมด, สรุปเนื้อเรื่อง, รูปโปสเตอร์) IMDb ยังฝังออบเจ็กต์ JSON __NEXT_DATA__ ไว้ด้วย นี่คือข้อมูลที่ 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__ สำหรับหน้าภาพยนตร์แต่ละเรื่อง นั่นคือแนวทางระดับ production
ทำไม IMDb scraper ของคุณถึงพังอยู่เรื่อยๆ (และจะแก้ยังไง)
นี่คือปัญหาที่ถูกรายงานมากที่สุดในทุกฟอรั่มเกี่ยวกับ IMDb scraping ที่ผมตรวจดู ผู้ใช้มักเขียนว่า: "โค้ดบางส่วนพังเพราะ UI เปลี่ยน" และ "ใช้ไม่ได้ในปี 2024!" — และคำตอบที่ได้ก็มักเงียบหายหรือแค่บอกว่า “ลอง Selenium สิ”
สาเหตุหลักคือ IMDb กำลังย้ายไปใช้ frontend แบบ React/Next.js อย่างต่อเนื่อง นี่คือไทม์ไลน์ของการเปลี่ยนแปลงสำคัญที่ทำให้โค้ดพัง:
| วันที่ | สิ่งที่เปลี่ยน | สิ่งที่พัง |
|---|---|---|
| พ.ย. 2022 | หน้า Name Pages ถูกออกแบบใหม่ | สคริปต์ดึงข้อมูลหน้า name แบบเดิม |
| มิ.ย. 2023 | หน้า Top 250 ถูกออกแบบใหม่ | selector td.titleColumn / td.ratingColumn ทั้งหมด |
| เม.ย. 2023 | หน้าย่อย title ถูกออกแบบใหม่ | สคริปต์ bio, awards, news |
| ต.ค. 2023 | Advanced Search ถูกออกแบบใหม่ | สคริปต์ที่อาศัยการค้นหา |
| มิ.ย. 2025 | หน้า /reference ถูกออกแบบใหม่ | ไลบรารี Cinemagoer (parser ส่วนใหญ่) |
โดยเฉลี่ยแล้วจะมี breaking change ใหญ่ๆ ประมาณทุก 6–12 เดือน ถ้าสคริปต์ของคุณพึ่งชื่อคลาส CSS คุณก็เหมือนกำลังวิ่งบนลู่วิ่งไม่มีวันจบ
ข้อผิดพลาดที่พบบ่อยและวิธีแก้
ผลลัพธ์ว่าง / ข้อผิดพลาด NoneType
เป็นข้อผิดพลาดที่เจอบ่อยที่สุด คุณจะเห็น AttributeError: 'NoneType' object has no attribute 'text' หมายความว่า BeautifulSoup หาองค์ประกอบที่คุณต้องการไม่เจอ — มักเพราะชื่อคลาส CSS เปลี่ยน หรือคอนเทนต์ถูกเรนเดอร์ด้วย JavaScript
วิธีแก้: เปลี่ยนไปใช้การดึงจาก JSON-LD (วิธีที่ 2 ข้างต้น) ข้อมูลนี้อยู่ใน HTML ที่ตอบกลับมาเลย ไม่ต้องพึ่ง JavaScript
403 Forbidden
IMDb ใช้ เพื่อตรวจจับและบล็อกบอท ตัวกระตุ้นอันดับ 1 คือ User-Agent header ที่หายไปหรือปลอมจนดูชัดเจน ปัญหานี้มีการรายงานในหลายโปรเจกต์โอเพ่นซอร์ส แห่ง รวมถึง ที่มีพนักงาน IMDb ออกมายอมรับปัญหานี้
วิธีแก้: ใส่สตริง User-Agent ของเบราว์เซอร์จริงเสมอ และใส่ header Accept-Language: en-US ใช้ requests.Session() เพื่อจัดการ connection pooling
ได้ผลลัพธ์มาแค่ 25 รายการ
หน้า search ของ IMDb และรายการ “Most Popular” ใช้ lazy loading — ตอนแรกจะแสดงเพียงประมาณ 25 ผลลัพธ์ แล้วค่อยโหลดเพิ่มผ่าน AJAX เมื่อคุณเลื่อนหน้า
วิธีแก้: ใช้การแบ่งหน้าด้วยพารามิเตอร์ URL (อธิบายในส่วนถัดไป) หรือเปลี่ยนไปใช้หน้า Top 250 ซึ่งโหลดภาพยนตร์ทั้ง 250 เรื่องใน response เดียว
selector อยู่ๆ ก็ใช้ไม่ได้
selector เก่าๆ ที่ใช้ไม่ได้แล้ว: td.titleColumn, td.ratingColumn, .lister-item-header, .inline-block.ratings-imdb-rating ถ้าโค้ดของคุณใช้อันไหนในนี้ แปลว่าพังแล้ว
วิธีแก้: ควรใช้แอตทริบิวต์ data-testid (เช่น h1[data-testid="hero-title-block__title"]) แทนชื่อคลาสที่สร้างอัตโนมัติ ถ้าให้ดีกว่านั้น ใช้ JSON-LD ไปเลย
กรอบการตัดสินใจ: วิธีแก้ระยะสั้น vs ระยะยาว
- วิธีแก้เร็ว: ครอบ selector ทุกตัวด้วย
try/except, ตรวจสอบ HTTP status code, บันทึก error แทนการให้โปรแกรมล้ม - วิธีแก้ระยะกลาง: เปลี่ยนจาก CSS selector ไปใช้การดึง JSON-LD (วิธีที่ 2)
- วิธีแก้ระยะยาว: ใช้ สำหรับการวิเคราะห์ขนาดใหญ่ หรือใช้เครื่องมืออย่าง ที่ใช้ AI อ่านโครงสร้างหน้าใหม่ทุกครั้ง — ไม่ต้องดูแล selector เพราะ AI ปรับตามเลย์เอาต์ให้เอง
เกินกำแพง 25 ผลลัพธ์: การดึงข้อมูลแบ่งหน้าของ IMDb และชุดข้อมูลขนาดใหญ่
บทแนะนำของคู่แข่งทุกเจ้าที่ผมดู มักดึงแค่หน้าเดียว ไม่มีใครพูดถึง pagination เลย แต่ถ้าคุณต้องการมากกว่าหนึ่งรายการ คุณจะเจอกำแพงเร็วมาก
หน้าที่ไม่ต้องใช้ pagination
ข่าวดีคือ หน้า Top 250 โหลดภาพยนตร์ทั้ง 250 เรื่องใน response ที่เรนเดอร์จากฝั่งเซิร์ฟเวอร์เพียงครั้งเดียว ทั้ง JSON-LD และ __NEXT_DATA__ มีชุดข้อมูลครบถ้วนอยู่แล้ว ไม่ต้องแบ่งหน้า
การทำงานของ pagination ใน IMDb Search
หน้า search ของ IMDb ใช้พารามิเตอร์ URL start= โดยเพิ่มทีละ 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 เริ่มบล็อกหลังส่ง request รัวๆ ประมาณ 50 ครั้ง
time.sleep(3) ตรงนี้สำคัญ รายงานจากชุมชนระบุว่า IMDb เริ่มบล็อก IP หลังส่ง request รัวๆ ประมาณ 50 ครั้ง การหน่วงแบบสุ่ม 2–5 วินาทีจึงเป็นแนวปฏิบัติที่ดี
เมื่อไหร่ควรข้ามการ scraping ไปเลย: IMDb official bulk datasets
สำหรับความต้องการขนาดใหญ่มาก IMDb มีไฟล์ TSV ฟรี 7 ไฟล์ที่ และอัปเดตทุกวัน:
| ไฟล์ | เนื้อหา | ขนาด |
|---|---|---|
| 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 title ID)
4merged = basics.merge(ratings, on="tconst")
5top_movies = merged[merged["titleType"] == "movie"].nlargest(250, "averageRating")
ชุดข้อมูลเหล่านี้ครอบคลุมชื่อเรื่องมากกว่า 26 ล้านรายการ ไม่ต้องแบ่งหน้า ไม่ต้องใช้ selector ไม่ต้องเจอ 403 สิทธิ์ใช้งานจำกัดสำหรับการใช้งานส่วนตัวและไม่ใช่เชิงพาณิชย์เท่านั้น — คุณไม่สามารถนำข้อมูลไปเผยแพร่ซ้ำหรือขายต่อได้
ทางลัดแบบไม่ต้องเขียนโค้ด: Thunderbit จัดการ pagination ให้
สำหรับผู้อ่านที่ต้องการข้อมูล IMDb แบบแบ่งหน้า แต่ไม่อยากเขียน logic สำหรับ pagination เอง รองรับทั้งการแบ่งหน้าแบบคลิก และ infinite scroll ในตัว คุณแค่สั่งให้ scrape ที่เหลือมันจัดการเอง — รวมถึงการเลื่อนหน้าเพื่อโหลดคอนเทนต์ที่ lazy load ด้วย
ดึงข้อมูล IMDb ด้วย Python: โค้ดครบพร้อมใช้งานทันที
ต่อไปนี้คือสคริปต์แบบครบชุด 2 แบบที่คุณรันได้เลย
สคริปต์ 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 หรืออยากเขียน Python บางทีคุณอาจเป็นนักวิเคราะห์ operations ที่แค่ต้องการรายชื่อหนังเรตติ้งสูงของสัปดาห์นี้ในสเปรดชีต บางทีคุณอาจเป็น content strategist ที่อยากเปรียบเทียบแนวโน้มแนวหนังข้ามปี ในกรณีเหล่านั้น การเขียน scraper ถือว่าเกินความจำเป็น
วิธีดึงข้อมูลชุดเดียวกันด้วย มีดังนี้:
ก่อนเริ่ม:
- ระดับความยาก: มือใหม่
- เวลาที่ใช้: ประมาณ 2 นาที
- สิ่งที่ต้องมี: เบราว์เซอร์ Chrome, (ใช้แพ็กเกจฟรีได้)
ขั้นที่ 1: ไปยังหน้า IMDb ที่ต้องการดึงข้อมูล เปิดหน้า IMDb Top 250 (หรือหน้า list/search อื่นๆ ของ IMDb) ใน Chrome
ขั้นที่ 2: คลิก "AI Suggest Fields" ในแถบด้านข้างของ Thunderbit AI จะสแกนหน้าและแนะนำคอลัมน์ — โดยทั่วไปจะมี Title, Year, Rating, Genre และอื่นๆ ตามหน้า คุณจะเห็นตารางพรีวิวพร้อมฟิลด์ที่แนะนำ
ขั้นที่ 3: ปรับฟิลด์ตามต้องการ ลบคอลัมน์ที่ไม่ต้องใช้ หรือเพิ่มคอลัมน์ใหม่โดยคลิก "+ Add Column" แล้วอธิบายเป็นภาษาอังกฤษง่ายๆ ว่าต้องการอะไร เช่น "Director name" หรือ "Number of votes"
ขั้นที่ 4: คลิก "Scrape" Thunderbit จะดึงข้อมูลให้ สำหรับหน้าที่มี infinite scroll หรือ pagination มันจะจัดการการเลื่อนหน้าให้อัตโนมัติ
ขั้นที่ 5: Export คลิกปุ่มส่งออกแล้วเลือกฟอร์แมตที่ต้องการ — Excel, Google Sheets, CSV, Airtable หรือ Notion ข้อมูลจะถูกส่งไปยังปลายทางภายในไม่กี่วินาที
ข้อได้เปรียบหลักไม่ได้อยู่แค่ความสะดวก — แต่อยู่ที่ AI ของ Thunderbit จะอ่านโครงสร้างหน้าใหม่ทุกครั้ง เมื่อ IMDb เปลี่ยนเลย์เอาต์ (ซึ่งต้องเกิดขึ้นแน่) AI จะปรับตามให้เอง ไม่ต้องอัปเดต selector ไม่ต้องแก้โค้ด สำหรับใครที่เคยโดน scraper พังตอนตี 2 ก่อนเดดไลน์ นี่มีคุณค่ามาก
Thunderbit ยังรองรับการ scrape หน้าย่อยได้ด้วย — คุณสามารถคลิกเข้าไปยังหน้ารายละเอียดของแต่ละภาพยนตร์ แล้วเพิ่มข้อมูลในตารางด้วย cast, director, runtime และฟิลด์อื่นๆ ที่ไม่แสดงบนหน้ารายการ ถ้าอยากดูการทำงานจริง ลองดู
การดึงข้อมูล IMDb ถูกกฎหมายไหม? สิ่งที่ควรรู้
ผู้ใช้ถามเรื่องนี้ตรงๆ ในฟอรั่มว่า: "แบบนี้ถูกกฎหมายไหม?... IMDb ไม่ต้องการให้คน scrape เว็บไซต์ของพวกเขา" เป็นคำถามที่สมเหตุสมผล และไม่มีบทความคู่แข่งเจ้าไหนตอบประเด็นนี้เลย
robots.txt ของ IMDb: หน้า Top 250 (/chart/top/), หน้าภาพยนตร์รายเรื่อง (/title/ttXXXXXXX/) และหน้า name (/name/nmXXXXXXX/) ไม่ได้ถูกบล็อกโดย robots.txt เส้นทางที่ถูกบล็อกได้แก่ /find, /_json/*, /search/name-text, /user/ur*/ratings และ endpoint แบบ AJAX บางส่วน ไม่มีการกำหนด Crawl-delay
ข้อกำหนดการใช้งานของ IMDb: ข้อความที่เกี่ยวข้องระบุว่า: "คุณไม่อาจใช้ data mining, robots, screen scraping หรือเครื่องมือเก็บและดึงข้อมูลลักษณะเดียวกันบนเว็บไซต์นี้ เว้นแต่จะได้รับความยินยอมเป็นลายลักษณ์อักษรอย่างชัดแจ้งจากเรา" อีกข้อห้ามการนำข้อมูลที่ scrape ไปขายต่อหรือใช้เชิงพาณิชย์
สิ่งนี้หมายความว่าในทางปฏิบัติ: คำตัดสินศาลในปี 2024 ล่าสุด (Meta v. Bright Data, X Corp v. Bright Data) ชี้ว่า Terms of Service อาจไม่ได้ผูกพันผู้ใช้ที่ไม่เคยยอมรับเงื่อนไขนั้นมาก่อน — ถ้าคุณกำลังดึงข้อมูลที่เข้าถึงได้สาธารณะโดยไม่ต้องล็อกอิน การบังคับใช้ ToS จึงยังเป็นประเด็นถกเถียง แต่กฎหมายในส่วนนี้ยังพัฒนาอยู่
ทางเลือกที่ปลอดภัย: ชุดข้อมูลดาวน์โหลดอย่างเป็นทางการของ IMDb สำหรับการใช้งานส่วนตัวและไม่ใช่เชิงพาณิชย์ TMDb API ก็เปิดใช้งานได้ค่อนข้างเสรีด้วยคีย์ฟรี ทั้งสองตัวเป็นตัวเลือกที่ดีถ้าคุณอยากอยู่ในกรอบที่ชัดเจน
คำแนะนำเชิงปฏิบัติ: หากคุณจะ scrape จริง ให้ใช้ความถี่แบบสุภาพ (time.sleep(3) ระหว่าง request), ตั้ง header ให้เหมาะสม และอย่าเรียก path ที่ robots.txt บล็อกไว้ สำหรับโปรเจกต์เชิงพาณิชย์ ควรปรึกษาผู้เชี่ยวชาญด้านกฎหมายหรือใช้ชุดข้อมูล/API อย่างเป็นทางการ
เรามีการอธิบาย ไว้อย่างละเอียดบนบล็อกของ Thunderbit
สรุป: เลือกวิธีดึง IMDb ด้วย Python ให้เหมาะกับงาน
สรุปสั้นๆ:
- BeautifulSoup + CSS selector: ดีสำหรับการเรียนรู้พื้นฐาน คาดว่าจะพังทุก 6–12 เดือน และควรมีการจัดการข้อผิดพลาดเสมอ
- การดึงจาก JSON-LD: แนวทางที่ผมแนะนำสำหรับโปรเจกต์ Python ระยะยาว เป็นไปตามมาตรฐาน Schema.org เปลี่ยนน้อยกว่าคลาส CSS มาก และให้ข้อมูลที่มีโครงสร้างสวยงามโดยไม่ต้องเรนเดอร์ JavaScript
- JSON จาก
__NEXT_DATA__: ใช้เสริมเพื่อดึงข้อมูลที่ละเอียดขึ้นจากหน้ารายเรื่อง (runtime, นักแสดงทั้งหมด, พล็อต, รูปโปสเตอร์) - IMDb Official Datasets: ตัวเลือกที่ดีที่สุดสำหรับการวิเคราะห์ขนาดใหญ่ ชื่อเรื่องมากกว่า 26 ล้านรายการ อัปเดตทุกวัน ไม่ต้อง scrape เอง ใช้ได้เฉพาะส่วนตัว/ไม่เชิงพาณิชย์
- : ตัวเลือกที่ดีที่สุดสำหรับคนไม่เขียนโค้ด หรือใครก็ตามที่ต้องการข้อมูลเร็วๆ โดยไม่ต้องดูแลโค้ด AI จะปรับตามเลย์เอาต์ได้เอง รองรับ pagination และส่งออกไป Excel/Sheets/Airtable/Notion
บันทึกคู่มือนี้ไว้ได้เลย — ผมจะอัปเดตเมื่อโครงสร้างของ IMDb เปลี่ยนอีกครั้ง และถ้าคุณอยากข้ามโค้ดไปเลย ลอง แล้วดูว่าคุณจะเปลี่ยนจากหน้า IMDb ไปเป็นสเปรดชีตที่สะอาดได้เร็วแค่ไหน ถ้าคุณทำงานกับเว็บไซต์อื่นด้วย คู่มือ ของเราจะอธิบายเวิร์กโฟลว์ที่กว้างกว่านี้
คำถามที่พบบ่อย
การ scrape IMDb ถูกกฎหมายไหม?
ข้อกำหนดการใช้งานของ IMDb ห้ามการ scraping โดยไม่ได้รับความยินยอม แต่การบังคับใช้ ToS กับข้อมูลที่เข้าถึงได้สาธารณะยังเป็นประเด็นกฎหมายที่ถกเถียงได้หลังคำตัดสินศาลในปี 2024 ทางเลือกที่ปลอดภัยที่สุดคือ ของ IMDb (ใช้ส่วนตัว/ไม่เชิงพาณิชย์) หรือ TMDb API (คีย์ฟรี) หากคุณจะ scrape จริง ให้เคารพ robots.txt ใช้ช่วงเวลาหน่วงที่เหมาะสมระหว่าง request และหลีกเลี่ยง path ที่ถูกบล็อก สำหรับการใช้งานเชิงพาณิชย์ควรปรึกษาผู้เชี่ยวชาญด้านกฎหมาย
ทำไม IMDb scraper ของฉันถึงได้ผลลัพธ์ว่าง?
สาเหตุแทบจะเป็นเพราะ CSS selector ล้าสมัยเสมอ — class อย่าง td.titleColumn และ td.ratingColumn ไม่มีอยู่แล้วตั้งแต่เดือนมิถุนายน 2023 วิธีแก้คือเปลี่ยนไปใช้การดึงจาก JSON-LD (แยกแท็ก <script type="application/ld+json">) หรืออัปเดต selector ให้เป็นคลาส ipc- ที่ใช้อยู่ปัจจุบัน อีกอย่างคือต้องแน่ใจว่าคุณส่ง User-Agent header ที่เหมาะสมด้วย เพราะถ้าหายไป จะเจอ 403 ที่ดูเหมือนผลลัพธ์ว่างได้
จะดึงผลลัพธ์จาก IMDb มากกว่า 25 รายการได้อย่างไร?
หน้า Top 250 โหลดภาพยนตร์ทั้ง 250 เรื่องใน response เดียว — ไม่ต้องแบ่งหน้า สำหรับผลการค้นหา ให้ใช้พารามิเตอร์ URL start= (เพิ่มทีละ 50) เพื่อไล่ผลลัพธ์ เช่น start=1, start=51, start=101 และใส่ time.sleep(3) ระหว่าง request เพื่อหลีกเลี่ยงการถูกบล็อก หรืออีกทางคือใช้ชุดข้อมูลอย่างเป็นทางการของ IMDb ที่ ซึ่งมีชื่อเรื่องกว่า 26 ล้านรายการและไม่ต้องแบ่งหน้า
__NEXT_DATA__ คืออะไร และทำไมควรใช้มันในการ scrape IMDb?
__NEXT_DATA__ คือออบเจ็กต์ JSON ที่ฝังอยู่ในแท็ก <script id="__NEXT_DATA__"> บนหน้า React/Next.js ของ IMDb มันบรรจุข้อมูลแบบมีโครงสร้างครบถ้วนที่ React ใช้เรนเดอร์หน้า — ชื่อเรื่อง เรตติ้ง นักแสดง แนว เวลาเล่น และอื่นๆ อีกมากมาย เพราะมันสะท้อนโมเดลข้อมูลพื้นฐาน ไม่ใช่เลย์เอาต์ที่เห็นบนจอ จึงทนต่อการรีดีไซน์ UI ได้ดีกว่า CSS selector ใช้ควบคู่กับ JSON-LD จะยิ่งได้วิธีดึงข้อมูลที่แข็งแรงที่สุด
สามารถ scrape IMDb ได้โดยไม่ต้องเขียนโค้ดไหม?
ได้ มี 2 ทางหลัก: (1) ดาวน์โหลด ของ IMDb — ไฟล์ TSV 7 ไฟล์ ครอบคลุมชื่อเรื่องกว่า 26 ล้านรายการ อัปเดตทุกวัน ฟรีสำหรับการใช้งานที่ไม่ใช่เชิงพาณิชย์ (2) ใช้ ที่จะอ่านหน้า IMDb แนะนำฟิลด์ให้โดยอัตโนมัติ และส่งออกไป Excel, Google Sheets หรือ CSV ได้ใน 2 คลิก — ไม่ต้องเขียนโค้ด ไม่ต้องดูแล selector
อ่านเพิ่มเติม
