เรียนรู้วิธีดึงวิดีโอ TikTok ด้วย Python

อัปเดตล่าสุดเมื่อ April 14, 2026

ปัจจุบัน 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" จริง ๆ หมายถึงอะไร?

ก่อนจะลงโค้ด มาทำความเข้าใจกันก่อนว่าคนส่วนใหญ่หมายถึงอะไรเมื่อพูดว่า “scrape TikTok videos” เพราะคำนี้ครอบคลุมอยู่ 2 เรื่องที่ต่างกันมาก:

  1. ดึงข้อมูล metadata ของวิดีโอ: คำบรรยาย แฮชแท็ก ยอดไลก์ ยอดคอมเมนต์ ยอดแชร์ ยอดวิว วันที่โพสต์ ข้อมูลผู้สร้าง ซึ่งเป็นสิ่งที่บทความสอนส่วนใหญ่มักโฟกัส
  2. ดาวน์โหลดไฟล์วิดีโอจริง (.mp4): เซฟไฟล์วิดีโอลงเครื่องคุณโดยตรง นี่คือสิ่งที่คนส่วนใหญ่มัก ต้องการจริง ๆ เวลาเสิร์ชว่า “scrape TikTok videos” — แต่แทบไม่มีใครสอนส่วนนี้

คู่มือนี้ครอบคลุมทั้งสองแบบ ทุกวิธีด้านล่างสามารถดึง metadata ได้ และยังให้ URL สำหรับดาวน์โหลดไฟล์ .mp4 ด้วย

ทำไมต้องดึงวิดีโอ TikTok ด้วย Python?

ด้วย และ TikTok Shop ที่สร้างรายได้โฆษณาทั่วโลกมากกว่า เหตุผลทางธุรกิจในการเข้าถึงข้อมูล TikTok จึงมีน้ำหนักมาก นี่คือ use case ที่ผมเจอบ่อยที่สุด:

| Use Case | สิ่งที่คุณกำลังดึง | เหมาะกับใคร | |---|---|---| | การวิจัยอินฟลูเอนเซอร์และการตลาด | อัตราการมีส่วนร่วม จำนวนผู้ติดตาม รูปแบบคอนเทนต์ ประสิทธิภาพของแฮชแท็ก | ทีมการตลาด, เอเจนซี | | กลยุทธ์คอนเทนต์ | แฮชแท็กที่กำลังมาแรง รูปแบบวิดีโอไวรัล ความถี่ในการโพสต์ | ครีเอเตอร์, โซเชียลมีเดียแมนเนเจอร์ | | ติดตามแบรนด์ | การกล่าวถึง ระยะการเข้าถึงแคมเปญ ความรู้สึกของผู้ชม | แบรนด์แมนเนเจอร์, ทีม PR | | สืบค้นข้อมูลคู่แข่ง | ประสิทธิภาพวิดีโอคู่แข่ง ครีเอทีฟโฆษณา รายการสินค้าใน TikTok Shop | อีคอมเมิร์ซ, ทีมสินค้า | | วิจัยตลาด | เทรนด์ใหม่ ๆ พฤติกรรมผู้ชม การค้นพบสินค้า | นักวิเคราะห์, กองทุนเฮดจ์ฟันด์, บริษัทวิจัย | | เก็บถาวรและการปฏิบัติตามข้อกำหนด | ไฟล์วิดีโอสำหรับตรวจสอบภายในหรือเก็บบันทึก | ฝ่ายกฎหมาย, ฝ่ายคอมพลายแอนซ์, เอเจนซี |

ผลประโยชน์เชิงพาณิชย์มีอยู่จริง: รายได้โฆษณา TikTok ในสหรัฐฯ คาดว่าจะสูงถึง 23.4 พันล้านดอลลาร์ในปี 2026 และครีเอเตอร์สาย affiliate สร้างรายได้ ในหมวด 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 เป็นหนึ่งในแพลตฟอร์มที่ scrape ยากที่สุด การใช้ requests.get() แบบพื้นฐานจะได้ HTML เปล่า ๆ เป็นโครง shell เพราะเนื้อหาจริงถูกเรนเดอร์ด้วย JavaScript ในเบราว์เซอร์ นอกจากนี้ TikTok ยังมีระบบป้องกันบอทที่เข้มมาก ทั้งการตรวจจับพฤติกรรม, TLS fingerprinting, ที่สร้าง request signature และ CSS selector แบบไดนามิกที่เปลี่ยนโดยไม่แจ้งล่วงหน้า

tiktok-anti-bot-wall.webp

ตามรายงาน Imperva 2025 Bad Bot Report ทราฟฟิกจากอัตโนมัติแซงหน้าทราฟฟิกจากมนุษย์เป็นครั้งแรกในปี 2024 โดยบอทคิดเป็น TikTok รู้เรื่องนี้ดีและออกแบบระบบป้องกันไว้แน่นหนา

