ปัจจุบัน TikTok มีผู้ใช้งานรายเดือนราว และครีเอเตอร์ก็อัปโหลดวิดีโอใหม่ประมาณ 23 ล้านคลิปทุกวัน ถ้าคุณเคยพยายามเก็บข้อมูลจากสายน้ำข้อมูลมหาศาลนี้แม้แค่เสี้ยวเดียว คุณคงรู้ดีว่ามันเหนื่อยและวุ่นวายแค่ไหน
โดยทั่วไปแล้วมันมักเป็นแบบนี้: คุณค้นหา "scrape TikTok videos with Python" ก็อปปี้โค้ดจากบทเรียนสักชิ้นมาใช้ (หรือปล่อยให้ ChatGPT เขียนให้) แล้วก็รัน... แต่สิ่งที่ได้กลับมาแทบไม่เป็นอะไรเลย บางทีก็เป็น HTML เปล่า ๆ, error 403 หรือข้อความชวนหงุดหงิดอย่าง "Process finished with exit code 0" ทั้งที่ไม่มีผลลัพธ์ออกมาเลย ผมเห็นวงจรแบบนี้ซ้ำแล้วซ้ำเล่าใน GitHub issues และเธรด Reddit หลายสิบแห่ง นี่แหละคือเหตุผลที่ผมทำคู่มือนี้ขึ้นมา เราจะพาคุณดู 3 วิธีด้วย Python ที่ยังใช้ได้จริงในปี 2025 พร้อมวิธีดาวน์โหลดไฟล์วิดีโอ .mp4 จริง ๆ แบบครบขั้นตอน ไม่ใช่แค่ metadata อย่างที่คู่มือส่วนใหญ่หยุดไว้แค่นั้น และยังมีตารางเปรียบเทียบให้เลือกวิธีที่เหมาะกับงานของคุณ ถ้าคุณไม่ได้จำเป็นต้องใช้ Python ผมก็จะพูดถึงตัวเลือกแบบ no-code อย่าง ที่ช่วยดึงข้อมูลชุดเดียวกันได้ในไม่กี่คลิก
การ "Scrape TikTok Videos" จริง ๆ หมายถึงอะไร?
ก่อนจะลงมือเขียนโค้ด เราควรทำความเข้าใจกันก่อนว่าคนส่วนใหญ่หมายถึงอะไรเวลาใช้คำว่า "scrape TikTok videos" เพราะคำนี้จริง ๆ ครอบคลุม 2 อย่างที่ต่างกันมาก:
- การดึง metadata ของวิดีโอ: คำบรรยาย แฮชแท็ก จำนวนไลก์ จำนวนคอมเมนต์ จำนวนแชร์ จำนวนวิว วันที่โพสต์ และข้อมูลผู้สร้าง ซึ่งเป็นสิ่งที่บทเรียนส่วนใหญ่มักจะเน้น
- การดาวน์โหลดไฟล์วิดีโอจริง (.mp4): การเก็บตัววิดีโอลงเครื่องของคุณ นี่คือสิ่งที่คนส่วนใหญ่ อยากได้จริง ๆ เมื่อพิมพ์ค้นหา "scrape TikTok videos" แต่แทบไม่มีใครอธิบายส่วนนี้
คู่มือนี้ครอบคลุมทั้งสองอย่าง ทุกวิธีด้านล่างสามารถดึง metadata ได้ และยังให้ URL สำหรับดาวน์โหลดไฟล์ .mp4 ที่คุณต้องใช้ด้วย
ทำไมต้องดึงข้อมูลวิดีโอ TikTok ด้วย Python?
เมื่อมี และ TikTok Shop สร้าง เหตุผลทางธุรกิจในการเข้าถึงข้อมูล TikTok จึงชัดมาก ตัวอย่างการใช้งานที่ผมเจอบ่อยมีดังนี้:
| กรณีใช้งาน | สิ่งที่ดึงข้อมูล | เหมาะกับใคร |
|---|---|---|
| วิจัยอินฟลูเอนเซอร์และการตลาด | อัตราการมีส่วนร่วม จำนวนผู้ติดตาม รูปแบบคอนเทนต์ ประสิทธิภาพของแฮชแท็ก | ทีมการตลาด, เอเจนซี |
| วางกลยุทธ์คอนเทนต์ | แฮชแท็กที่กำลังมาแรง รูปแบบวิดีโอไวรัล ความถี่ในการโพสต์ | ครีเอเตอร์, ผู้จัดการโซเชียลมีเดีย |
| ติดตามแบรนด์ | การกล่าวถึงแบรนด์ การเข้าถึงแคมเปญ ความรู้สึกของผู้ชม | ผู้จัดการแบรนด์, ทีม PR |
| วิเคราะห์คู่แข่ง | ผลงานวิดีโอของคู่แข่ง ครีเอทีฟโฆษณา รายการสินค้าใน TikTok Shop | อีคอมเมิร์ซ, ทีมสินค้า |
| วิจัยตลาด | เทรนด์ที่กำลังเกิด พฤติกรรมผู้ชม การค้นพบสินค้าใหม่ | นักวิเคราะห์, เฮดจ์ฟันด์, บริษัทวิจัย |
| เก็บถาวรและการกำกับดูแล | ไฟล์วิดีโอสำหรับทบทวนภายในหรือเก็บหลักฐาน | ฝ่ายกฎหมาย, ทีมคอมพลายแอนซ์, เอเจนซี |
เดิมพันเชิงพาณิชย์นั้นสูงจริง ๆ: คาดว่ารายได้โฆษณาของ TikTok ในสหรัฐฯ จะอยู่ที่ 23.4 พันล้านดอลลาร์ในปี 2026 และครีเอเตอร์สายแอฟฟิลิเอตสร้างรายได้ ในหมวดสินค้าชั้นนำของ TikTok Shop ถ้าคุณอยู่ในสายอีคอมเมิร์ซหรืออินฟลูเอนเซอร์มาร์เก็ตติ้ง ข้อมูลนี้มีมูลค่าเป็นตัวเงินโดยตรง
ทำไมโค้ด Python พื้นฐานของคุณถึงใช้ไม่ได้กับ TikTok
ถ้าคุณเคยลองอะไรทำนองนี้แล้วไม่สำเร็จ คุณไม่ได้อยู่คนเดียว:
1import requests
2from bs4 import BeautifulSoup
3resp = requests.get("https://www.tiktok.com/@someuser")
4soup = BeautifulSoup(resp.text, "html.parser")
5# ...แล้วก็ไม่มีอะไรที่ใช้ได้อยู่ใน HTML
เหตุผลนั้นตรงไปตรงมา: TikTok เป็นหนึ่งในแพลตฟอร์มที่ดึงข้อมูลยากที่สุด การใช้ requests.get() แบบธรรมดาส่วนใหญ่จะได้ HTML เปล่า ๆ เพราะเนื้อหาจริงถูกเรนเดอร์ด้วย JavaScript ในเบราว์เซอร์ นอกจากนี้ TikTok ยังมีระบบป้องกันบอทที่เข้มข้นมาก ทั้งการตรวจพฤติกรรมการใช้งาน, TLS fingerprint, ที่ใช้สร้าง request signature และ selector CSS ที่เปลี่ยนไปโดยไม่มีการแจ้งล่วงหน้า