นี่คือตารางวิเคราะห์เบื้องต้นเพื่อช่วยหาว่าอะไรพัง และควรข้ามไปใช้วิธีไหน:

| อาการ | สาเหตุที่เป็นไปได้ | วิธีที่ช่วยแก้ | |---|---|---| | HTML ว่าง / ไม่มีข้อมูล | เนื้อหาถูกเรนเดอร์ด้วย JS; requests รัน JavaScript ไม่ได้ | วิธีที่ 1 (Hidden JSON) หรือ วิธีที่ 3 (Playwright) | | 403 / Access Denied | Header ไม่ครบหรือไม่ถูกต้อง; ถูกระบบ anti-bot ตรวจจับ | วิธีที่ 1 พร้อม header ที่เหมาะสม | | ใช้ได้ครั้งแรกแล้วหยุด | ถูกจำกัดอัตรา / IP ถูกบล็อก | ใช้ proxy rotation (ทุกวิธี) | | เจอ login wall | ต้องใช้ session/cookie | วิธีที่ 3 (เบราว์เซอร์ที่มี session ที่บันทึกไว้) | | โค้ดที่ ChatGPT สร้างมาไม่คืนค่าอะไรเลย | โครงสร้าง TikTok เปลี่ยนไปหลังข้อมูลที่โมเดลเคยเรียนรู้ | ทั้ง 3 วิธี (แนวทางอัปเดต) |

จุดจำกัดอัตราการใช้งานอยู่ราว 30–60 requests ต่อนาทีต่อ IP ก่อนจะเริ่มเจอ soft block หรือ CAPTCHA ถ้าเป็น IP ของดาต้าเซ็นเตอร์จะโดนจับได้ภายในไม่กี่นาที ดังนั้น proxy แบบ residential หรือ mobile แทบจะจำเป็นถ้าต้องทำในปริมาณมาก

ภาพรวม: 3 วิธีในการดึงวิดีโอ TikTok ด้วย Python

นี่คือแผนที่นำทาง แต่ละวิธีมีข้อดีข้อเสียต่างกัน และผมจะพาไล่ครบทั้ง 3 แบบพร้อมโค้ดที่ใช้งานได้จริง:

  1. Hidden JSON Extraction — แยกข้อมูลจาก script tag __UNIVERSAL_DATA_FOR_REHYDRATION__ ที่ฝังอยู่ในหน้า TikTok เร็วที่สุด ง่ายที่สุด และไม่ต้องเปิดเบราว์เซอร์
  2. TikTok's Internal API — เรียก endpoint /api/post/item_list/ ที่ไม่ได้ประกาศอย่างเป็นทางการโดยตรง เพื่อดึงข้อมูลจำนวนมากพร้อม pagination แบบ cursor
  3. Browser Automation with Playwright — เรนเดอร์หน้าเว็บใน headless browser เพื่อรับมือกับ infinite scroll, content แบบไดนามิก และ login wall

ทั้ง 3 วิธีนี้ยังใช้ดาวน์โหลดไฟล์ .mp4 จริงได้ด้วย — ผมจะอธิบายส่วนนี้ในหัวข้อแยกต่างหากหลังจบ walkthrough ของแต่ละวิธี และท้ายสุดจะมีตารางเปรียบเทียบแบบเต็มให้ตัดสินใจได้ง่ายขึ้น

วิธีที่ 1: ดึงวิดีโอ TikTok ด้วย Hidden JSON (เหมาะกับมือใหม่)

นี่คือวิธีที่ผมแนะนำให้เริ่มก่อน TikTok ฝัง JSON ก้อนใหญ่ไว้ใน <script> tag ที่มี id เป็น __UNIVERSAL_DATA_FOR_REHYDRATION__ บนหน้าแทบทุกหน้า JSON นี้มีข้อมูลโปรไฟล์และข้อมูลวิดีโอทั้งหมดที่ JavaScript ฝั่งหน้าเว็บจะเอาไปแสดง ซึ่งหมายความว่าคุณดึงได้ด้วย 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 พร้อม browser headers ที่ดูสมจริง

นี่คือจุดที่มือใหม่พลาดบ่อยที่สุด ถ้าคุณส่ง requests.get() เปล่า ๆ โดยไม่มี headers TikTok มักตอบกลับด้วย 403 หรือหน้า CAPTCHA คุณต้องมีอย่างน้อย User-Agent ของเบราว์เซอร์ปัจจุบัน และ header Referer

1import requests
2from bs4 import BeautifulSoup
3import json
4url = "https://www.tiktok.com/@charlidamelio"
5headers = {
6    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
7    "Referer": "https://www.tiktok.com/",
8    "Accept-Language": "en-US,en;q=0.9",
9}
10resp = requests.get(url, headers=headers)

ขั้นที่ 2: Parse HTML แล้วหา hydration script tag

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 จะมีลายน้ำมาตรฐานของ TikTok ทั้งสองอันเป็น URL ตรงไปยังไฟล์ .mp4 แต่ต้องใช้ header ที่ถูกต้องเพื่อดาวน์โหลด (อธิบายในส่วนดาวน์โหลดด้านล่าง)

ตอนนี้คุณควรได้ list ของวัตถุ metadata ของวิดีโอแต่ละรายการ ซึ่งมีทั้ง caption, stats, เวลาเผยแพร่, แฮชแท็ก (ใน challenges[] และ textExtra) และ URL วิดีโอโดยตรง

ข้อจำกัดของวิธี Hidden JSON

  • ดึงได้เฉพาะข้อมูลจากหน้าโหลดครั้งแรก — โดยทั่วไปจะได้เพียงประมาณ 30 วิดีโอแรกของโปรไฟล์
  • ไม่รองรับ infinite scroll หรือ pagination แบบต่อเนื่อง (ไม่มีหน้า “ถัดไป” ให้เรียก)
  • ถ้า TikTok เปลี่ยน id ของ script tag หรือโครงสร้าง JSON ตัว parser จะพัง (เกิดขึ้นเป็นระยะ — ช่วยจับปัญหาได้เร็ว)
  • เหมาะกับ: การ scrape โปรไฟล์แบบเร็ว ๆ งานดึงข้อมูลครั้งเดียว หรือกรณีที่ต้องการแค่วิดีโอล่าสุด

วิธีที่ 2: ดึงวิดีโอ TikTok ผ่าน Internal API

ฝั่งหน้าเว็บของ TikTok ไม่ได้โหลดวิดีโอทั้งหมดทีเดียว แต่จะเรียก XHR ไปยัง internal API endpoint ระหว่างที่คุณเลื่อนหน้า API หลักสำหรับวิดีโอของผู้ใช้คือ /api/post/item_list/ คุณสามารถเรียก endpoint นี้จาก Python โดยตรง ซึ่งจะได้ pagination แบบ cursor และเข้าถึงวิดีโอทั้งหมดในโปรไฟล์ ไม่ใช่แค่หน้าแรก

จะหา endpoint Internal API ได้อย่างไร

เปิด Chrome DevTools บนหน้าโปรไฟล์ TikTok ไปที่แท็บ Network กรองด้วย XHR แล้วเลื่อนลง คุณจะเห็น request ไปยัง URL ประมาณนี้:

1https://www.tiktok.com/api/post/item_list/?WebIdLastTime=...&aid=1988&count=35&cursor=0&secUid=...

พารามิเตอร์สำคัญคือ:

  • secUid — รหัสเฉพาะของโปรไฟล์ (ดึงได้จาก JSON ของวิธีที่ 1 ภายใต้ userInfo.user.secUid)
  • cursor — ตำแหน่ง pagination (เริ่มที่ 0 และแต่ละ response จะส่งค่าคิวเซอร์ถัดไปกลับมา)
  • count — จำนวนรายการต่อหน้า (โดยทั่วไป 30–35)

ทีละขั้น: เรียก Internal API ของ TikTok ด้วย Python

ขั้นที่ 1: ดึง secUid ของโปรไฟล์เป้าหมาย

คุณดึงได้จาก hidden JSON (วิธีที่ 1) หรือจาก HTML ของหน้าโปรไฟล์

ขั้นที่ 2: สร้างและส่ง API request

1import requests
2import json
3sec_uid = "MS4wLjABAAAA..."  # มาจากวิธีที่ 1
4api_url = "https://www.tiktok.com/api/post/item_list/"
5params = {
6    "aid": "1988",
7    "secUid": sec_uid,
8    "count": 35,
9    "cursor": 0,
10}
11headers = {
12    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
13    "Referer": "https://www.tiktok.com/",
14}
15resp = requests.get(api_url, params=params, headers=headers)
16data = resp.json()

ขั้นที่ 3: Parse response

แต่ละรายการใน data["itemList"] จะมีโครงสร้างวิดีโอเหมือนกับวิธีที่ 1 เช่น desc, stats, video.playAddr, video.downloadAddr เป็นต้น

ขั้นที่ 4: วน pagination เพื่อดึงวิดีโอทั้งหมด

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 อื่น ๆ ที่ TikTok สร้างด้วย (พูดง่าย ๆ คือการจำลองด้วย Python ล้วน ๆ ไม่ง่ายเลย)
  • บางข้อมูลอาจต้องใช้ session cookie หรือ token เพิ่มเติม
  • ยังมีการจำกัดด้วย IP-based rate limiting อยู่ — แนะนำให้ใช้ proxy rotation
  • ถ้าเริ่มได้ itemList ว่างเปล่า แปลว่า msToken อาจหมดอายุแล้ว (ในเบราว์เซอร์จะหมุนใหม่ประมาณทุก 10 วินาที)
  • เหมาะกับ: การดึงข้อมูลจำนวนมากเมื่อคุณต้องการวิดีโอทั้งหมดในโปรไฟล์ และข้อจำกัดแบบหน้าแรกของวิธีที่ 1 ใช้ไม่ได้