ตามรายงาน Imperva 2025 Bad Bot Report ปริมาณทราฟฟิกจากบอทแซงหน้าทราฟฟิกจากมนุษย์เป็นครั้งแรกในปี 2024 — ตอนนี้บอทคิดเป็น TikTok รู้เรื่องนี้ดี และจึงวางระบบป้องกันไว้เข้มตามไปด้วย
ด้านล่างคือตารางวิเคราะห์ปัญหาแบบเร็ว เพื่อช่วยให้คุณไล่ดูได้ว่ากำลังติดตรงไหน และควรใช้วิธีใด:
| อาการ | สาเหตุที่เป็นไปได้ | วิธีที่ช่วยแก้ |
|---|---|---|
| HTML ว่าง / ไม่มีข้อมูล | เนื้อหาเรนเดอร์ด้วย JS; requests รัน JavaScript ไม่ได้ | วิธีที่ 1 (Hidden JSON) หรือ วิธีที่ 3 (Playwright) |
| 403 / Access Denied | Header ไม่ครบหรือไม่ถูกต้อง; ระบบป้องกันบอทจับได้ | วิธีที่ 1 พร้อม header ที่ถูกต้อง |
| ใช้ได้ครั้งแรก แล้วหยุดทำงาน | ถูกจำกัดอัตรา / IP ถูกบล็อก | หมุน proxy (ทุกวิธี) |
| เจอ login wall | ต้องใช้ session/cookie | วิธีที่ 3 (เบราว์เซอร์ที่มี session ที่บันทึกไว้) |
| โค้ดจาก ChatGPT ไม่ได้ผลเลย | โครงสร้าง TikTok เปลี่ยนไปจากข้อมูลที่โมเดลเคยเรียนรู้ | ทั้ง 3 วิธี (แนวทางที่อัปเดตแล้ว) |
โดยทั่วไปจะเริ่มเจอการจำกัดที่ประมาณ 30–60 requests ต่อนาทีต่อ IP ก่อนจะโดนบล็อกแบบนุ่ม ๆ หรือเจอ CAPTCHA ถ้าเป็น IP จากดาต้าเซ็นเตอร์มักจะถูกจับได้ภายในไม่กี่นาที — ถ้าทำในปริมาณมาก residential หรือ mobile proxy แทบจะจำเป็นเลย
ภาพรวม: 3 วิธีในการดึงข้อมูลวิดีโอ TikTok ด้วย Python
นี่คือแผนภาพรวมของเรา แต่ละวิธีมีข้อดีข้อเสียต่างกัน และผมจะพาไล่ทีละวิธีพร้อมโค้ดที่ใช้งานได้จริง:
- Hidden JSON Extraction — แยกข้อมูลจาก script tag
__UNIVERSAL_DATA_FOR_REHYDRATION__ที่ฝังอยู่ในหน้า TikTok เร็วที่สุด ง่ายที่สุด และไม่ต้องใช้เบราว์เซอร์ - TikTok Internal API — เรียก endpoint ที่ไม่ค่อยมีการประกาศอย่าง
/api/post/item_list/โดยตรง เพื่อดึงข้อมูลจำนวนมากแบบ cursor-based pagination - Browser Automation with Playwright — เรนเดอร์หน้าในเบราว์เซอร์แบบ headless เพื่อรับมือกับ infinite scroll, เนื้อหาไดนามิก และ login wall
ทั้งสามวิธีนี้ยังใช้ดาวน์โหลดไฟล์วิดีโอ .mp4 ได้ด้วย — ผมจะอธิบายในส่วนเฉพาะหลังจากสอนวิธีแต่ละแบบเสร็จ และจะมีตารางเปรียบเทียบละเอียดท้ายบทความเพื่อให้คุณตัดสินใจได้ง่ายขึ้น
วิธีที่ 1: ดึงข้อมูล TikTok ด้วย Hidden JSON (เหมาะกับมือใหม่)
นี่คือวิธีที่ผมแนะนำให้เริ่มก่อน TikTok ฝัง JSON ขนาดใหญ่ไว้ใน <script> tag ที่มี id เป็น __UNIVERSAL_DATA_FOR_REHYDRATION__ แทบทุกหน้าที่โหลด JSON ก้อนนี้มีข้อมูลโปรไฟล์และข้อมูลวิดีโอที่ฝั่งหน้าเว็บจะต้องเรนเดอร์อยู่แล้ว ซึ่งหมายความว่าคุณดึงมันได้ด้วย HTTP request เพียงครั้งเดียว ไม่ต้องเปิดเบราว์เซอร์เลย
สิ่งที่ต้องมี
- Python 3.8+
requests(หรือhttpx)beautifulsoup4(หรือparsel)- header ที่เหมาะสม:
User-Agent,Referer,Accept-Language
ติดตั้ง dependencies:
1pip install requests beautifulsoup4
ทีละขั้น: ดึงข้อมูลวิดีโอ TikTok จาก script tag
ขั้นที่ 1: ส่ง GET request พร้อม header แบบเหมือนเบราว์เซอร์จริง
นี่คือจุดที่มือใหม่พลาดบ่อยที่สุด ถ้าคุณส่ง requests.get() เปล่า ๆ โดยไม่มี header TikTok มักตอบกลับด้วย 403 หรือหน้า CAPTCHA คุณจึงควรใส่อย่างน้อย User-Agent ล่าสุดของเบราว์เซอร์ และ header Referer
1import requests
2from bs4 import BeautifulSoup
3import json
4> This paragraph contains content that cannot be parsed and has been skipped.
5resp = requests.get(url, headers=headers)
ขั้นที่ 2: แยก HTML และหา script tag ที่เก็บข้อมูล hydration
1soup = BeautifulSoup(resp.text, "html.parser")
2script_tag = soup.find("script", id="__UNIVERSAL_DATA_FOR_REHYDRATION__")
ถ้า script_tag เป็น None แปลว่า TikTok อาจบล็อกคุณไว้แล้ว (ตรวจ status code) หรือเปลี่ยน ID ของ tag (ซึ่งเกิดไม่บ่อยแต่ก็เป็นไปได้)
ขั้นที่ 3: โหลดเนื้อหาใน script ให้เป็น JSON
1data = json.loads(script_tag.string)
ขั้นที่ 4: ไล่โครงสร้าง JSON เพื่อดึง metadata ของวิดีโอ
โครงสร้างจะซ้อนอยู่ภายใต้ __DEFAULT_SCOPE__ สำหรับหน้าโปรไฟล์ผู้ใช้:
1user_detail = data["__DEFAULT_SCOPE__"]["webapp.user-detail"]
2user_info = user_detail["userInfo"]
3# สถิติโปรไฟล์
4stats = user_info["stats"]
5print(f"Followers: {stats['followerCount']}, Likes: {stats['heartCount']}")
6# รายการวิดีโอ (หน้าแรก)
7item_list = user_detail.get("itemList", [])
8for video in item_list:
9 print(video["desc"]) # คำบรรยาย
10 print(video["stats"]["playCount"]) # จำนวนวิว
11 print(video["video"]["playAddr"]) # URL ดาวน์โหลดวิดีโอ (ไม่มีลายน้ำ)
12 print(video["video"]["downloadAddr"]) # URL ดาวน์โหลดวิดีโอ (มีลายน้ำ)
ขั้นที่ 5: ดึง URL ดาวน์โหลดวิดีโอ
ฟิลด์ playAddr มักจะให้ไฟล์วิดีโอที่สะอาดกว่าเดิม (บ่อยครั้งไม่มีลายน้ำของ TikTok) ส่วน downloadAddr จะเป็นเวอร์ชันมาตรฐานที่มีลายน้ำ ทั้งสองเป็น URL ตรงไปยังไฟล์ .mp4 แต่ต้องใช้ header เฉพาะตอนดาวน์โหลด (จะอธิบายต่อในส่วนดาวน์โหลด)
ตอนนี้คุณควรได้รายการวัตถุ metadata ของวิดีโอ ซึ่งแต่ละรายการมีคำบรรยาย สถิติ เวลาโพสต์ แฮชแท็ก (อยู่ใน challenges[] และ textExtra) และ URL วิดีโอโดยตรง
ข้อจำกัดของวิธี Hidden JSON
- ดึงได้เฉพาะข้อมูลจากการโหลดหน้าแรก — โดยมากคือประมาณ 30 วิดีโอแรกบนโปรไฟล์
- รับมือ infinite scroll หรือ pagination ไม่ได้ (ไม่มี "next page" ให้เรียก)
- ถ้า TikTok เปลี่ยน ID ของ script tag หรือโครงสร้าง JSON ตัว parser จะพัง (เกิดขึ้นเป็นระยะ — ช่วยจับปัญหาได้เร็ว)
- เหมาะสำหรับ: ดึงข้อมูลโปรไฟล์แบบเร็ว ๆ งานครั้งเดียว หรือเมื่อคุณต้องการแค่วิดีโอล่าสุด
วิธีที่ 2: ดึงข้อมูล TikTok ผ่าน Internal API
ฝั่งหน้าเว็บของ TikTok ไม่ได้โหลดวิดีโอทั้งหมดพร้อมกัน — แต่มันจะยิง XHR ไปยัง internal API endpoint ระหว่างที่คุณเลื่อนหน้า จุดหลักสำหรับวิดีโอของผู้ใช้คือ /api/post/item_list/ คุณสามารถเรียก endpoint นี้จาก Python ได้โดยตรง ซึ่งจะได้ pagination แบบ cursor-based และเข้าถึงวิดีโอทั้งหมดในโปรไฟล์ได้ ไม่ใช่แค่หน้าแรก
จะหา Internal API Endpoint ได้อย่างไร
เปิด Chrome DevTools ที่หน้าโปรไฟล์ TikTok ไปที่แท็บ Network กรองด้วย XHR แล้วเลื่อนลง คุณจะเห็น request ไปยัง URL ประมาณนี้:
1https://www.tiktok.com/api/post/item_list/?WebIdLastTime=...&aid=1988&count=35&cursor=0&secUid=...
พารามิเตอร์สำคัญคือ:
secUid— ID เฉพาะของโปรไฟล์ (ดึงได้จาก JSON ในวิธีที่ 1 ภายใต้userInfo.user.secUid)cursor— ตำแหน่ง pagination (เริ่มที่0และแต่ละ response จะบอก cursor ถัดไป)count— จำนวนรายการต่อหน้า (โดยปกติ 30–35)
ทีละขั้น: เรียก TikTok Internal API ด้วย Python
ขั้นที่ 1: ดึง secUid ของโปรไฟล์เป้าหมาย
คุณดึงได้จาก hidden JSON (วิธีที่ 1) หรือจาก HTML ของหน้าโปรไฟล์
ขั้นที่ 2: สร้างและส่ง API request
1import requests
2import json
3> This paragraph contains content that cannot be parsed and has been skipped.
4resp = requests.get(api_url, params=params, headers=headers)
5data = resp.json()
ขั้นที่ 3: แยกข้อมูลใน response
แต่ละรายการใน data["itemList"] จะมีโครงสร้างวิดีโอแบบเดียวกับวิธีที่ 1 — เช่น desc, stats, video.playAddr, video.downloadAddr เป็นต้น
ขั้นที่ 4: วนดึงข้อมูลทุกหน้า
1all_videos = []
2cursor = 0
3has_more = True
4while has_more:
5 params["cursor"] = cursor
6 resp = requests.get(api_url, params=params, headers=headers)
7 data = resp.json()
8 items = data.get("itemList", [])
9 all_videos.extend(items)
10 has_more = data.get("hasMore", False)
11 cursor = data.get("cursor", 0)
12 print(f"Fetched {len(items)} videos, total: {len(all_videos)}, hasMore: {has_more}")
13print(f"Total videos scraped: {len(all_videos)}")
แต่ละรอบจะได้ชุดข้อมูลถัดไปพร้อม cursor ใหม่ วนต่อไปจน hasMore เป็น False
ข้อจำกัดของวิธี Internal API
- TikTok เปลี่ยน endpoint และพารามิเตอร์ที่ต้องใช้บ่อยมาก — นี่คือวิธีที่ดูแลยากที่สุด ในช่วงไม่กี่เดือนที่ผ่านมา request บางแบบเริ่มต้องใช้
msToken,X-Bogusหรือ signature parameter อื่น ๆ ที่ TikTok สร้างด้วย (สรุปคือ ถ้าจะทำ pure Python ให้เหมือนทั้งหมดนั้นไม่ง่าย) - อาจต้องใช้ session cookies หรือ token เพิ่มเติมสำหรับข้อมูลบางประเภท
- ยังมีการจำกัดอัตราตาม IP อยู่ — แนะนำให้หมุน proxy
- ถ้าเริ่มได้
itemListว่าง ๆ แปลว่าmsTokenของคุณน่าจะหมดอายุแล้ว (ในเบราว์เซอร์มันหมุนประมาณทุก 10 วินาที) - เหมาะสำหรับ: ดึงข้อมูลจำนวนมาก เมื่อคุณต้องการวิดีโอทั้งหมดจากโปรไฟล์ และข้อจำกัดของวิธีที่ 1 ที่ได้แค่หน้าแรกไม่พอ
วิธีที่ 3: ดึงข้อมูล TikTok ด้วย Playwright (Browser Automation)
เมื่อสองวิธีแรกติดกำแพง — ไม่ว่าจะเป็นข้อกำหนดล็อกอิน, CAPTCHA หรือพารามิเตอร์ signature ที่ทำซ้ำไม่ได้ — Playwright คือทางเลือกสำรอง มันเปิดเบราว์เซอร์จริง (แบบ headless) แล้วเข้า TikTok เหมือนผู้ใช้ทั่วไป จึงรับมือการเรนเดอร์ JavaScript, infinite scroll และแม้แต่ session ที่ล็อกอินอยู่ได้
ตั้งค่า Playwright สำหรับการดึงข้อมูล TikTok
ติดตั้ง Playwright และ browser binaries:
1pip install playwright
2playwright install firefox
ผมแนะนำ Firefox มากกว่า Chromium สำหรับการ scrape TikTok เพราะจากการทดสอบของชุมชนพบว่า Firefox มี และระบบตรวจจับบอทของ TikTok ก็เข้มงวดเป็นพิเศษกับ headless browser ที่ใช้ Chromium
ถ้าต้องการ stealth เพิ่มเติม ลองจับคู่ Playwright กับ (fork ของ Playwright ที่ปรับแต่งแล้ว) หรือ (Firefox ที่ปรับระดับ C++ เพื่อหลบการตรวจจับ) ใน Camoufox ทำคะแนน stealth ใกล้เคียงสมบูรณ์แบบเมื่อเทียบกับบริการตรวจจับบอทหลัก ๆ
ทีละขั้น: ดึงวิดีโอโปรไฟล์ TikTok ด้วย Playwright
ขั้นที่ 1: เปิดเบราว์เซอร์ headless Firefox แล้วเข้าไปที่โปรไฟล์
1import asyncio
2from playwright.async_api import async_playwright
3import json
4> This paragraph contains content that cannot be parsed and has been skipped.
5 await page.goto(f"https://www.tiktok.com/@{username}", wait_until="networkidle")
ขั้นที่ 2: รอให้กริดวิดีโอโหลดขึ้นมา
1 # รอให้รายการวิดีโอปรากฏ
2 await page.wait_for_selector('[data-e2e="user-post-item"]', timeout=15000)
ถ้า TikTok แสดง overlay ข้อความ "Something went wrong" คุณอาจต้องกดปุ่มลองใหม่:
1 retry_btn = page.locator('button:has-text("Retry")')
2 if await retry_btn.count() > 0:
3 await retry_btn.click()
4 await page.wait_for_selector('[data-e2e="user-post-item"]', timeout=15000)
ขั้นที่ 3: ดึงข้อมูลจาก hidden JSON (แม้จะใช้เบราว์เซอร์ก็ตาม)
วิธีที่น่าเชื่อถือที่สุดยังคงเป็นการดึง hydration JSON แม้กำลังใช้เบราว์เซอร์อยู่:
1 script_el = page.locator("#__UNIVERSAL_DATA_FOR_REHYDRATION__")
2 raw_json = await script_el.inner_text()
3 data = json.loads(raw_json)
4 # ไล่ JSON แบบเดียวกับวิธีที่ 1
5 user_detail = data["__DEFAULT_SCOPE__"]["webapp.user-detail"]
6 videos = user_detail.get("itemList", [])
ขั้นที่ 4: จัดการ infinite scroll เพื่อดึงวิดีโอเพิ่ม
ถ้าคุณต้องการมากกว่า 30 วิดีโอแรก ให้เลื่อนลงและจับ response จาก XHR เพิ่มเติม:
1 all_videos = list(videos)
2 # ดักจับ API response ระหว่างที่เลื่อนหน้า
3 api_responses = []
4 async def capture_response(response):
5 if "/api/post/item_list" in response.url:
6 try:
7 body = await response.json()
8 api_responses.append(body)
9 except:
10 pass
11 page.on("response", capture_response)
12 # เลื่อนลงเพื่อกระตุ้นให้โหลดข้อมูลเพิ่ม
13 for _ in range(5): # ปรับจำนวนครั้งตามต้องการ
14 await page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
15 await asyncio.sleep(2)
16 # รวบรวมวิดีโอจาก response ที่ดักไว้
17 for api_resp in api_responses:
18 items = api_resp.get("itemList", [])
19 all_videos.extend(items)
20 print(f"Total videos: {len(all_videos)}")
21 await browser.close()
22 return all_videos
23# เรียกใช้งาน
24videos = asyncio.run(scrape_tiktok_profile("charlidamelio"))
ตอนนี้คุณควรได้รายการวัตถุวิดีโอจากทั้งหน้าแรกและหน้าที่เพิ่มมาระหว่างการเลื่อน
ข้อจำกัดของวิธี Playwright
- ช้าที่สุดในทั้งสามวิธี (ต้องเรนเดอร์หน้าเต็ม มี round-trip ของเครือข่าย และมีช่วงรอเลื่อนหน้า)
- ใช้ทรัพยากรมากกว่า — browser แต่ละ instance ใช้ RAM และ CPU ค่อนข้างสูง
- ยังเสี่ยงถูกบล็อกตาม IP เมื่อใช้งานในสเกลใหญ่ — ควรใช้ร่วมกับ proxy rotation
- เหมาะสำหรับ: งานที่มีการโต้ตอบซับซ้อน เนื้อหาที่มีกำแพงล็อกอิน รับมือ CAPTCHA หรือเมื่อติดข้อจำกัดของวิธีที่ 1 และ 2
วิธีดาวน์โหลดวิดีโอ TikTok (.mp4) ด้วย Python
นี่คือส่วนที่เป็นช่องว่างใหญ่ที่สุดในบทเรียน TikTok scraping ส่วนมาก การดึง metadata นั้นมีประโยชน์ แต่คนส่วนใหญ่ที่ค้นหา "scrape TikTok videos" ต้องการไฟล์วิดีโอจริง ๆ
TikTok ฝัง URL ดาวน์โหลดไว้ใน object ข้อมูลของวิดีโอ:
playAddr— มักเป็นเวอร์ชันไม่มีลายน้ำ หรือมีลายน้ำน้อยกว่าdownloadAddr— เวอร์ชันที่ TikTok ตั้งใจให้ดาวน์โหลดผ่านแอป โดยจะมีลายน้ำของ TikTok
ทั้งสอง URL มีอายุใช้งานสั้นและมักหมดอายุภายในไม่กี่ชั่วโมง ดังนั้นคุณควรดาวน์โหลดทันทีหลังจากดึง URL ออกมา
ทีละขั้น: ดาวน์โหลดไฟล์วิดีโอ TikTok
ขั้นที่ 1: ดึง URL วิดีโอจากหนึ่งใน 3 วิธีด้านบน
1video_url = video["video"]["playAddr"] # เวอร์ชันไม่มีลายน้ำ
2# หรือ
3video_url = video["video"]["downloadAddr"] # เวอร์ชันมีลายน้ำ
ขั้นที่ 2: ส่ง GET request พร้อม header ที่ถูกต้อง
นี่คือขั้นที่หลายคนพลาด ถ้าคุณแค่ requests.get(video_url) ตรง ๆ คุณจะเจอ 403 เพราะ TikTok ตรวจ Referer และคาดหวัง User-Agent ที่ดูเหมือนมาจากเบราว์เซอร์
1import requests
2> This paragraph contains content that cannot be parsed and has been skipped.
3resp = requests.get(video_url, headers=headers, stream=True)
ขั้นที่ 3: เขียน response ลงไฟล์ .mp4
ใช้ stream=True และเขียนเป็น chunks เพราะไฟล์วิดีโอ TikTok อาจมีขนาดใหญ่ และคุณไม่ควรโหลดทั้งไฟล์เข้า memory ทีเดียว:
1video_id = video["id"]
2filename = f"tiktok_{video_id}.mp4"
3with open(filename, "wb") as f:
4 for chunk in resp.iter_content(chunk_size=1024 * 1024): # chunks ขนาด 1MB
5 if chunk:
6 f.write(chunk)
7print(f"Downloaded: {filename}")
ตอนนี้คุณควรมีไฟล์ .mp4 ที่เปิดเล่นได้อยู่ในเครื่องแล้ว
ดาวน์โหลดแบบมีลายน้ำ vs ไม่มีลายน้ำ
TikTok เก็บทั้งเวอร์ชันมีลายน้ำและไม่มีลายน้ำของวิดีโอแต่ละคลิปไว้ playAddr มักให้ไฟล์ที่สะอาดกว่า (เป็นเวอร์ชันที่ตัวเล่นใช้) ส่วน downloadAddr จะมีลายน้ำของ TikTok พร้อมชื่อผู้สร้างทับอยู่
ขอพูดถึงประเด็นจริยธรรมสั้น ๆ ตรงนี้: ลายน้ำมีไว้เพื่อให้เครดิตผู้สร้าง ถ้าคุณดาวน์โหลดเพื่อการวิจัย การวิเคราะห์ หรือการทบทวนภายใน การใช้ playAddr โดยทั่วไปถือว่าเหมาะสม แต่ถ้าคุณนำไปเผยแพร่ต่อหรือโพสต์ซ้ำ การลบการอ้างอิงผู้สร้างย่อมกระทบทั้งเรื่องจริยธรรมและลิขสิทธิ์ รายละเอียดเพิ่มเติมอยู่ในส่วนกฎหมายด้านล่าง
ถ้าคุณต้องการ pipeline การดาวน์โหลดที่แข็งแรงกว่านี้ ลองใช้ เพราะ TikTok extractor ของมันจัดการเรื่อง signature และการแปลง URL ให้อัตโนมัติ คุณจึงไม่ต้องดูแล header และการหมดอายุของ token ด้วยตัวเอง
เปรียบเทียบแบบตัวต่อตัว: ควรใช้วิธี Python แบบไหน?
นี่คือตารางเปรียบเทียบที่ผมอยากมีตอนเริ่มทำโปรเจกต์ดึงข้อมูล TikTok ครั้งแรก:
This paragraph contains content that cannot be parsed and has been skipped.
คำแนะนำของผมคือ:
- ต้องการ snapshot เร็ว ๆ ของโปรไฟล์เดียว? เริ่มที่วิธีที่ 1 ตั้งค่าง่าย ใช้เวลาประมาณ 30 วินาที และได้ข้อมูลในเวลาต่ำกว่าหนึ่งวินาทีต่อหน้า
- ต้องการวิดีโอทั้งหมดของโปรไฟล์พร้อม pagination? ใช้วิธีที่ 2 แต่ต้องเตรียมรับมือการดูแลเมื่อ TikTok เปลี่ยนพารามิเตอร์ API
- เจอ login wall, CAPTCHA หรืออยากได้ความทนทานสูงสุด? วิธีที่ 3 ด้วย Playwright ช้ากว่าและใช้เครื่องมากกว่า แต่ TikTok บล็อกยากที่สุด
ในทางปฏิบัติ ผมมักเริ่มจากวิธีที่ 1 แล้วค่อยขยับไปวิธีที่ 2 หรือ 3 เมื่อเจอข้อจำกัด วิธีนี้ช่วยให้โครงสร้างพื้นฐานเรียบง่ายและค่าใช้จ่ายต่ำ
ถ้าไม่อยากใช้ Python: ดึงข้อมูล TikTok ด้วยเครื่องมือ No-Code
หลายคนที่ค้นหา "scrape TikTok videos with Python" จริง ๆ แล้วไม่ได้ต้องการ Python พวกเขาแค่ต้องการข้อมูล ถ้าคุณเป็นนักวิเคราะห์การตลาดที่อยากได้ metadata ของวิดีโอจากโปรไฟล์คู่แข่งไม่กี่อัน หรือเป็นผู้จัดการแบรนด์ที่ต้องติดตามการกล่าวถึงแบรนด์ การตั้งสภาพแวดล้อม Python พร้อม proxy rotation และการจัดการ signature อาจเกินความจำเป็น