วิธีที่ 3: ดึงวิดีโอ TikTok ด้วย Playwright (Browser Automation)

เมื่อสองวิธีแรกติดกำแพง — ไม่ว่าจะเป็น login requirement, CAPTCHA หรือพารามิเตอร์ signature ที่จำลองไม่ได้ — Playwright คือทางสำรอง มันเปิดเบราว์เซอร์จริง (แบบ headless) แล้วเข้า TikTok เหมือนผู้ใช้ทั่วไป จึงรับมือกับการเรนเดอร์ JavaScript, infinite scroll และ session ที่ล็อกอินไว้แล้วได้

การตั้งค่า Playwright สำหรับการ scrape TikTok

ติดตั้ง Playwright และ browser binaries:

1pip install playwright
2playwright install firefox

ผมแนะนำให้ใช้ Firefox มากกว่า Chromium สำหรับการ scrape TikTok เพราะการทดสอบจากชุมชนมักพบว่า และระบบตรวจจับบอทของ TikTok ก็มักเข้มกับ headless browser ที่อิง Chromium เป็นพิเศษ

ถ้าต้องการ stealth เพิ่มเติม ลองจับคู่ Playwright กับ (fork ของ Playwright ที่ถูกปรับแต่ง) หรือ (Firefox ที่ดัดแปลงระดับ C++ เพื่อหลบ detection) ใน Camoufox ทำคะแนน stealth ได้เกือบสมบูรณ์เมื่อเทียบกับบริการตรวจจับบอทหลัก ๆ

ทีละขั้น: scrape วิดีโอโปรไฟล์ TikTok ด้วย Playwright

ขั้นที่ 1: เปิดเบราว์เซอร์ Firefox แบบ headless แล้วเข้าไปที่โปรไฟล์

1import asyncio
2from playwright.async_api import async_playwright
3import json
4async def scrape_tiktok_profile(username):
5    async with async_playwright() as p:
6        browser = await p.firefox.launch(headless=True)
7        context = await browser.new_context(
8            user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0",
9            viewport={"width": 1280, "height": 720},
10        )
11        page = await context.new_page()
12        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” คุณอาจต้องกดปุ่ม retry:

1        retry_btn = page.locator('button:has-text("Retry")')
2        if await retry_btn.count() &gt; 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 ระหว่างที่ scroll
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"))

ตอนนี้คุณควรได้ list ของวิดีโอจากทั้งการโหลดหน้าแรกและหน้าเพิ่มเติมที่มาจากการ scroll

ข้อจำกัดของวิธี Playwright

  • ช้าที่สุดเมื่อเทียบกับวิธีอื่น ๆ (ต้องเรนเดอร์ทั้งหน้า มี round-trip ของเครือข่าย และต้องรอ scroll)
  • ใช้ทรัพยากรสูงกว่า — browser instance แต่ละตัวใช้ RAM และ CPU มาก
  • ยังเสี่ยงโดนบล็อกเมื่อใช้ในปริมาณมาก — ควรจับคู่กับ proxy rotation
  • เหมาะกับ: งานที่ซับซ้อน, เนื้อหาที่อยู่หลัง login wall, การรับมือ CAPTCHA หรือเมื่อวิธีที่ 1 และ 2 ถูกบล็อก

วิธีดาวน์โหลดวิดีโอ TikTok (.mp4) ด้วย Python

นี่คือส่วนที่เติมช่องว่างที่บทความสอน scrape TikTok ส่วนใหญ่มักข้ามไป การดึง metadata มีประโยชน์ก็จริง แต่คนส่วนใหญ่ที่ค้นคำว่า “scrape TikTok videos” ต้องการไฟล์วิดีโอจริง

TikTok ฝัง URL สำหรับดาวน์โหลดไว้ใน object ข้อมูลวิดีโอ:

  • playAddr — โดยทั่วไปคือเวอร์ชันที่ไม่มีลายน้ำ หรือมีลายน้ำน้อยกว่า
  • downloadAddr — เวอร์ชันที่ TikTok ตั้งใจให้ใช้ดาวน์โหลดในแอป ซึ่งจะมีลายน้ำของ TikTok ซ้อนอยู่

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
2headers = {
3    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
4    "Referer": "https://www.tiktok.com/",
5}
6resp = requests.get(video_url, headers=headers, stream=True)

ขั้นที่ 3: เขียน response ลงไฟล์ .mp4

ใช้ stream=True และเขียนแบบ chunk เพราะวิดีโอ TikTok อาจมีขนาดใหญ่ และคุณไม่ควรโหลดทั้งไฟล์เข้าหน่วยความจำทีเดียว:

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):  # chunk ละ 1MB
5        if chunk:
6            f.write(chunk)
7print(f"Downloaded: {filename}")

ตอนนี้คุณควรได้ไฟล์ .mp4 ที่เปิดเล่นได้บนเครื่องคุณแล้ว

ดาวน์โหลดแบบมีลายน้ำ vs ไม่มีลายน้ำ

TikTok เก็บทั้งเวอร์ชันมีลายน้ำและไม่มีลายน้ำของวิดีโอแต่ละคลิปไว้ playAddr มักให้เวอร์ชันที่สะอาดกว่า (เวอร์ชันที่ player ใช้) ในขณะที่ downloadAddr จะมีลายน้ำ TikTok พร้อมชื่อผู้สร้าง

ข้อสังเกตด้านจริยธรรม: ลายน้ำมีไว้เพื่อให้เครดิตผู้สร้าง หากคุณดาวน์โหลดเพื่อการวิจัย วิเคราะห์ หรือใช้ภายใน การใช้ playAddr โดยทั่วไปถือว่าเหมาะสม แต่ถ้าคุณจะนำไปเผยแพร่ต่อหรือโพสต์ซ้ำ การลบเครดิตผู้สร้างอาจกระทบทั้งจริยธรรมและลิขสิทธิ์ โปรดดูรายละเอียดในหัวข้อกฎหมายด้านล่าง

ถ้าต้องการ pipeline ดาวน์โหลดที่เสถียรกว่านี้ ลองใช้ — TikTok extractor ของมันจัดการเรื่อง signature math และการแก้ URL ให้อัตโนมัติ คุณจึงไม่ต้องดูแลเรื่อง header และ token ที่หมดอายุเอง

เปรียบเทียบแบบตัวต่อตัว: ควรใช้วิธี Python แบบไหน?

นี่คือตารางเปรียบเทียบที่ผมอยากมีตอนเริ่มทำโปรเจกต์ TikTok scraping:

| เกณฑ์ | วิธีที่ 1: Hidden JSON | วิธีที่ 2: Internal API | วิธีที่ 3: Playwright | |---|---|---|---| | ความยาก | มือใหม่ | กลาง | กลาง | | ความเร็ว | เร็ว (1 request ต่อหน้า) | เร็ว (JSON API) | ช้า (เรนเดอร์ทั้งหน้า) | | ทนต่อ anti-bot | ปานกลาง | ต่ำ (endpoint เปลี่ยนบ่อย) | สูง (เลียนแบบเบราว์เซอร์จริง) | | ดาวน์โหลด .mp4 ได้ไหม | ได้ (ดึง playAddr) | ได้ (URL อยู่ใน response) | ได้ (ดักจับ network) | | รองรับ infinite scroll | ไม่ได้ (เฉพาะหน้าแรก) | ได้ (cursor pagination) | ได้ (จำลองการ scroll) | | ต้องใช้ proxy ตอนสเกลใหญ่ไหม | ใช่ | ใช่ | ใช่ | | ภาระการดูแล | ปานกลาง (JSON structure เปลี่ยน) | สูง (endpoint/signature เปลี่ยนบ่อย) | ต่ำ-ปานกลาง (เบราว์เซอร์ปรับตัวได้) | | เหมาะกับ | scrape โปรไฟล์แบบเร็ว ๆ | ดึงข้อมูลจำนวนมาก, ทุกวิดีโอ | เนื้อหาหลัง login wall หรือข้อมูลซับซ้อน |

คำแนะนำของผม:

  • ต้องการดูภาพรวมเร็ว ๆ ของโปรไฟล์เดียว? เริ่มที่วิธีที่ 1 ใช้เวลาตั้งค่าประมาณ 30 วินาที และได้ข้อมูลภายในไม่ถึง 1 วินาทีต่อหน้า
  • ต้องการวิดีโอทั้งหมดจากโปรไฟล์แบบมี 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-vs-nocode-ai-comparison.webp

นี่คือการเปรียบเทียบแบบตรงไปตรงมา:

| แนวทาง | ระดับทักษะ | ต้นทุน | การดูแลรักษา | เหมาะกับ | |---|---|---|---|---| | Python (ทำเอง) | ระดับกลางขึ้นไป | ฟรี (+ ค่า proxy) | สูง (สคริปต์พังบ่อย) | ควบคุมได้เต็มที่, pipeline แบบกำหนดเอง | | (Chrome extension) | มือใหม่ | มีแผนใช้ฟรี | ไม่มี (AI อ่านหน้าเว็บใหม่ทุกครั้ง) | ดึงข้อมูลวิดีโอเร็ว ๆ, ส่งออกไป Sheets/Excel | | Apify TikTok Scraper | มือใหม่ | มีค่าใช้จ่าย (คิดตามรัน) | ต่ำ (มีคนดูแลให้) | งานอัตโนมัติแบบจำนวนมากและตั้งเวลาได้ | | TikAPI | นักพัฒนา | สมัครสมาชิกแบบเสียเงิน | ปานกลาง | สร้างแอปที่ต่อยอดจากข้อมูล TikTok |