นี่คือการเปรียบเทียบแบบตรงไปตรงมา:
| แนวทาง | ระดับทักษะ | ค่าใช้จ่าย | การดูแลรักษา | เหมาะสำหรับ |
|---|---|---|---|---|
| Python (ทำเอง) | ระดับกลางขึ้นไป | ฟรี (+ ค่า proxy) | สูง (สคริปต์พังบ่อย) | ควบคุมได้เต็มที่, pipeline แบบกำหนดเอง |
| Thunderbit (ส่วนขยาย Chrome) | มือใหม่ | มีแผนใช้ฟรี | ไม่มี (AI อ่านหน้าเว็บใหม่ทุกครั้ง) | ดึงข้อมูลวิดีโอเร็ว ๆ, ส่งออกไป Sheets/Excel |
| Apify TikTok Scraper | มือใหม่ | มีค่าใช้จ่าย (จ่ายตามรัน) | ต่ำ (Apify ดูแลให้) | รันอัตโนมัติปริมาณมากตามตาราง |
| TikAPI | นักพัฒนา | สมัครใช้งานแบบชำระเงิน | ปานกลาง | สร้างแอปบนข้อมูล TikTok |
Thunderbit จัดการการ scrape TikTok อย่างไร
คือ AI web scraper ที่เราสร้างขึ้น และมันทำงานต่างจากเครื่องมือ scraping แบบดั้งเดิม แทนที่จะพึ่ง CSS selector หรือ XPath ที่สร้างไว้ล่วงหน้า ซึ่งพังทุกครั้งที่ TikTok เปลี่ยนหน้าตาเว็บ AI ของ Thunderbit จะอ่านโครงสร้างหน้าใหม่ทุกครั้ง และแนะนำคอลัมน์ที่เกี่ยวข้อง เช่น คำบรรยาย จำนวนไลก์ แฮชแท็ก URL วิดีโอ ผู้สร้าง และอื่น ๆ
เวิร์กโฟลว์จริง ๆ มีแค่สองคลิก:
- เปิดหน้าโปรไฟล์ TikTok ใน Chrome คลิกส่วนขยาย Thunderbit แล้วกด "AI Suggest Fields" จากนั้น Thunderbit จะสแกนหน้าและเสนอรูปแบบตาราง
- ตรวจสอบคอลัมน์ที่แนะนำ ปรับถ้าจำเป็น แล้วคลิก "Scrape"
ข้อมูลส่งออกไปยัง Google Sheets, Excel, Airtable หรือ Notion ได้โดยตรง ไม่ต้องดูแล CSS selector, ไม่ต้อง debug โค้ด, ไม่ต้องตั้งค่า proxy สำหรับนักวิเคราะห์การตลาดที่ต้องการ metadata จากไม่กี่โปรไฟล์ วิธีนี้เร็วกว่าการตั้ง Python environment อย่างเห็นได้ชัด — และไม่พังเมื่อ TikTok ปรับ front-end (ซึ่งจากรายงานของชุมชนดูจะเกิดขึ้นทุกไม่กี่สัปดาห์)
Thunderbit ยังรองรับ ด้วย — มันสามารถเข้าไปในหน้าวิดีโอแต่ละคลิปเพื่อเติมรายละเอียดลงในตาราง เช่น จำนวนคอมเมนต์ทั้งหมด ข้อมูลเพลง หรือความยาววิดีโอ
คุณลองใช้ฟรีได้ผ่าน ถ้าอยากดูวิธีทำงานเพิ่มเติม ลองดู ของเรา
ข้อควรระวังด้านกฎหมายและจริยธรรมในการดึงข้อมูล TikTok
แทบไม่มีบทเรียนอันดับต้น ๆ ในหัวข้อนี้ที่พูดถึงเรื่องความถูกต้องตามกฎหมาย ซึ่งเป็นการละเลยเรื่องสำคัญ เพราะ TikTok เคยดำเนินคดีกับบริการ scraping อย่างจริงจัง นี่คือสิ่งที่คุณควรรู้
ข้อกำหนดการใช้งานของ TikTok (§ 4.1) ห้ามการเข้าถึงแบบอัตโนมัติโดยชัดเจน การละเมิด TOS คือการผิดสัญญา ไม่ใช่ความผิดอาญา — แต่ก็อาจนำไปสู่การแบนบัญชี การบล็อก IP หรือการฟ้องร้องทางแพ่งได้
ภูมิทัศน์ทางกฎหมายเปิดกว้างมากกว่าที่หลายคนคิดสำหรับข้อมูลสาธารณะ คดีสำคัญคือ Meta Platforms v. Bright Data (N.D. Cal., ม.ค. 2024) ซึ่งศาลตัดสินว่าการ scrape ข้อมูลสาธารณะที่เข้าถึงได้ขณะไม่ได้ล็อกอิน ไม่ได้ละเมิด Terms of Service ของ Meta ต่อมา Meta ถอนคดีและสละสิทธิ์อุทธรณ์ คำพิพากษา hiQ v. LinkedIn ในศาลอุทธรณ์เขต 9 (ยืนยันอีกครั้งหลัง Van Buren) วางหลักไว้ว่า การ scrape ข้อมูลสาธารณะที่เข้าถึงได้ไม่ถือเป็นการละเมิด CFAA — แม้ท้ายที่สุด hiQ จะยอมความ จ่าย 500,000 ดอลลาร์ และตกลงให้มี permanent injunction ซึ่งแสดงว่าการบังคับใช้ TOS ยังมีผลได้จริง
GDPR และ CCPA จะมีผลใช้บังคับหากคุณเก็บข้อมูลส่วนบุคคลจากผู้ใช้ในสหภาพยุโรปหรือแคลิฟอร์เนีย การ scrape โพสต์สาธารณะเป็นอีกเรื่องหนึ่ง แต่การสร้างฐานข้อมูลข้อมูลส่วนบุคคลของผู้ใช้รายบุคคลเป็นอีกเรื่องหนึ่งโดยสิ้นเชิง
แนวทางปฏิบัติที่ควรทำ:
- จำกัดอัตราคำขอของคุณ (อย่ายิงถี่ใส่เซิร์ฟเวอร์ TikTok)
- อย่าดึงข้อมูลจากบัญชีส่วนตัวหรือคอนเทนต์ของผู้เยาว์
- อย่านำวิดีโอที่มีลิขสิทธิ์ไปเผยแพร่ซ้ำเชิงพาณิชย์
- เคารพ
robots.txt(TikTok ปิดกั้นการ crawl อัตโนมัติส่วนใหญ่) - การดาวน์โหลดวิดีโอเพื่อการวิจัยหรือวิเคราะห์ส่วนตัว ต่างจากการเอาไปโพสต์ซ้ำ — ต้องแยกให้ออก
ข้อจำกัดความรับผิด: เนื้อหานี้มีไว้เพื่อการศึกษา ไม่ใช่คำปรึกษาทางกฎหมาย ถ้าคุณกำลังสร้างผลิตภัณฑ์เชิงพาณิชย์บนข้อมูล TikTok ที่ดึงมา โปรดปรึกษาทนาย
สรุป: ประเด็นสำคัญที่ควรจำ
การดึงข้อมูล TikTok ในปี 2025 เป็นเป้าหมายที่เปลี่ยนตลอดเวลา ระบบป้องกันบอทของแพลตฟอร์มนี้ถือว่าโหดที่สุดชุดหนึ่งบนเว็บ และแนวทางแบบง่าย ๆ (requests ตรง ๆ, snippet จาก ChatGPT, บทเรียนที่ล้าสมัย) มักใช้ไม่ได้ แต่ถ้าใช้วิธีที่ถูกต้อง มันทำได้แน่นอน
สรุปที่ควรจำมีดังนี้:
- **วิธีที่ปัจจุบัน TikTok มีผู้ใช้งานรายเดือนราว และครีเอเตอร์อัปโหลดวิดีโอใหม่ประมาณ 23 ล้านคลิปทุกวัน ถ้าคุณเคยพยายามเก็บข้อมูลจากกระแสข้อมูลมหาศาลนี้แม้เพียงเศษเสี้ยวเดียว คุณคงรู้ดีว่ามันเหนื่อยขนาดไหน
โดยปกติแล้วจะเป็นแบบนี้: คุณค้นหา "scrape TikTok videos with Python" คัดลอกโค้ดจากบทเรียนสักชิ้น (หรือให้ ChatGPT เขียนให้) แล้วรัน... แต่กลับได้อะไรไม่รู้เลย อาจเป็น HTML ว่าง ๆ, error 403 หรือข้อความชวนหงุดหงิดอย่าง "Process finished with exit code 0" ทั้งที่ไม่มีผลลัพธ์ใด ๆ ออกมาเลย ผมเห็นวงจรแบบนี้ซ้ำแล้วซ้ำเล่าใน GitHub issues และเธรดบน Reddit หลายสิบแห่ง นี่จึงเป็นเหตุผลที่ผมทำคู่มือนี้ขึ้นมา เราจะพาคุณดู 3 วิธีด้วย Python ที่ยังใช้งานได้จริงในปี 2025 พร้อมวิธีดาวน์โหลดไฟล์วิดีโอ .mp4 จริง ๆ แบบครบขั้นตอน (ไม่ใช่แค่ metadata อย่างที่คู่มือส่วนใหญ่หยุดไว้แค่นั้น) และมีตารางเปรียบเทียบให้เลือกวิธีที่เหมาะกับงานของคุณ ถ้าคุณไม่ได้จำเป็นต้องใช้ Python ผมก็จะพูดถึงตัวเลือกแบบ no-code อย่าง ที่ช่วยดึงข้อมูลชุดเดียวกันได้ในไม่กี่คลิก
การ "Scrape TikTok Videos" จริง ๆ หมายถึงอะไร?
ก่อนจะลงมือเขียนโค้ด เราควรทำความเข้าใจก่อนว่าคนส่วนใหญ่หมายถึงอะไรเวลาใช้คำว่า "scrape TikTok videos" เพราะคำนี้จริง ๆ ครอบคลุม 2 อย่างที่ต่างกันมาก:
- การดึง metadata ของวิดีโอ: คำบรรยาย แฮชแท็ก จำนวนไลก์ จำนวนคอมเมนต์ จำนวนแชร์ จำนวนวิว วันที่โพสต์ และข้อมูลผู้สร้าง ซึ่งเป็นสิ่งที่บทเรียนส่วนใหญ่มักจะเน้น
- การดาวน์โหลดไฟล์วิดีโอจริง (.mp4): การเก็บตัววิดีโอลงเครื่องของคุณ นี่คือสิ่งที่คนส่วนใหญ่ อยากได้จริง ๆ เมื่อพิมพ์ค้นหา "scrape TikTok videos" แต่แทบไม่มีใครอธิบายส่วนนี้
คู่มือนี้ครอบคลุมทั้งสองอย่าง ทุกวิธีด้านล่างสามารถดึง metadata ได้ และยังให้ URL สำหรับดาวน์โหลดไฟล์ .mp4 ที่คุณต้องใช้ด้วย
ทำไมต้องดึงข้อมูลวิดีโอ TikTok ด้วย Python?
เมื่อมี และ TikTok Shop สร้าง เหตุผลทางธุรกิจในการเข้าถึงข้อมูล TikTok จึงชัดเจนมาก ตัวอย่างการใช้งานที่ผมเจอบ่อยมีดังนี้:
| กรณีใช้งาน | สิ่งที่ดึงข้อมูล | เหมาะกับใคร |
|---|---|---|
| วิจัยอินฟลูเอนเซอร์และการตลาด | อัตราการมีส่วนร่วม จำนวนผู้ติดตาม รูปแบบคอนเทนต์ ประสิทธิภาพของแฮชแท็ก | ทีมการตลาด, เอเจนซี |
| วางกลยุทธ์คอนเทนต์ | แฮชแท็กที่กำลังมาแรง รูปแบบวิดีโอไวรัล ความถี่ในการโพสต์ | ครีเอเตอร์, ผู้จัดการโซเชียลมีเดีย |
| ติดตามแบรนด์ | การกล่าวถึงแบรนด์ การเข้าถึงแคมเปญ ความรู้สึกของผู้ชม | ผู้จัดการแบรนด์, ทีม PR |
| วิเคราะห์คู่แข่ง | ผลงานวิดีโอของคู่แข่ง ครีเอทีฟโฆษณา รายการสินค้าใน TikTok Shop | อีคอมเมิร์ซ, ทีมสินค้า |
| วิจัยตลาด | เทรนด์ที่กำลังเกิด พฤติกรรมผู้ชม การค้นพบสินค้าใหม่ | นักวิเคราะห์, เฮดจ์ฟันด์, บริษัทวิจัย |
| เก็บถาวรและการกำกับดูแล | ไฟล์วิดีโอสำหรับทบทวนภายในหรือเก็บหลักฐาน | ฝ่ายกฎหมาย, ทีมคอมพลายแอนซ์, เอเจนซี |
เดิมพันเชิงพาณิชย์นั้นสูงจริง ๆ: คาดว่ารายได้โฆษณาของ TikTok ในสหรัฐฯ จะอยู่ที่ 23.4 พันล้านดอลลาร์ในปี 2026 และครีเอเตอร์สายแอฟฟิลิเอตสร้างรายได้ ในหมวดสินค้าชั้นนำของ TikTok Shop หากคุณอยู่ในสายอีคอมเมิร์ซหรืออินฟลูเอนเซอร์มาร์เก็ตติ้ง ข้อมูลนี้มีมูลค่าเป็นตัวเงินโดยตรง
ทำไมโค้ด Python พื้นฐานของคุณถึงใช้ไม่ได้กับ TikTok
ถ้าคุณเคยลองอะไรทำนองนี้แล้วไม่สำเร็จ คุณไม่ได้โดดเดี่ยว:
1import requests
2from bs4 import BeautifulSoup
3resp = requests.get("https://www.tiktok.com/@someuser")
4soup = BeautifulSoup(resp.text, "html.parser")
5# ...แล้วก็ไม่มีอะไรที่ใช้ได้อยู่ใน HTML
เหตุผลนั้นตรงไปตรงมา: TikTok เป็นหนึ่งในแพลตฟอร์มที่ดึงข้อมูลยากที่สุด การใช้ requests.get() แบบธรรมดาจะได้ HTML เปล่า ๆ เป็นส่วนใหญ่ เพราะเนื้อหาจริงถูกเรนเดอร์ด้วย JavaScript ในเบราว์เซอร์ นอกจากนี้ TikTok ยังมีระบบป้องกันบอทที่เข้มข้นมาก ทั้งการตรวจพฤติกรรมการใช้งาน การ fingerprint ของ TLS, ที่ใช้สร้าง request signature และ selector CSS ที่เปลี่ยนไปโดยไม่มีการแจ้งล่วงหน้า