Thunderbit จัดการ TikTok scraping อย่างไร

คือ AI web scraper ที่เราสร้างขึ้น และทำงานต่างจากเครื่องมือ scrape แบบเดิม แทนที่จะพึ่ง CSS selector หรือกฎ XPath ที่ตั้งไว้ล่วงหน้า (ซึ่งพังทุกครั้งที่ TikTok เปลี่ยนเลย์เอาต์) AI ของ Thunderbit จะอ่านโครงสร้างหน้าใหม่ทุกครั้ง แล้วเสนอคอลัมน์ที่เหมาะสม เช่น คำบรรยาย ยอดไลก์ แฮชแท็ก URL วิดีโอ ผู้สร้าง และอื่น ๆ

เวิร์กโฟลว์นี้ง่ายจริง ๆ แค่สองคลิก:

  1. เปิดหน้าโปรไฟล์ TikTok ใน Chrome คลิกส่วนขยาย Thunderbit แล้วกด “AI Suggest Fields” Thunderbit จะสแกนหน้าและเสนอ table structure ให้
  2. ตรวจสอบคอลัมน์ที่แนะนำ ปรับถ้าจำเป็น แล้วกด “Scrape”

ข้อมูลสามารถ export ไปยัง Google Sheets, Excel, Airtable หรือ Notion ได้โดยตรง ไม่มี CSS selector ให้ดูแล ไม่มีโค้ดให้ debug และไม่ต้องตั้งค่า proxy สำหรับนักวิเคราะห์การตลาดที่ต้องการ metadata จากไม่กี่โปรไฟล์ นี่เร็วกว่าเซ็ตอัป Python อย่างเห็นได้ชัด — และไม่พังเมื่อ TikTok อัปเดต front-end (ซึ่งจากรายงานของชุมชนดูเหมือนจะเกิดขึ้นทุกไม่กี่สัปดาห์)

Thunderbit ยังรองรับ ได้ด้วย — มันสามารถเข้าไปในหน้าวิดีโอแต่ละคลิปเพื่อเติมข้อมูลในตารางของคุณ เช่น จำนวนคอมเมนต์เต็ม ๆ ข้อมูลเพลง หรือระยะเวลาวิดีโอ

คุณลองใช้ฟรีได้ผ่าน สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการทำงานของมัน ดูได้ที่

ข้อควรระวังด้านกฎหมายและจริยธรรมในการ scrape TikTok

บทความอันดับต้น ๆ เกือบไม่มีบทไหนพูดเรื่องความถูกต้องทางกฎหมาย ซึ่งถือว่าสำคัญมาก เพราะ TikTok เคยดำเนินคดีทางกฎหมายกับบริการ scraping มาแล้ว นี่คือสิ่งที่คุณควรรู้

Terms of Service ของ TikTok (§ 4.1) ระบุชัดว่าห้ามเข้าถึงด้วยระบบอัตโนมัติ การละเมิด TOS เป็นการผิดสัญญา ไม่ใช่อาชญากรรม — แต่ก็อาจนำไปสู่การถูกแบนบัญชี, บล็อก IP หรือการดำเนินคดีทางแพ่ง

ภาพรวมทางกฎหมายเปิดกว้างกว่าที่หลายคนคิดเมื่อเป็นข้อมูลสาธารณะ ตัวอย่างสำคัญคือคดี Meta Platforms v. Bright Data (N.D. Cal., ม.ค. 2024) ซึ่งศาลวินิจฉัยว่าการ scrape ข้อมูลสาธารณะที่เข้าถึงได้ขณะไม่ได้ล็อกอิน ไม่ขัดต่อ Terms of Service ของ Meta จากนั้น Meta ก็ยกเลิกคดีและสละสิทธิ์ในการอุทธรณ์ คดีก่อนหน้านั้น hiQ v. LinkedIn ในศาล Ninth Circuit (ยืนยันหลัง Van Buren) ก็วางหลักไว้ว่าการ scrape ข้อมูลสาธารณะที่เข้าถึงได้ไม่ถือเป็นการละเมิด CFAA — แม้ว่า hiQ จะไปยอมความ จ่าย 500,000 ดอลลาร์ และยอมรับคำสั่งห้ามถาวรก็ตาม ซึ่งแสดงให้เห็นว่าแม้ TOS จะยังเอาผิดได้

GDPR และ CCPA จะมีผลถ้าคุณเก็บข้อมูลส่วนบุคคลจากผู้ใช้ในสหภาพยุโรปหรือแคลิฟอร์เนีย การ scrape โพสต์สาธารณะเป็นเรื่องหนึ่ง แต่การสร้างฐานข้อมูลข้อมูลส่วนบุคคลของผู้ใช้แต่ละคนเป็นอีกเรื่องหนึ่ง

แนวทางปฏิบัติที่ควรทำ:

  • จำกัดอัตราการส่ง request อย่าไล่ยิงเซิร์ฟเวอร์ของ TikTok ถี่เกินไป
  • อย่า scrape บัญชีส่วนตัวหรือคอนเทนต์ของผู้เยาว์
  • อย่านำคอนเทนต์วิดีโอที่มีลิขสิทธิ์ไปเผยแพร่เชิงพาณิชย์
  • เคารพ robots.txt (TikTok ปิดกั้นการ crawl อัตโนมัติส่วนใหญ่)
  • การดาวน์โหลดวิดีโอเพื่อการวิจัยหรือวิเคราะห์ส่วนตัวแตกต่างจากการ repost — ต้องแยกแยะให้ชัด

ข้อจำกัดความรับผิดชอบ: เนื้อหานี้เป็นเพื่อการศึกษา ไม่ใช่คำปรึกษาทางกฎหมาย หากคุณกำลังสร้างผลิตภัณฑ์เชิงพาณิชย์จากข้อมูล TikTok ที่ scrape มา ควรปรึกษาทนาย

สรุป: ประเด็นสำคัญที่ควรจำ

การ scrape TikTok ในปี 2025 เป็นเป้าหมายที่เปลี่ยนตลอดเวลา ระบบป้องกันบอทของแพลตฟอร์มนี้ซับซ้อนที่สุดระบบหนึ่งบนเว็บ และวิธีแบบเดาง่าย ๆ (เช่น requests ตรง ๆ, snippet จาก ChatGPT หรือบทความเก่า) มักจะใช้ไม่ได้ แต่ถ้าใช้วิธีที่เหมาะสม ก็ทำได้แน่นอน

สิ่งที่ควรจำมีดังนี้:

  • วิธีที่ 1 (Hidden JSON) เร็วและง่ายที่สุด — เริ่มจากตรงนี้ถ้าต้องการ scrape โปรไฟล์แบบเร็ว ๆ
  • วิธีที่ 2 (Internal API) ให้ pagination และเข้าถึงข้อมูลจำนวนมากได้ แต่ต้องคอยดูแลมากที่สุดเพราะ endpoint และ signature เปลี่ยนบ่อย
  • วิธีที่ 3 (Playwright) ทนต่อ anti-bot ได้ดีที่สุด แต่แลกกับความเร็วและการใช้ทรัพยากร
  • ทั้ง 3 วิธี สามารถดึง URL สำหรับดาวน์โหลดวิดีโอได้ — และคู่มือนี้เป็นหนึ่งในไม่กี่บทความที่พาคุณไปถึงขั้นดาวน์โหลดไฟล์ .mp4 จริงพร้อม header ที่ถูกต้อง
  • สำหรับผู้ใช้ที่ไม่ถนัดเทคนิค, เป็นทางลัดที่เร็วกว่าในการได้ข้อมูลชุดเดียวกันโดยไม่ต้องเขียนหรือดูแลโค้ด แนวทางแบบ AI ของมันหมายความว่าแทบไม่พังเมื่อ TikTok เปลี่ยนเลย์เอาต์ — ซึ่งจากรายงานของชุมชน ดูเหมือนจะเกิดบ่อยเกินกว่าที่ใครจะอยากให้เป็น

ถ้าคุณอยากเริ่มโดยไม่ต้องตั้งค่า Python เลย ลอง ได้ — แผนฟรีก็เพียงพอสำหรับทดลองกับไม่กี่โปรไฟล์และดูว่าเข้ากับเวิร์กโฟลว์ของคุณไหม สำหรับสาย Python ให้เริ่มจากวิธีที่ 1 ตรวจสอบข้อมูลให้แน่ใจก่อน แล้วค่อยขยายสเกลต่อไป

อยากลงลึกเรื่องเทคนิค web scraping เพิ่มเติมใช่ไหม? ลองอ่านคู่มือของเราเกี่ยวกับ , , และ

คำถามที่พบบ่อย

การ scrape วิดีโอ TikTok ด้วย Python ถูกกฎหมายไหม?