ตามรายงาน Imperva 2025 Bad Bot Report ปริมาณทราฟฟิกจากบอทแซงหน้าทราฟฟิกจากมนุษย์เป็นครั้งแรกในปี 2024 — ปัจจุบันบอทคิดเป็น TikTok รู้เรื่องนี้ดี และจึงสร้างระบบป้องกันไว้เข้มข้นตามไปด้วย
ด้านล่างคือตารางวิเคราะห์ปัญหาแบบเร็ว เพื่อช่วยให้คุณหาสาเหตุได้ว่ากำลังติดตรงไหน และควรไปใช้วิธีใด:
| อาการ | สาเหตุที่เป็นไปได้ | วิธีที่ช่วยแก้ |
|---|---|---|
| HTML ว่าง / ไม่มีข้อมูล | เนื้อหาเรนเดอร์ด้วย JS; requests รัน JavaScript ไม่ได้ | วิธีที่ 1 (Hidden JSON) หรือ วิธีที่ 3 (Playwright) |
| 403 / Access Denied | Header ไม่ครบหรือไม่ถูกต้อง; ระบบป้องกันบอทจับได้ | วิธีที่ 1 พร้อม header ที่ถูกต้อง |
| ใช้ได้ครั้งแรก แล้วหยุดทำงาน | ถูกจำกัดอัตรา / IP ถูกบล็อก | หมุน proxy (ทุกวิธี) |
| เจอ login wall | ต้องใช้ session/cookie | วิธีที่ 3 (เบราว์เซอร์ที่มี session ที่บันทึกไว้) |
| โค้ดจาก ChatGPT ไม่ได้ผลเลย | โครงสร้าง TikTok เปลี่ยนไปจากข้อมูลที่โมเดลเคยเรียนรู้ | ทั้ง 3 วิธี (แนวทางที่อัปเดตแล้ว) |
โดยทั่วไปจะเริ่มเจอการจำกัดที่ประมาณ 30–60 requests ต่อนาทีต่อ IP ก่อนจะโดนบล็อกแบบนุ่ม ๆ หรือเจอ CAPTCHA IP จากดาต้าเซ็นเตอร์จะถูกจับได้ภายในไม่กี่นาที — ถ้าทำในปริมาณมาก residential หรือ mobile proxy แทบจะจำเป็น
ภาพรวม: 3 วิธีในการดึงข้อมูลวิดีโอ TikTok ด้วย Python
นี่คือแผนภาพรวมของเรา แต่ละวิธีมีข้อดีข้อเสียต่างกัน และผมจะพาไล่ทีละวิธีพร้อมโค้ดที่ใช้งานได้จริง:
- Hidden JSON Extraction — แยกข้อมูลจาก script tag
__UNIVERSAL_DATA_FOR_REHYDRATION__ที่ฝังอยู่ในหน้า TikTok เร็วที่สุด ง่ายที่สุด และไม่ต้องใช้เบราว์เซอร์ - TikTok Internal API — เรียก endpoint ที่ไม่ค่อยมีการประกาศอย่าง
/api/post/item_list/โดยตรง เพื่อดึงข้อมูลจำนวนมากแบบ cursor-based pagination - Browser Automation with Playwright — เรนเดอร์หน้าในเบราว์เซอร์แบบ headless เพื่อรับมือกับ infinite scroll เนื้อหาไดนามิก และ login wall
ทั้งสามวิธีนี้ยังใช้ดาวน์โหลดไฟล์วิดีโอ .mp4 ได้ด้วย — ผมจะอธิบายในส่วนเฉพาะหลังจากสอนวิธีแต่ละแบบเสร็จ และจะมีตารางเปรียบเทียบละเอียดท้ายบทความเพื่อให้คุณตัดสินใจได้ง่ายขึ้น
วิธีที่ 1: ดึงข้อมูล TikTok ด้วย Hidden JSON (เหมาะกับมือใหม่)
นี่คือวิธีที่ผมแนะนำให้เริ่มก่อน TikTok ฝัง JSON ขนาดใหญ่ไว้ใน <script> tag ที่มี id เป็น __UNIVERSAL_DATA_FOR_REHYDRATION__ แทบทุกหน้าที่โหลด JSON ก้อนนี้มีข้อมูลโปรไฟล์และข้อมูลวิดีโอที่ฝั่งหน้าเว็บจะต้องเรนเดอร์อยู่แล้ว ซึ่งหมายความว่าคุณดึงมันได้ด้วย HTTP request เพียงครั้งเดียว ไม่ต้องเปิดเบราว์เซอร์เลย
สิ่งที่ต้องมี
- Python 3.8+
requests(หรือhttpx)beautifulsoup4(หรือparsel)- header ที่เหมาะสม:
User-Agent,Referer,Accept-Language
ติดตั้ง dependencies:
1pip install requests beautifulsoup4
ทีละขั้น: ดึงข้อมูลวิดีโอ TikTok จาก script tag
ขั้นที่ 1: ส่ง GET request พร้อม header แบบเหมือนเบราว์เซอร์จริง
นี่คือจุดที่มือใหม่พลาดบ่อยที่สุด ถ้าคุณส่ง requests.get() เปล่า ๆ โดยไม่มี header TikTok มักตอบกลับด้วย 403 หรือหน้า CAPTCHA คุณจึงควรใส่อย่างน้อย User-Agent ล่าสุดของเบราว์เซอร์ และ header Referer
1import requests
2from bs4 import BeautifulSoup
3import json
4> This paragraph contains content that cannot be parsed and has been skipped.
5resp = requests.get(url, headers=headers)
ขั้นที่ 2: แยก HTML และหา script tag ที่เก็บข้อมูล hydration
1soup = BeautifulSoup(resp.text, "html.parser")
2script_tag = soup.find("script", id="__UNIVERSAL_DATA_FOR_REHYDRATION__")
ถ้า script_tag เป็น None แปลว่า TikTok อาจบล็อกคุณไว้แล้ว (ตรวจ status code) หรือเปลี่ยน ID ของ tag (ซึ่งเกิดไม่บ่อยแต่ก็เป็นไปได้)
ขั้นที่ 3: โหลดเนื้อหาใน script ให้เป็น JSON
1data = json.loads(script_tag.string)
ขั้นที่ 4: ไล่โครงสร้าง JSON เพื่อดึง metadata ของวิดีโอ
โครงสร้างจะซ้อนอยู่ภายใต้ __DEFAULT_SCOPE__ สำหรับหน้าโปรไฟล์ผู้ใช้:
1user_detail = data["__DEFAULT_SCOPE__"]["webapp.user-detail"]
2user_info = user_detail["userInfo"]
3# สถิติโปรไฟล์
4stats = user_info["stats"]
5print(f"Followers: {stats['followerCount']}, Likes: {stats['heartCount']}")
6# รายการวิดีโอ (หน้าแรก)
7item_list = user_detail.get("itemList", [])
8for video in item_list:
9 print(video["desc"]) # คำบรรยาย
10 print(video["stats"]["playCount"]) # จำนวนวิว
11 print(video["video"]["playAddr"]) # URL ดาวน์โหลดวิดีโอ (ไม่มีลายน้ำ)
12 print(video["video"]["downloadAddr"]) # URL ดาวน์โหลดวิดีโอ (มีลายน้ำ)
ขั้นที่ 5: ดึง URL ดาวน์โหลดวิดีโอ
ฟิลด์ playAddr มักจะให้ไฟล์วิดีโอที่สะอาดกว่าเดิม (บ่อยครั้งไม่มีลายน้ำของ TikTok) ส่วน downloadAddr จะเป็นเวอร์ชันมาตรฐานที่มีลายน้ำ ทั้งสองเป็น URL ตรงไปยังไฟล์ .mp4 แต่ต้องใช้ header เฉพาะตอนดาวน์โหลด (จะอธิบายต่อในส่วนดาวน์โหลด)
ตอนนี้คุณควรได้รายการวัตถุ metadata ของวิดีโอ ซึ่งแต่ละรายการมีคำบรรยาย สถิติ เวลาโพสต์ แฮชแท็ก (อยู่ใน challenges[] และ textExtra) และ URL วิดีโอโดยตรง
ข้อจำกัดของวิธี Hidden JSON
- ดึงได้เฉพาะข้อมูลจากการโหลดหน้าแรก — โดยมากคือประมาณ 30 วิดีโอแรกบนโปรไฟล์
- รับมือ infinite scroll หรือ pagination ไม่ได้ (ไม่มี "next page" ให้เรียก)
- ถ้า TikTok เปลี่ยน ID ของ script tag หรือโครงสร้าง JSON ตัว parser จะพัง (เกิดขึ้นเป็นระยะ — ช่วยจับปัญหาได้เร็ว)
- เหมาะสำหรับ: ดึงข้อมูลโปรไฟล์แบบเร็ว ๆ งานครั้งเดียว หรือเมื่อคุณต้องการแค่วิดีโอล่าสุด
วิธีที่ 2: ดึงข้อมูล TikTok ผ่าน Internal API
ฝั่งหน้าเว็บของ TikTok ไม่ได้โหลดวิดีโอทั้งหมดพร้อมกัน — แต่มันจะยิง XHR ไปยัง internal API endpoint ระหว่างที่คุณเลื่อนหน้า จุดหลักสำหรับวิดีโอของผู้ใช้คือ /api/post/item_list/ คุณสามารถเรียก endpoint นี้จาก Python ได้โดยตรง ซึ่งจะได้ pagination แบบ cursor-based และเข้าถึงวิดีโอทั้งหมดในโปรไฟล์ได้ ไม่ใช่แค่หน้าแรก
จะหา Internal API Endpoint ได้อย่างไร
เปิด Chrome DevTools ที่หน้าโปรไฟล์ TikTok ไปที่แท็บ Network กรองด้วย XHR แล้วเลื่อนลง คุณจะเห็น request ไปยัง URL ประมาณนี้:
1https://www.tiktok.com/api/post/item_list/?WebIdLastTime=...&aid=1988&count=35&cursor=0&secUid=...
พารามิเตอร์สำคัญคือ:
secUid— ID เฉพาะของโปรไฟล์ (ดึงได้จาก JSON ในวิธีที่ 1 ภายใต้userInfo.user.secUid)cursor— ตำแหน่ง pagination (เริ่มที่0และแต่ละ response จะบอก cursor ถัดไป)count— จำนวนรายการต่อหน้า (โดยปกติ 30–35)
ทีละขั้น: เรียก TikTok Internal API ด้วย Python
ขั้นที่ 1: ดึง secUid ของโปรไฟล์เป้าหมาย
คุณดึงได้จาก hidden JSON (วิธีที่ 1) หรือจาก HTML ของหน้าโปรไฟล์
ขั้นที่ 2: สร้างและส่ง API request
1import requests
2import json
3> This paragraph contains content that cannot be parsed and has been skipped.
4resp = requests.get(api_url, params=params, headers=headers)
5data = resp.json()
ขั้นที่ 3: แยกข้อมูลใน response
แต่ละรายการใน data["itemList"] จะมีโครงสร้างวิดีโอแบบเดียวกับวิธีที่ 1 — เช่น desc, stats, video.playAddr, video.downloadAddr เป็นต้น
ขั้นที่ 4: วนดึงข้อมูลทุกหน้า
1all_videos = []
2cursor = 0
3has_more = True
4while has_more:
5 params["cursor"] = cursor
6 resp = requests.get(api_url, params=params, headers=headers)
7 data = resp.json()
8 items = data.get("itemList", [])
9 all_videos.extend(items)
10 has_more = data.get("hasMore", False)
11 cursor = data.get("cursor", 0)
12 print(f"Fetched {len(items)} videos, total: {len(all_videos)}, hasMore: {has_more}")
13print(f"Total videos scraped: {len(all_videos)}")
แต่ละรอบจะได้ชุดข้อมูลถัดไปพร้อม cursor ใหม่ วนต่อไปจน hasMore เป็น False
ข้อจำกัดของวิธี Internal API
- TikTok เปลี่ยน endpoint และพารามิเตอร์ที่ต้องใช้บ่อยมาก — นี่คือวิธีที่ดูแลยากที่สุด ในช่วงไม่กี่เดือนที่ผ่านมา request บางแบบเริ่มต้องใช้
msToken,X-Bogusหรือ signature parameter อื่น ๆ ที่ TikTok สร้างด้วย (สรุปคือ ถ้าจะทำ pure Python ให้เหมือนทั้งหมดนั้นไม่ง่าย) - อาจต้องใช้ session cookies หรือ token เพิ่มเติมสำหรับข้อมูลบางประเภท
- ยังมีการจำกัดอัตราตาม IP อยู่ — แนะนำให้หมุน proxy
- ถ้าเริ่มได้
itemListว่าง ๆ แปลว่าmsTokenของคุณน่าจะหมดอายุแล้ว (ในเบราว์เซอร์มันหมุนประมาณทุก 10 วินาที) - เหมาะสำหรับ: ดึงข้อมูลจำนวนมาก เมื่อคุณต้องการวิดีโอทั้งหมดจากโปรไฟล์ และข้อจำกัดของวิธีที่ 1 ที่ได้แค่หน้าแรกไม่พอ
วิธีที่ 3: ดึงข้อมูล TikTok ด้วย Playwright (Browser Automation)
เมื่อสองวิธีแรกติดกำแพง — ไม่ว่าจะเป็นข้อกำหนดล็อกอิน CAPTCHA หรือพารามิเตอร์ signature ที่ทำซ้ำไม่ได้ — Playwright คือทางเลือกสำรอง มันเปิดเบราว์เซอร์จริง (แบบ headless) แล้วเข้า TikTok เหมือนผู้ใช้ทั่วไป จึงรับมือการเรนเดอร์ JavaScript, infinite scroll และแม้แต่ session ที่ล็อกอินอยู่ได้
ตั้งค่า Playwright สำหรับการดึงข้อมูล TikTok
ติดตั้ง Playwright และ browser binaries:
1pip install playwright
2playwright install firefox
ผมแนะนำ Firefox มากกว่า Chromium สำหรับการ scrape TikTok เพราะจากการทดสอบของชุมชนพบว่า Firefox มี และระบบตรวจจับบอทของ TikTok ก็เข้มงวดเป็นพิเศษกับ headless browser ที่ใช้ Chromium
ถ้าต้องการ stealth เพิ่มเติม ลองจับคู่ Playwright กับ (fork ของ Playwright ที่ปรับแต่งแล้ว) หรือ (Firefox ที่ปรับระดับ C++ เพื่อหลบการตรวจจับ) ใน Camoufox ทำคะแนน stealth ใกล้เคียงสมบูรณ์แบบเมื่อเทียบกับบริการตรวจจับบอทหลัก ๆ
ทีละขั้น: ดึงวิดีโอโปรไฟล์ TikTok ด้วย Playwright
ขั้นที่ 1: เปิดเบราว์เซอร์ headless Firefox แล้วเข้าไปที่โปรไฟล์
1import asyncio
2from playwright.async_api import async_playwright
3import json
4> This paragraph contains content that cannot be parsed and has been skipped.
5 await page.goto(f"https://www.tiktok.com/@{username}", wait_until="networkidle")
ขั้นที่ 2: รอให้กริดวิดีโอโหลดขึ้นมา
1 # รอให้รายการวิดีโอปรากฏ
2 await page.wait_for_selector('[data-e2e="user-post-item"]', timeout=15000)
ถ้า TikTok แสดง overlay ข้อความ "Something went wrong" คุณอาจต้องกดปุ่มลองใหม่:
1 retry_btn = page.locator('button:has-text("Retry")')
2 if await retry_btn.count() > 0:
3 await retry_btn.click()
4 await page.wait_for_selector('[data-e2e="user-post-item"]', timeout=15000)
ขั้นที่ 3: ดึงข้อมูลจาก hidden JSON (แม้จะใช้เบราว์เซอร์ก็ตาม)
วิธีที่น่าเชื่อถือที่สุดยังคงเป็นการดึง hydration JSON แม้กำลังใช้เบราว์เซอร์อยู่:
1 script_el = page.locator("#__UNIVERSAL_DATA_FOR_REHYDRATION__")
2 raw_json = await script_el.inner_text()
3 data = json.loads(raw_json)
4 # ไล่ JSON แบบเดียวกับวิธีที่ 1
5 user_detail = data["__DEFAULT_SCOPE__"]["webapp.user-detail"]
6 videos = user_detail.get("itemList", [])
ขั้นที่ 4: จัดการ infinite scroll เพื่อดึงวิดีโอเพิ่ม
ถ้าคุณต้องการมากกว่า 30 วิดีโอแรก ให้เลื่อนลงและจับ response จาก XHR เพิ่มเติม:
1 all_videos = list(videos)
2 # ดักจับ API response ระหว่างที่เลื่อนหน้า
3 api_responses = []
4 async def capture_response(response):
5 if "/api/post/item_list" in response.url:
6 try:
7 body = await response.json()
8 api_responses.append(body)
9 except:
10 pass
11 page.on("response", capture_response)
12 # เลื่อนลงเพื่อกระตุ้นให้โหลดข้อมูลเพิ่ม
13 for _ in range(5): # ปรับจำนวนครั้งตามต้องการ
14 await page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
15 await asyncio.sleep(2)
16 # รวบรวมวิดีโอจาก response ที่ดักไว้
17 for api_resp in api_responses:
18 items = api_resp.get("itemList", [])
19 all_videos.extend(items)
20 print(f"Total videos: {len(all_videos)}")
21 await browser.close()
22 return all_videos
23# เรียกใช้งาน
24videos = asyncio.run(scrape_tiktok_profile("charlidamelio"))
ตอนนี้คุณควรได้รายการวัตถุวิดีโอจากทั้งหน้าแรกและหน้าที่เพิ่มมาระหว่างการเลื่อน
ข้อจำกัดของวิธี Playwright
- ช้าที่สุดในทั้งสามวิธี (ต้องเรนเดอร์หน้าเต็ม มี round-trip ของเครือข่าย และมีช่วงรอเลื่อนหน้า)
- ใช้ทรัพยากรมากกว่า — browser แต่ละ instance ใช้ RAM และ CPU ค่อนข้างสูง
- ยังเสี่ยงถูกบล็อกตาม IP เมื่อใช้งานในสเกลใหญ่ — ควรใช้ร่วมกับ proxy rotation
- เหมาะสำหรับ: งานที่มีการโต้ตอบซับซ้อน เนื้อหาที่มีกำแพงล็อกอิน รับมือ CAPTCHA หรือเมื่อติดข้อจำกัดของวิธีที่ 1 และ 2
วิธีดาวน์โหลดวิดีโอ TikTok (.mp4) ด้วย Python
นี่คือส่วนที่เป็นช่องว่างใหญ่ที่สุดในบทเรียน TikTok scraping ส่วนมาก การดึง metadata นั้นมีประโยชน์ แต่คนส่วนใหญ่ที่ค้นหา "scrape TikTok videos" ต้องการไฟล์วิดีโอจริง ๆ
TikTok ฝัง URL ดาวน์โหลดไว้ใน object ข้อมูลของวิดีโอ:
playAddr— มักเป็นเวอร์ชันไม่มีลายน้ำ หรือมีลายน้ำน้อยกว่าdownloadAddr— เวอร์ชันที่ TikTok ตั้งใจให้ดาวน์โหลดผ่านแอป โดยจะมีลายน้ำของ TikTok
ทั้งสอง URL มีอายุใช้งานสั้นและมักหมดอายุภายในไม่กี่ชั่วโมง ดังนั้นคุณควรดาวน์โหลดทันทีหลังจากดึง URL ออกมา
ทีละขั้น: ดาวน์โหลดไฟล์วิดีโอ TikTok
ขั้นที่ 1: ดึง URL วิดีโอจากหนึ่งใน 3 วิธีด้านบน
1video_url = video["video"]["playAddr"] # เวอร์ชันไม่มีลายน้ำ
2# หรือ
3video_url = video["video"]["downloadAddr"] # เวอร์ชันมีลายน้ำ
ขั้นที่ 2: ส่ง GET request พร้อม header ที่ถูกต้อง
นี่คือขั้นที่หลายคนพลาด ถ้าคุณแค่ requests.get(video_url) ตรง ๆ คุณจะเจอ 403 เพราะ TikTok ตรวจ Referer และคาดหวัง User-Agent ที่ดูเหมือนมาจากเบราว์เซอร์
1import requests
2> This paragraph contains content that cannot be parsed and has been skipped.
3resp = requests.get(video_url, headers=headers, stream=True)
ขั้นที่ 3: เขียน response ลงไฟล์ .mp4
ใช้ stream=True และเขียนเป็น chunks เพราะไฟล์วิดีโอ TikTok อาจมีขนาดใหญ่ และคุณไม่ควรโหลดทั้งไฟล์เข้า memory ทีเดียว:
1video_id = video["id"]
2filename = f"tiktok_{video_id}.mp4"
3with open(filename, "wb") as f:
4 for chunk in resp.iter_content(chunk_size=1024 * 1024): # chunks ขนาด 1MB
5 if chunk:
6 f.write(chunk)
7print(f"Downloaded: {filename}")
ตอนนี้คุณควรมีไฟล์ .mp4 ที่เปิดเล่นได้อยู่ในเครื่องแล้ว
ดาวน์โหลดแบบมีลายน้ำ vs ไม่มีลายน้ำ
TikTok เก็บทั้งเวอร์ชันมีลายน้ำและไม่มีลายน้ำของวิดีโอแต่ละคลิปไว้ playAddr มักให้ไฟล์ที่สะอาดกว่า (เป็นเวอร์ชันที่ตัวเล่นใช้) ส่วน downloadAddr จะมีลายน้ำของ TikTok พร้อมชื่อผู้สร้างทับอยู่
ขอพูดถึงประเด็นจริยธรรมสั้น ๆ ตรงนี้: ลายน้ำมีไว้เพื่อให้เครดิตผู้สร้าง ถ้าคุณดาวน์โหลดเพื่อการวิจัย การวิเคราะห์ หรือการทบทวนภายใน การใช้ playAddr โดยทั่วไปถือว่าเหมาะสม แต่ถ้าคุณนำไปเผยแพร่ต่อหรือโพสต์ซ้ำ การลบการอ้างอิงผู้สร้างย่อมกระทบทั้งเรื่องจริยธรรมและลิขสิทธิ์ รายละเอียดเพิ่มเติมอยู่ในส่วนกฎหมายด้านล่าง
ถ้าคุณต้องการ pipeline การดาวน์โหลดที่แข็งแรงกว่านี้ ลองใช้ เพราะ TikTok extractor ของมันจัดการเรื่อง signature และการแปลง URL ให้อัตโนมัติ คุณจึงไม่ต้องดูแล header และการหมดอายุของ token ด้วยตัวเอง
เปรียบเทียบแบบตัวต่อตัว: ควรใช้วิธี Python แบบไหน?
นี่คือตารางเปรียบเทียบที่ผมอยากมีตอนเริ่มทำโปรเจกต์ดึงข้อมูล TikTok ครั้งแรก:
This paragraph contains content that cannot be parsed and has been skipped.
คำแนะนำของผมคือ:
- ต้องการ snapshot เร็ว ๆ ของโปรไฟล์เดียว? เริ่มที่วิธีที่ 1 ตั้งค่าง่าย ใช้เวลาประมาณ 30 วินาที และได้ข้อมูลในเวลาต่ำกว่าหนึ่งวินาทีต่อหน้า
- ต้องการวิดีโอทั้งหมดของโปรไฟล์พร้อม pagination? ใช้วิธีที่ 2 แต่ต้องเตรียมรับมือการดูแลเมื่อ TikTok เปลี่ยนพารามิเตอร์ API
- เจอ login wall, CAPTCHA หรืออยากได้ความทนทานสูงสุด? วิธีที่ 3 ด้วย Playwright ช้ากว่าและใช้เครื่องมากกว่า แต่ TikTok บล็อกยากที่สุด
ในทางปฏิบัติ ผมมักเริ่มจากวิธีที่ 1 แล้วค่อยขยับไปวิธีที่ 2 หรือ 3 เมื่อเจอข้อจำกัด วิธีนี้ช่วยให้โครงสร้างพื้นฐานเรียบง่ายและค่าใช้จ่ายต่ำ
ถ้าไม่อยากใช้ Python: ดึงข้อมูล TikTok ด้วยเครื่องมือ No-Code
หลายคนที่ค้นหา "scrape TikTok videos with Python" จริง ๆ แล้วไม่ได้ต้องการ Python พวกเขาแค่ต้องการข้อมูล ถ้าคุณเป็นนักวิเคราะห์การตลาดที่อยากได้ metadata ของวิดีโอจากโปรไฟล์คู่แข่งไม่กี่อัน หรือเป็นผู้จัดการแบรนด์ที่ต้องติดตามการกล่าวถึงแบรนด์ การตั้งสภาพแวดล้อม Python พร้อม proxy rotation และการจัดการ signature อาจเกินความจำเป็น

นี่คือการเปรียบเทียบแบบตรงไปตรงมา:
| แนวทาง | ระดับทักษะ | ค่าใช้จ่าย | การดูแลรักษา | เหมาะสำหรับ |
|---|---|---|---|---|
| Python (ทำเอง) | ระดับกลางขึ้นไป | ฟรี (+ ค่า proxy) | สูง (สคริปต์พังบ่อย) | ควบคุมได้เต็มที่, pipeline แบบกำหนดเอง |
| Thunderbit (ส่วนขยาย Chrome) | มือใหม่ | มีแผนใช้ฟรี | ไม่มี (AI อ่านหน้าเว็บใหม่ทุกครั้ง) | ดึงข้อมูลวิดีโอเร็ว ๆ, ส่งออกไป Sheets/Excel |
| Apify TikTok Scraper | มือใหม่ | มีค่าใช้จ่าย (จ่ายตามรัน) | ต่ำ (Apify ดูแลให้) | รันอัตโนมัติปริมาณมากตามตาราง |
| TikAPI | นักพัฒนา | สมัครใช้งานแบบชำระเงิน | ปานกลาง | สร้างแอปบนข้อมูล TikTok |
Thunderbit จัดการการ scrape TikTok อย่างไร
คือ AI web scraper ที่เราสร้างขึ้น และมันทำงานต่างจากเครื่องมือ scraping แบบดั้งเดิม แทนที่จะพึ่ง CSS selector หรือ XPath ที่สร้างไว้ล่วงหน้า (ซึ่งพังทุกครั้งที่ TikTok เปลี่ยนหน้าตาเว็บ) AI ของ Thunderbit จะอ่านโครงสร้างหน้าใหม่ทุกครั้ง และแนะนำคอลัมน์ที่เกี่ยวข้อง เช่น คำบรรยาย จำนวนไลก์ แฮชแท็ก URL วิดีโอ ผู้สร้าง และอื่น ๆ
เวิร์กโฟลว์จริง ๆ มีแค่สองคลิก:
- เปิดหน้าโปรไฟล์ TikTok ใน Chrome คลิกส่วนขยาย Thunderbit แล้วกด "AI Suggest Fields" จากนั้น Thunderbit จะสแกนหน้าและเสนอรูปแบบตาราง
- ตรวจสอบคอลัมน์ที่แนะนำ ปรับถ้าจำเป็น แล้วคลิก "Scrape"
ข้อมูลส่งออกไปยัง Google Sheets, Excel, Airtable หรือ Notion ได้โดยตรง ไม่ต้องดูแล CSS selector, ไม่ต้อง debug โค้ด, ไม่ต้องตั้งค่า proxy สำหรับนักวิเคราะห์การตลาดที่ต้องการ metadata จากไม่กี่โปรไฟล์ วิธีนี้เร็วกว่าการตั้ง Python environment อย่างเห็นได้ชัด — และไม่พังเมื่อ TikTok ปรับ front-end (ซึ่งจากรายงานของชุมชนดูจะเกิดขึ้นทุกไม่กี่สัปดาห์)
Thunderbit ยังรองรับ ด้วย — มันสามารถเข้าไปในหน้าวิดีโอแต่ละคลิปเพื่อเติมรายละเอียดลงในตาราง เช่น จำนวนคอมเมนต์ทั้งหมด ข้อมูลเพลง หรือความยาววิดีโอ
คุณลองใช้ฟรีได้ผ่าน ถ้าอยากดูวิธีทำงานเพิ่มเติม ลองดู ของเรา
ข้อควรระวังด้านกฎหมายและจริยธรรมในการดึงข้อมูล TikTok
แทบไม่มีบทเรียนอันดับต้น ๆ ในหัวข้อนี้ที่พูดถึงเรื่องความถูกต้องตามกฎหมาย ซึ่งเป็นการละเลยเรื่องสำคัญ เพราะ TikTok เคยดำเนินคดีกับบริการ scraping อย่างจริงจัง นี่คือสิ่งที่คุณควรรู้
ข้อกำหนดการใช้งานของ TikTok (§ 4.1) ห้ามการเข้าถึงแบบอัตโนมัติโดยชัดเจน การละเมิด TOS คือการผิดสัญญา ไม่ใช่ความผิดอาญา — แต่ก็อาจนำไปสู่การแบนบัญชี การบล็อก IP หรือการฟ้องร้องทางแพ่งได้
ภูมิทัศน์ทางกฎหมายเปิดกว้างมากกว่าที่หลายคนคิดสำหรับข้อมูลสาธารณะ คดีสำคัญคือ Meta Platforms v. Bright Data (N.D. Cal., ม.ค. 2024) ซึ่งศาลตัดสินว่าการ scrape ข้อมูลสาธารณะที่เข้าถึงได้ขณะไม่ได้ล็อกอิน ไม่ได้ละเมิด Terms of Service ของ Meta ต่อมา Meta ถอนคดีและสละสิทธิ์อุทธรณ์ คำพิพากษา hiQ v. LinkedIn ในศาลอุทธรณ์เขต 9 (ยืนยันอีกครั้งหลัง Van Buren) วางหลักไว้ว่า การ scrape ข้อมูลสาธารณะที่เข้าถึงได้ไม่ถือเป็นการละเมิด CFAA — แม้ท้ายที่สุด hiQ จะยอมความ จ่าย 500,000 ดอลลาร์ และตกลงให้มี permanent injunction ซึ่งแสดงว่าการบังคับใช้ TOS ยังมีผลได้จริง
GDPR และ CCPA จะมีผลใช้บังคับหากคุณเก็บข้อมูลส่วนบุคคลจากผู้ใช้ในสหภาพยุโรปหรือแคลิฟอร์เนีย การ scrape โพสต์สาธารณะเป็นอีกเรื่องหนึ่ง แต่การสร้างฐานข้อมูลข้อมูลส่วนบุคคลของผู้ใช้รายบุคคลเป็นอีกเรื่องหนึ่งโดยสิ้นเชิง
แนวทางปฏิบัติที่ควรทำ:
- จำกัดอัตราคำขอของคุณ (อย่ายิงถี่ใส่เซิร์ฟเวอร์ TikTok)
- อย่าดึงข้อมูลจากบัญชีส่วนตัวหรือคอนเทนต์ของผู้เยาว์
- อย่านำวิดีโอที่มีลิขสิทธิ์ไปเผยแพร่ซ้ำเชิงพาณิชย์
- เคารพ
robots.txt(TikTok ปิดกั้นการ crawl อัตโนมัติส่วนใหญ่) - การดาวน์โหลดวิดีโอเพื่อการวิจัยหรือวิเคราะห์ส่วนตัว ต่างจากการเอาไปโพสต์ซ้ำ — ต้องแยกให้ออก
ข้อจำกัดความรับผิด: เนื้อหานี้มีไว้เพื่อการศึกษา ไม่ใช่คำปรึกษาทางกฎหมาย หากคุณกำลังสร้างผลิตภัณฑ์เชิงพาณิชย์บนข้อมูล TikTok ที่ดึงมา โปรดปรึกษาทนาย
สรุป: ประเด็นสำคัญที่ควรจำ
การดึงข้อมูล TikTok ในปี 2025 เป็นเป้าหมายที่เคลื่อนไหวตลอดเวลา ระบบป้องกันบอทของแพลตฟอร์มนี้ถือว่าโหดที่สุดชุดหนึ่งบนเว็บ และแนวทางแบบง่าย ๆ (requests ตรง ๆ, snippet จาก ChatGPT, บทเรียนที่ล้าสมัย) มักใช้ไม่ได้ แต่ถ้าใช้วิธีที่ถูกต้อง มันทำได้แน่นอน
สรุปที่ควรจำมีดังนี้:
- วิธีที่ 1 (Hidden JSON) เร็วและง่ายที่สุด — เริ่มจากวิธีนี้ถ้าจะดึงโปรไฟล์แบบเร็ว ๆ
- วิธีที่ 2 (Internal API) ให้ pagination และการเข้าถึงข้อมูลจำนวนมาก แต่ต้องดูแลมากที่สุดเมื่อ endpoint และ signature เปลี่ยน
- วิธีที่ 3 (Playwright) ทนต่อการป้องกันบอทได้ดีที่สุด แต่แลกกับความเร็วและการใช้ทรัพยากร
- ทั้ง 3 วิธี สามารถดึง URL สำหรับดาวน์โหลดวิดีโอได้ — และคู่มือนี้เป็นหนึ่งในไม่กี่บทความที่พาคุณไปถึงขั้นดาวน์โหลดไฟล์ .mp4 จริง ๆ พร้อม header ที่ถูกต้อง
- สำหรับผู้ใช้ที่ไม่ถนัดเทคนิค, เป็นทางลัดที่เร็วกว่าไปสู่ข้อมูลเดียวกัน โดยไม่ต้องเขียนหรือดูแลโค้ด การใช้ AI ทำให้มันไม่พังง่ายเมื่อ TikTok เปลี่ยนหน้าตาเว็บ — ซึ่งจากรายงานของชุมชน ดูเหมือนจะเกิดบ่อยกว่าที่ใครอยากให้เป็น
ถ้าคุณอยากเริ่มโดยไม่ต้องตั้งค่า Python เลย ลอง ได้ฟรีเพียงพอสำหรับทดสอบไม่กี่โปรไฟล์เพื่อดูว่าเข้ากับเวิร์กโฟลว์ของคุณไหม สำหรับคนที่เลือกเส้นทาง Python ให้เริ่มจากวิธีที่ 1 ตรวจสอบข้อมูลให้แน่ใจ แล้วค่อยขยายต่อไป
อยากลงลึกเรื่องเทคนิค web scraping มากกว่านี้ไหม? ลองดูคู่มือของเราเกี่ยวกับ , และ
คำถามที่พบบ่อย
การดึงข้อมูลวิดีโอ TikTok ด้วย Python ถูกกฎหมายไหม?
การดึงข้อมูลสาธารณะที่เข้าถึงได้อยู่ในโซนสีเทาทางกฎหมาย ไม่ได้ผิดชัดเจน คำตัดสิน Meta v. Bright Data (2024) สนับสนุนแนวคิดว่าการ scrape ข้อมูลสาธารณะโดยไม่ได้ล็อกอินไม่ละเมิด Terms of Service ของแพลตฟอร์ม อย่างไรก็ตาม TikTok ระบุชัดเจนว่าห้ามการเข้าถึงแบบอัตโนมัติ และ GDPR/CCPA ยังมีผลกับข้อมูลส่วนบุคคลด้วย มันไม่ใช่สิ่งผิดกฎหมายในแบบที่หลายคนกังวล แต่ก็ไม่ใช่ว่าปลอดความเสี่ยง ควรปรึกษาผู้เชี่ยวชาญด้านกฎหมายสำหรับกรณีของคุณโดยเฉพาะ
ไลบรารี Python ที่ดีที่สุดสำหรับการดึงข้อมูล TikTok คืออะไร?
ขึ้นอยู่กับแนวทางของคุณ ถ้าจะดึง Hidden JSON (วิธีที่ 1) requests + beautifulsoup4 ก็เพียงพอแล้ว ถ้าจะเรียก Internal API (วิธีที่ 2) ใช้ requests หรือ httpx ได้ดี สำหรับ browser automation (วิธีที่ 3) ตอนนี้ playwright คือมาตรฐานหลัก — ความนิยมในการใช้กับโปรเจกต์ scraping ใหม่ ๆ แซง Selenium ไปแล้ว โดยมี เทียบกับ Selenium ที่ราว 53 ล้านครั้ง TikTok-Api wrapper (~6.3K GitHub stars) ก็น่าพิจารณาหากคุณอยากได้อินเทอร์เฟซระดับสูงขึ้น แม้จะค่อนข้างเปราะบางก็ตาม
สามารถดาวน์โหลดวิดีโอ TikTok แบบไม่มีลายน้ำด้วย Python ได้ไหม?
ได้ TikTok มีข้อมูล playAddr ซึ่งโดยทั่วไปจะเป็น URL ของวิดีโอเวอร์ชันที่ไม่มีลายน้ำมาตรฐาน คู่มือนี้แสดงวิธีดึง URL ดังกล่าวจากทั้ง 3 วิธีและดาวน์โหลดไฟล์ .mp4 ด้วย header ที่ถูกต้อง ส่วน downloadAddr จะเป็นเวอร์ชันที่มีลายน้ำ
ทำไม scraper ของฉันถึงได้ข้อมูลว่างจาก TikTok?
สาเหตุที่พบบ่อยที่สุดคือ TikTok ต้องใช้ JavaScript ในการเรนเดอร์เนื้อหา requests.get() แบบธรรมดาจะดึงได้แค่ HTML เปลือกนอก — ข้อมูลจริงจะอยู่ใน script tag แบบ hidden JSON (วิธีที่ 1) หรือถูกโหลดแบบไดนามิกผ่าน JavaScript (วิธีที่ 3) ถ้าคุณเจอ HTML ว่าง ลองวิธีที่ 1 ก่อน ถ้าไม่ได้ ให้ตรวจ header ของคุณ (การขาด Referer คือสาเหตุอันดับหนึ่งของ 403) หรือขยับไปวิธีที่ 3 ด้วย Playwright
จะหลีกเลี่ยงการถูกบล็อกตอน scrape TikTok ได้อย่างไร?
ใช้ header ที่เหมือนเบราว์เซอร์จริง (รวม User-Agent, Referer, และ Accept-Language), หมุน residential หรือ mobile proxy (IP จากดาต้าเซ็นเตอร์มักถูกจับได้ภายในไม่กี่นาที), ใส่เวลาหน่วงแบบสุ่มระหว่าง request (อย่างน้อย 1–3 วินาที) และอย่าดึงข้อมูลปริมาณสูงแบบรุนแรง วิธีที่ 3 (Playwright) มีความทนทานต่อการบล็อกสูงสุด เพราะมันเลียนแบบ session ของเบราว์เซอร์จริง สำหรับงานที่มีปริมาณจริงจัง ควรเผื่อค่า proxy ไว้ด้วย — residential proxy ระดับเริ่มต้นจากผู้ให้บริการรายใหญ่มีราคาอยู่ราว
- เรียนรู้เพิ่มเติม