การ scrape ข้อมูลสาธารณะอยู่ในพื้นที่สีเทาทางกฎหมาย ไม่ได้ผิดชัดเจน คำตัดสิน Meta v. Bright Data (2024) สนับสนุนแนวทางที่ว่าการ scrape ข้อมูลสาธารณะขณะไม่ได้ล็อกอิน ไม่ขัดต่อ Terms of Service ของแพลตฟอร์ม อย่างไรก็ตาม TOS ของ TikTok ระบุชัดว่าห้ามเข้าถึงแบบอัตโนมัติ และ GDPR/CCPA ก็มีผลกับข้อมูลส่วนบุคคล มันไม่ใช่สิ่งผิดกฎหมายแบบที่หลายคนกังวล แต่ก็ไม่ใช่สิ่งที่ไร้ความเสี่ยง ควรปรึกษาผู้เชี่ยวชาญด้านกฎหมายสำหรับกรณีใช้งานของคุณโดยเฉพาะ

ไลบรารี Python ที่ดีที่สุดสำหรับ TikTok scraping คืออะไร?

ขึ้นอยู่กับแนวทางที่คุณใช้ ถ้าจะดึงจาก hidden JSON (วิธีที่ 1) requests + beautifulsoup4 ก็เพียงพอ ถ้าจะเรียก internal API (วิธีที่ 2) ใช้ requests หรือ httpx ได้ สำหรับ browser automation (วิธีที่ 3) playwright คือมาตรฐานปัจจุบัน — ปัจจุบันถูกใช้แทน Selenium มากขึ้นในโปรเจกต์ scrape ใหม่ ๆ โดยมี เทียบกับ Selenium ที่ราว 53 ล้านครั้ง นอกจากนี้ TikTok-Api wrapper (มีดาวใน GitHub ราว 6.3K) ก็เป็นอีกตัวเลือกถ้าคุณอยากได้อินเทอร์เฟซระดับสูงขึ้น แม้จะค่อนข้างเปราะบางก็ตาม

ดาวน์โหลดวิดีโอ TikTok แบบไม่มีลายน้ำด้วย Python ได้ไหม?

ได้ TikTok เองมีข้อมูล playAddr ซึ่งโดยทั่วไปจะให้เวอร์ชันวิดีโอที่ไม่มีลายน้ำมาตรฐาน คู่มือนี้แสดงวิธีดึง URL นี้จากทั้ง 3 วิธี และดาวน์โหลดไฟล์ .mp4 ด้วย header ที่เหมาะสม ส่วน downloadAddr จะเป็นเวอร์ชันที่มีลายน้ำ

ทำไม TikTok scraper ของฉันถึงคืนค่าว่างเปล่า?

สาเหตุที่พบบ่อยที่สุดคือ TikTok ต้องใช้ JavaScript ในการเรนเดอร์เนื้อหา requests.get() แบบพื้นฐานจะดึงได้แค่ HTML shell — ข้อมูลจริงจะอยู่ใน hidden JSON script tag (วิธีที่ 1) หรือถูกโหลดแบบไดนามิกผ่าน JavaScript (วิธีที่ 3) ถ้าคุณได้ HTML ว่าง ให้ลองวิธีที่ 1 ก่อน ถ้ายังไม่ได้ ให้เช็ก headers ของคุณ (การขาด Referer เป็นสาเหตุอันดับหนึ่งของ error 403) หรือขยับไปใช้วิธีที่ 3 กับ Playwright

จะหลีกเลี่ยงการโดนบล็อกตอน scrape TikTok ได้อย่างไร?

ใช้ browser headers ที่สมจริง (รวม User-Agent, Referer และ Accept-Language), หมุนใช้ proxy แบบ residential หรือ mobile (IP ของดาต้าเซ็นเตอร์โดนจับภายในไม่กี่นาที), ใส่ delay แบบสุ่มระหว่าง request (อย่างน้อย 1–3 วินาที), และอย่าสcrape ปริมาณสูงเกินไป วิธีที่ 3 (Playwright) มีความทนต่อการบล็อกสูงที่สุดเพราะมันเลียนแบบ session ของเบราว์เซอร์จริง สำหรับงานปริมาณมาก ควรเผื่องบ proxy ด้วย — proxy residential ระดับเริ่มต้นจากผู้ให้บริการหลัก ๆ มีราคาประมาณ

ลองใช้ Thunderbit สำหรับการ scrape TikTok
Shuai Guan
Shuai Guan
Co-founder/CEO @ Thunderbit. Passionate about cross section of AI and Automation. He's a big advocate of automation and loves making it more accessible to everyone. Beyond tech, he channels his creativity through a passion for photography, capturing stories one picture at a time.
Topics
Scrape Tiktok pythonTiktok data extraction pythonPython Tiktok scraper scriptHow to scrape Tiktok videos with python
สารบัญ

ลองใช้ Thunderbit

ดึงลีดและข้อมูลอื่น ๆ ได้ใน 2 คลิก ขับเคลื่อนด้วย AI.

รับ Thunderbit ใช้ฟรี
ดึงข้อมูลด้วย AI
ส่งข้อมูลไปยัง Google Sheets, Airtable หรือ Notion ได้อย่างง่ายดาย
PRODUCT HUNT#1 Product of the Week