วิธี Scrape Reddit ด้วย Python: 4 วิธีที่ใช้ได้จริงตอนนี้

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

Google จ่ายปีละ 60 ล้านดอลลาร์เพื่อขอใช้ข้อมูล Reddit ส่วนดีลของ OpenAI ก็มีรายงานว่าอยู่ที่ 70 ล้านดอลลาร์ ซึ่งก็คงพอบอกได้ชัดว่าข้างในเธรดคอมเมนต์พวกนั้นมีอะไรซ่อนอยู่บ้าง ถ้าคุณเคยพยายามรวบรวมเธรดสนทนา คอมเมนต์ หรือข้อมูลเชิงความรู้สึกจาก Reddit ด้วยตัวเอง คุณน่าจะรู้ดีว่ามันน่าหงุดหงิดแค่ไหน: เลื่อนแบบไม่มีที่สิ้นสุด คัดลอกวางซ้ำ ๆ และแท็บเปิดเต็มหน้าจอ

ช่วงไตรมาสที่แล้วผมใช้เวลาไม่น้อยช่วยทีม Thunderbit ศึกษาว่าคนดึงข้อมูล Reddit กันจริง ๆ อย่างไรในปี 2025 ภาพรวมเปลี่ยนไปเยอะมากนับตั้งแต่ Reddit ปรับโครงสร้างราคา API ครั้งใหญ่ในปี 2023 และคู่มือส่วนใหญ่บนอินเทอร์เน็ตก็ล้าสมัยไปแล้ว หรือไม่ก็อธิบายแค่ทางเดียว ผมเลยรวบรวมทุกวิธีที่ยังใช้งานได้จริงตอนนี้ — ทั้งหมด 4 แนวทาง ตั้งแต่เขียน Python เต็มรูปแบบไปจนถึงการดึงข้อมูลแบบไม่ต้องเขียนโค้ด — เพื่อให้คุณเลือกวิธีที่เหมาะกับทักษะและงานของคุณ ไม่ว่าคุณจะกำลังสร้างชุดข้อมูลสำหรับ NLP เฝ้าดู subreddit เพื่อจับการพูดถึงแบรนด์ หรือแค่อยากได้สเปรดชีตของโพสต์ที่กำลังฮิต คู่มือนี้ช่วยคุณได้แน่นอน

Reddit Scraping คืออะไร และทำไมถึงสำคัญ?

Reddit scraping คือการดึงข้อมูลโพสต์ คอมเมนต์ ข้อมูลผู้ใช้ และเมตาดาต้าจากหน้าเว็บหรือ API ของ Reddit แบบอัตโนมัติ แทนที่จะเข้าไปไล่อ่านเธรดแล้วคัดลอกข้อความทีละส่วน คุณใช้สคริปต์หรือเครื่องมือเพื่อเก็บข้อมูลที่มีโครงสร้างในปริมาณมาก

ทำไมต้องทำแบบนี้? Reddit มี subreddit ที่ยังใช้งานอยู่มากกว่า และสร้างคอมเมนต์ได้ราว ที่นี่คือแหล่งที่ผู้คนพูดความเห็นแบบตรงไปตรงมาเกี่ยวกับสินค้า บริการ คู่แข่ง และเทรนด์ต่าง ๆ ซึ่งเป็นสัญญาณจริงที่หาแทบไม่ได้จากเว็บรีวิวที่ผ่านการขัดเกลาหรือบล็อกขององค์กร Google จ่ายประมาณ เพื่อขอใช้คอนเทนต์ของ Reddit และ OpenAI ก็มีรายงานว่าทำดีลมูลค่า ถ้าบริษัท AI ที่ใหญ่ที่สุดในโลกยอมจ่ายเงินระดับนี้เพื่อข้อมูลชุดนี้ ก็น่าลองเรียนรู้วิธีเข้าถึงข้อมูลด้วยตัวเอง

ทำไมปี 2025 ถึงควร Scrape Reddit ด้วย Python?

Python คือภาษาหลักที่คนใช้ทำ Reddit scraping — เพราะ PRAW, requests, BeautifulSoup และ pandas ครอบคลุมทุกขั้นตอนตั้งแต่เรียก API ไปจนถึงส่งออกข้อมูล แต่เหตุผลมันไม่ได้มีแค่เรื่องเครื่องมือ

นี่คือ use case ที่ผมเห็นบ่อยที่สุดในทีมธุรกิจและทีมวิจัย:

Use Caseใครได้ประโยชน์ตัวอย่าง
วิจัยและตรวจสอบตลาดProduct manager, founderขุดประเด็นปัญหาที่พูดซ้ำ ๆ ใน r/SaaS หรือ r/Entrepreneur
วิเคราะห์ความรู้สึกทีมการตลาด, ทีมแบรนด์ติดตามว่าคนพูดถึงสินค้าของคุณเทียบกับคู่แข่งอย่างไร
หาลีดขายทีมขายหาโพสต์แนว “กำลังมองหาเครื่องมือที่ทำ X ได้” ใน subreddit เฉพาะทาง
คิดไอเดียคอนเทนต์ทีมคอนเทนต์เจอคำถามหรือหัวข้อที่กำลังมาแรงใน r/marketing หรือ r/SEO
งานวิจัย / NLPนักวิจัย, data scientistสร้างชุดข้อมูลติดป้ายกำกับจากเธรดคอมเมนต์เพื่อจำแนกอารมณ์
วิเคราะห์คู่แข่งทีมกลยุทธ์, opsเฝ้าดู subreddit ของคู่แข่งเพื่อหาข้อร้องเรียนที่เกิดซ้ำ

ฐานผู้ใช้ของ Reddit มีรายงานว่าขยับไปแตะ และมี — เพิ่มขึ้น 24% เมื่อเทียบปีก่อน และหลังจาก Google core update เดือนสิงหาคม 2024 คอนเทนต์จาก Reddit ก็มีโอกาสปรากฏในผลการค้นหาแบบออร์แกนิกมากขึ้นราว

สรุปง่าย ๆ: ข้อมูลที่คุณ scrape จาก Reddit กำลังกลายเป็นข้อมูลชุดเดียวกับที่ Google ดันขึ้นมาให้ผู้ค้นหาเห็น

ควรใช้วิธีไหนในการ Scrape Reddit? (เปรียบเทียบแบบเร็ว)

คำถามที่พบบ่อยที่สุดในฟอรั่ม Reddit scraping คือ “แล้วควรใช้วิธีไหน?” ผมเลยทำตารางนี้ขึ้นมา เลือกแถวที่ตรงกับคุณแล้วลงมือได้เลย

เกณฑ์PRAW.json EndpointBeautifulSoup (HTML)No-Code (Thunderbit)
ความซับซ้อนในการตั้งค่าปานกลาง (ต้องสร้าง API app + ติดตั้ง pip)ไม่มี (แค่ใส่ URL)ปานกลาง (pip + ตรวจ DOM)ต่ำมาก (ส่วนขยาย Chrome)
ต้องใช้ API key ไหมใช่ไม่ต้องไม่ต้องไม่ต้อง
ดึงคอมเมนต์ได้แค่ไหนลึก (โครงสร้างแบบ nested)จำกัด (ระดับบนสุด)ต้อง parse เองจัดโครงด้วย AI
การแบ่งหน้ามีในตัวต้องทำเอง (พารามิเตอร์ after)ต้องทำเองอัตโนมัติ
การจำกัดอัตรา100 req/min (PRAW จัดการให้)~10 req/min (แบบไม่ยืนยันตัวตน)เสี่ยงโดนบล็อก IPเครื่องมือจัดการให้
เหมาะกับโปรเจกต์เต็มรูปแบบ, งานวิจัยดึงข้อมูลด่วนครั้งเดียวเรียนรู้/ปรับแต่งเองคนไม่เขียนโค้ด, export เร็ว ๆ
ตัวเลือกการ exportCSV, JSON (เขียนโค้ดเอง)JSON (raw)แบบกำหนดเอง (เขียนโค้ดเอง)Excel, Google Sheets, Airtable, Notion

ถ้าคุณอยากทำโปรเจกต์ Python แบบครบเครื่องและดึงคอมเมนต์ลึก ๆ ให้เริ่มที่วิธีที่ 1 (PRAW) ถ้าต้องการดึงข้อมูลแบบเร็ว ๆ ภายใน 10 นาทีโดยไม่ต้องตั้งค่าอะไรเลย ลองวิธีที่ 2 (เทคนิค .json) ถ้าอยากเรียนรู้การ scrape HTML หรืออยากได้ฟิลด์เฉพาะที่กำหนดเอง ให้ใช้วิธีที่ 3 (BeautifulSoup) และถ้าคุณอยากข้าม Python ไปเลยแต่ยังต้องการข้อมูลแบบพร้อมใช้ ให้ไปที่วิธีที่ 4 ()

อะไรเปลี่ยนไป: การปรับราคา API ของ Reddit ในปี 2023–2024 และอะไรที่ยังใช้ฟรีได้

แทบไม่มีคู่มือ scraping ไหนพูดถึงเรื่องนี้ ทั้งที่นี่คือบริบทสำคัญที่สุดสำหรับใครก็ตามที่ scrape Reddit ในวันนี้

ในเดือนมิถุนายน 2023 Reddit เริ่มเก็บค่าบริการสำหรับการเข้าถึง API เป็นครั้งแรกนับตั้งแต่ปี 2008 และผลกระทบก็รุนแรงมาก:

  • Pushshift ใช้กับสาธารณะไม่ได้แล้ว Reddit ยกเลิกสิทธิ์เข้าถึง API ของ Pushshift ในเดือนพฤษภาคม 2023 นักวิจัยที่พึ่งพาเครื่องมือนี้อยู่ (มีงานวิชาการกว่า อ้างอิง Pushshift) สูญเสียแหล่งข้อมูลหลักไปในชั่วข้ามคืน แหล่งทดแทนสำหรับข้อมูลย้อนหลังคือ แต่ยังไม่มี public live API ที่มาแทนได้
  • แอปของค่ายอื่นปิดตัวลง Apollo, Reddit is Fun, Sync, BaconReader และอีกหลายแอปปิดตัวลงภายในวันที่ 30 มิถุนายน 2023 หลัง Reddit เสนอค่าบริการ API ให้ผู้พัฒนา Apollo สูงถึง
  • subreddit กว่า 8,500 แห่งปิดตัวลงชั่วคราว เพื่อประท้วง รวมถึง r/funny (สมาชิก 40 ล้าน), r/gaming และ r/science ()

สิ่งที่ยังใช้ฟรีได้ในปี 2025:

ยังใช้งานได้สำหรับการใช้แบบไม่เชิงพาณิชย์ ส่วนตัว และงานวิชาการ — 100 queries ต่อนาทีต่อ OAuth client ID โดย PRAW ใช้ได้ดีมากภายใต้ระดับนี้สำหรับงาน scraping ขนาดกลาง ส่วนการเข้าถึงแบบไม่ยืนยันตัวตน (รวมถึง endpoint .json) จะถูกจำกัดไว้ราว 10 requests ต่อนาที

ข้อสรุปเชิงปฏิบัติ: ถ้าเป็นงานขนาดเล็กถึงกลาง free tier ก็เพียงพอแล้ว แต่ถ้าเป็นงานขนาดใหญ่หรือใช้งานเชิงพาณิชย์ คุณต้องติดต่อ Reddit เพื่อขอ enterprise access ใช้ endpoint .json หรือ BeautifulSoup (ซึ่งไม่ต้องใช้ API key) หรือใช้เครื่องมืออย่าง Thunderbit ที่ไม่ต้องพึ่ง API ของ Reddit เลย

ก่อนเริ่ม

  • ระดับความยาก: มือใหม่ถึงระดับกลาง (ขึ้นอยู่กับวิธีที่ใช้)
  • เวลาโดยประมาณ: ประมาณ 15–30 นาทีสำหรับวิธี 1–3; ประมาณ 5 นาทีสำหรับวิธี 4
  • สิ่งที่ต้องมี:
    • ติดตั้ง Python 3.8+ แล้ว (สำหรับวิธี 1–3)
    • บัญชี Reddit (สำหรับวิธี 1)
    • เบราว์เซอร์ Chrome (สำหรับวิธี 4)
    • (สำหรับวิธี 4)

วิธีที่ 1: วิธี Scrape Reddit ด้วย Python โดยใช้ PRAW (ทีละขั้นตอน)

PRAW (Python Reddit API Wrapper) เป็นวิธีที่ได้รับความนิยมมากที่สุดและมีเอกสารอธิบายละเอียดที่สุดสำหรับการ scrape Reddit ด้วย Python มันช่วยจัดการเรื่องยืนยันตัวตน การจำกัดอัตรา และการแบ่งหน้าให้คุณ แถมยังมีการดูแลพัฒนาอย่างต่อเนื่อง — เวอร์ชันเสถียรล่าสุดคือ PRAW 7.8.1 (ตุลาคม 2024) รองรับ Python 3.8 ถึง 3.13

ขั้นตอนที่ 1: สร้าง Reddit App และรับ API Credentials

ไปที่ แล้วเลื่อนไปด้านล่าง คลิก "are you a developer? create an app..."

กรอกฟอร์มดังนี้:

  • Name: ตั้งชื่ออะไรก็ได้ที่บอกหน้าที่ชัดเจน เช่น "my-reddit-scraper"
  • App type: เลือก script
  • Redirect URI: ใส่ http://localhost:8080 (จำเป็นต้องกรอก แต่ไม่ได้ใช้งานจริงสำหรับ script app)
  • Description: ไม่บังคับ

คลิก Create app แล้วคุณจะเห็น credentials ของคุณ:

  • client_id — สตริง 14 ตัวอักษรที่อยู่ใต้ชื่อแอปโดยตรง (มีป้ายกำกับว่า "personal use script")
  • client_secret — ช่องที่ระบุว่า "secret"

ก่อนสร้างแอปเสร็จ คุณจะต้องยอมรับ และ ของ Reddit ด้วย

ข้อควรทราบ: ตั้งแต่ปลายปี 2024 เป็นต้นมา นักพัฒนาใหม่อาจต้องยื่นคำขอเข้าถึงและรอการอนุมัติ ซึ่งเป็นจุดติดขัดใหญ่ที่สุดสำหรับคนใช้ PRAW ครั้งแรก และไม่มีวิธีลัดข้ามขั้นตอนนี้

ขั้นตอนที่ 2: ติดตั้ง PRAW และสร้าง Reddit Instance

เปิดเทอร์มินัลแล้วรัน:

1pip install praw pandas

จากนั้นสร้าง Reddit instance แบบอ่านอย่างเดียว:

1import praw
2reddit = praw.Reddit(
3    client_id="YOUR_CLIENT_ID",
4    client_secret="YOUR_CLIENT_SECRET",
5    user_agent="python:reddit-scraper:v1.0 (by u/yourname)",
6)
7# reddit.read_only เป็น True โดยค่าเริ่มต้นสำหรับ script app ที่ไม่มีรหัสผ่าน

รูปแบบ user_agent สำคัญมาก Reddit จะลดความเร็วหรือจำกัดการใช้งานสตริงทั่วไปอย่าง python-requests/2.x อย่างจริงจัง ให้ใช้รูปแบบที่ Reddit แนะนำ: platform:app_id:version (by u/username)

ขั้นตอนที่ 3: Scrape โพสต์จาก subreddit

นี่คือตัวอย่างการดึงโพสต์ที่ติดอันดับจาก r/python ในช่วง 1 เดือนที่ผ่านมา แล้วเก็บลงใน pandas DataFrame:

1import pandas as pd
2subreddit = reddit.subreddit("python")
3rows = []
4for post in subreddit.top(time_filter="month", limit=500):
5    rows.append({
6        "id": post.id,
7        "title": post.title,
8        "selftext": post.selftext,
9        "score": post.score,
10        "upvote_ratio": post.upvote_ratio,
11        "num_comments": post.num_comments,
12        "author": str(post.author) if post.author else "[deleted]",
13        "created_utc": post.created_utc,
14        "url": post.url,
15        "permalink": f"https://reddit.com{post.permalink}",
16    })
17df = pd.DataFrame(rows)
18print(df.head())

คุณสามารถเปลี่ยน .top() เป็น .hot(), .new() หรือ .controversial() ได้ และ time_filter รับค่า "all", "day", "hour", "month", "week", หรือ "year"

มีข้อควรรู้คือ Reddit จำกัดรายการแต่ละชุดไว้ประมาณ 1,000 รายการ ไม่ว่าคุณจะตั้ง limit สูงแค่ไหนก็ตาม ข้อจำกัดนี้มาจากฝั่ง Reddit ไม่ใช่ข้อจำกัดของ PRAW

ขั้นตอนที่ 4: Export ข้อมูล Reddit เป็น CSV หรือ Excel

1df.to_csv("reddit_python_top.csv", index=False)
2df.to_json("reddit_python_top.json", orient="records", lines=True)

PRAW จัดการ rate limit ให้อัตโนมัติ — มันอ่าน header X-Ratelimit-Remaining และ X-Ratelimit-Reset จากทุก response แล้วหน่วงเวลาระหว่างการเรียกตามความเหมาะสม สำหรับการ scrape ระดับปานกลาง คุณแทบไม่ต้องใส่ดีเลย์เองเลย

วิธี Scrape คอมเมนต์ Reddit ด้วย Python (เธรดแบบ nested ลึก ๆ)

การ scrape คอมเมนต์คือจุดที่คนส่วนใหญ่ติดคอขวด

Reddit เก็บคอมเมนต์เป็นโครงสร้างแบบต้นไม้: คอมเมนต์แต่ละอันอาจมีลูกหลานต่อได้ และบางกิ่งจะถูกย่อไว้หลังลิงก์ "load more comments" ในมุมของ PRAW สิ่งที่ซ่อนอยู่นี้จะถูกแทนด้วยออบเจ็กต์ MoreComments

ภาพจำง่าย ๆ คือ:

1Submission (t3_abc123)
2├── Comment A (top-level)
3│   ├── Reply A1
4│   │   └── Reply A1a
5│   └── Reply A2
6├── Comment B (top-level)
7│   └── MoreComments (hidden — "load more comments")
8└── MoreComments (hidden — "continue this thread")

ใช้ replace_more() เพื่อดึงคอมเมนต์ที่ซ่อนไว้ทั้งหมด

เมธอด replace_more() จะไล่ผ่านต้นไม้คอมเมนต์แล้วแทนที่ placeholder MoreComments แต่ละจุดด้วยคอมเมนต์จริงที่มันอ้างถึง:

1submission = reddit.submission(id="abcdef")
2submission.comments.replace_more(limit=10)  # จำกัดเชิงปฏิบัติสำหรับเธรดใหญ่
3all_comments = submission.comments.list()   # flatten แบบ breadth-first

ถ้าตั้ง limit=None มันจะไปแทนที่ทุกโหนด MoreComments แบบหมดจด — แต่ในเธรดที่มีคอมเมนต์มากกว่า 5,000 รายการ กระบวนการนี้อาจใช้เวลาหลายนาที เพราะแต่ละครั้งคือ API request หนึ่งครั้ง และแต่ละครั้งดึงได้มากสุดราว 100 คอมเมนต์ สำหรับเธรดใหญ่ ผมแนะนำให้เริ่มที่ limit=10 หรือ limit=20 แล้วค่อยเพิ่มถ้าคุณต้องการความครบถ้วนจริง ๆ

แปลงคอมเมนต์แบบ nested ให้เป็นตาราง

1rows = []
2for c in all_comments:
3    rows.append({
4        "comment_id": c.id,
5        "parent_id": c.parent_id,   # t1_xxx = คอมเมนต์แม่, t3_xxx = submission
6        "depth": c.depth,
7        "author": str(c.author) if c.author else "[deleted]",
8        "body": c.body,
9        "score": c.score,
10        "created_utc": c.created_utc,
11        "is_submitter": c.is_submitter,
12    })
13comments_df = pd.DataFrame(rows)

คอมเมนต์ระดับบนสุดจะมี parent_id ที่ขึ้นต้นด้วย t3_ (fullname ของ submission) คอลัมน์ depth จะบอกว่าคอมเมนต์นั้นซ้อนลึกแค่ไหน ซึ่งมีประโยชน์มากสำหรับการกรองข้อมูลหรือทำ visualization ข้อควรระวังอีกอย่างคือ len(all_comments) มักจะไม่เท่ากับ submission.num_comments เพราะคอมเมนต์ที่ถูกลบ ถูกเอาออก หรือถูกกรองโดย spam filter จะไม่ถูกนับรวมในต้นไม้

วิธีที่ 2: เทคนิค .json Endpoint — Scrape Reddit โดยไม่ต้องใช้ API Key

แค่เติม .json ต่อท้าย URL ของ Reddit ก็พอ คุณจะได้ JSON ที่มีโครงสร้างกลับมา — ไม่ต้องยืนยันตัวตน ไม่ต้องสมัคร app ไม่ต้องติดตั้ง pip

ตัวอย่าง: https://www.reddit.com/r/python/hot.json

คนในฟอรั่มพูดถึงเทคนิคนี้กันบ่อยมาก แต่แทบไม่มีบทเรียนไหนอธิบายไว้จริงจัง

ตัวอย่างโค้ด Python ที่ใช้งานได้จริง

1import requests
2headers = {"User-Agent": "python:reddit-scraper:v1.0 (by /u/yourname)"}
3r = requests.get(
4    "https://www.reddit.com/r/python/hot.json",
5    headers=headers,
6    params={"limit": 100},
7)
8data = r.json()
9for post in data["data"]["children"]:
10    p = post["data"]
11    print(p["title"], p["score"], p["num_comments"], p["author"])

ส่วนหัว User-Agent สำคัญมาก Reddit จะบล็อกหรือลดความเร็วของ user agent ทั่วไปอย่าง python-requests/2.31.0 — ตามที่ ว่า “การจำกัดอัตรานี้ขึ้นอยู่กับ user-agent” ให้ใช้รูปแบบที่บรรยายชัดเจนเหมือนกับ PRAW

วิธีจัดการการแบ่งหน้าด้วยพารามิเตอร์ after

endpoint .json จะส่งผลลัพธ์มาประมาณ 25 รายการโดยค่าเริ่มต้น (สูงสุด 100 รายการต่อ request) ถ้าอยากได้มากกว่านั้น ให้ใช้ cursor after จาก response:

1import requests, time
2headers = {"User-Agent": "python:reddit-scraper:v1.0 (by /u/yourname)"}
3after = None
4all_posts = []
5for _ in range(10):  # สูงสุดราว 1000 โพสต์
6    r = requests.get(
7        "https://www.reddit.com/r/python/hot.json",
8        headers=headers,
9        params={"limit": 100, "after": after},
10    )
11    data = r.json()
12    all_posts.extend(data["data"]["children"])
13    after = data["data"].get("after")
14    if not after:
15        break
16    time.sleep(6)  # ~10 QPM = หนึ่ง request ทุก 6 วินาที

ค่า after คือ cursor token (รูปแบบ: t3_xxxxxx) เหมือนกับ PRAW ข้อจำกัดแบบแข็งคือรวมทุกหน้าจะได้ราว 1,000 รายการเท่านั้น

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

  • เข้าถึง tree ของคอมเมนต์ลึก ๆ ไม่ได้ — ได้แค่คอมเมนต์ระดับบนสุดพร้อม stub ของ "more" อีกหนึ่งชั้น แต่ไม่มีการขยายอัตโนมัติแบบ replace_more() ของ PRAW
  • อ่านอย่างเดียว — โหวต โพสต์ หรือจัดการ moderator ไม่ได้
  • ~10 requests ต่อนาที สำหรับการเข้าถึงแบบไม่ยืนยันตัวตน — ถ้าวนลูปแรงเกินไปจะเจอ 429 errors
  • จำกัดรายการรวม 1,000 รายการ เหมือนกับ API แบบยืนยันตัวตน

วิธีนี้เหมาะกับการดึงข้อมูลด่วนครั้งเดียว การทำ prototype หรือสถานการณ์ที่คุณไม่อยากสมัคร API app

วิธีที่ 3: วิธี Scrape Reddit ด้วย BeautifulSoup (การ parse HTML)

ถ้าคุณเคยทำ web scraping มาก่อน คุณน่าจะรู้จัก BeautifulSoup อยู่แล้ว ข้อสำคัญสำหรับ Reddit โดยเฉพาะคือให้ใช้ old.reddit.com แทนหน้าใหม่ที่สร้างด้วย React เพราะอินเทอร์เฟซเก่าเรนเดอร์จากฝั่งเซิร์ฟเวอร์ เบากว่า และ parse ง่ายกว่ามาก — คู่มือหลายฉบับช่วงปี 2025–2026 ยืนยันว่ามันยังใช้งานได้และยังเป็นมิตรกับ scraper อยู่

ตั้งค่า Requests และ BeautifulSoup

1pip install requests beautifulsoup4
1import requests
2from bs4 import BeautifulSoup
3headers = {"User-Agent": "python:reddit-scraper:v1.0 (by /u/yourname)"}
4r = requests.get("https://old.reddit.com/r/python/", headers=headers)
5soup = BeautifulSoup(r.text, "html.parser")

ดึงข้อมูลโพสต์จาก DOM

บน old.reddit.com โพสต์แต่ละชิ้นจะอยู่ภายใน <div> ที่มีคลาส thing ตัวเลือกที่เสถียรที่สุดคือแอตทริบิวต์ data-*:

1for thing in soup.select("div#siteTable > div.thing"):
2    title_el = thing.select_one("a.title")
3    print({
4        "title":    title_el.get_text(strip=True) if title_el else None,
5        "author":   thing.get("data-author"),
6        "score":    thing.get("data-score"),
7        "comments": thing.get("data-comments-count"),
8        "domain":   thing.get("data-domain"),
9        "url":      title_el.get("href") if title_el else None,
10    })

แนะนำให้ใช้ data-* attributes มากกว่าตัวเลือกคลาสที่ซ้อนกัน เพราะ Reddit ปรับชื่อคลาสบ่อยในช่วงหลายปีที่ผ่านมา แต่แอตทริบิวต์ข้อมูลเหล่านี้มักมาจากเทมเพลตและแทบไม่เปลี่ยน

จัดการการแบ่งหน้าบน old.reddit.com

1import time
2url = "https://old.reddit.com/r/python/"
3all_rows = []
4while url:
5    r = requests.get(url, headers=headers)
6    soup = BeautifulSoup(r.text, "html.parser")
7    for thing in soup.select("div#siteTable > div.thing"):
8        title_el = thing.select_one("a.title")
9        all_rows.append({
10            "title":    title_el.get_text(strip=True) if title_el else None,
11            "author":   thing.get("data-author"),
12            "score":    thing.get("data-score"),
13            "comments": thing.get("data-comments-count"),
14            "url":      title_el.get("href") if title_el else None,
15        })
16    nxt = soup.select_one("span.next-button a")
17    url = nxt["href"] if nxt else None
18    time.sleep(2)  # หน่วงเวลาแบบสุภาพ

เมื่อไรควรใช้ BeautifulSoup แทน PRAW

BeautifulSoup เหมาะเมื่อคุณอยากฝึก scraping จาก DOM ไม่อยากสมัคร OAuth app หรืออยากได้ฟิลด์เฉพาะที่ PRAW ไม่เปิดให้ใช้ แต่ก็เปราะบางกว่า — โครงสร้าง HTML เปลี่ยนได้โดยไม่มีสัญญาณเตือน การบล็อก IP ในปี 2025 ก็เข้มงวดกว่าเดิม และคุณต้องเขียนโค้ดจัดการ pagination กับ error handling เองทั้งหมด ถ้าเน้นความเสถียรและความลึก PRAW ยังชนะ

วิธีที่ 4: วิธี Scrape Reddit แบบไม่ต้องเขียนโค้ดด้วย Thunderbit

ขอสารภาพตรง ๆ ว่าคนจำนวนมากที่ค้นหา “how to scrape Reddit with Python” จริง ๆ แล้วไม่ได้อยากเขียน Python เขาแค่อยากได้ ข้อมูล ถ้านั่นคือคุณ ส่วนนี้คือทางลัดของคุณ

คือส่วนขยาย Chrome ที่ขับเคลื่อนด้วย AI ซึ่งทีมเราสร้างมาเพื่อการใช้งานแบบนี้โดยเฉพาะ — ดึงข้อมูลที่มีโครงสร้างจากหน้าเว็บโดยไม่ต้องเขียนโค้ด

ขั้นตอนที่ 1: ติดตั้ง Thunderbit แล้วเปิดหน้า Reddit

ติดตั้ง จากนั้นเข้าไปยังหน้า subreddit หรือหน้าโพสต์ของ Reddit ได้เลย (เช่น reddit.com/r/python)

ไม่ต้องใช้ API key ไม่ต้องมี Python environment ไม่ต้องพิมพ์คำสั่งในเทอร์มินัล

ขั้นตอนที่ 2: คลิก "AI Suggest Fields" แล้วให้ AI อ่านหน้าเว็บ

คลิกไอคอน Thunderbit บนแถบเครื่องมือของเบราว์เซอร์ แล้วกด "AI Suggest Fields" AI ของ Thunderbit จะสแกนหน้าเว็บและแนะนำคอลัมน์ให้อัตโนมัติ เช่น Post Title, User Name, Upvotes, Comments Count, Date Posted, Post Description, Community Name และ Post URL

คุณสามารถเพิ่ม ลบ หรือเปลี่ยนชื่อคอลัมน์ได้ตามต้องการ เช่น ถ้าคุณสนใจแค่ชื่อโพสต์กับคะแนน ก็ลบฟิลด์อื่นทิ้งได้เลย

ขั้นตอนที่ 3: คลิก "Scrape" แล้วส่งออกข้อมูล

กด "Scrape" แล้ว Thunderbit จะดึงข้อมูลให้ พร้อมจัดการ pagination ให้อัตโนมัติ เมื่อข้อมูลลงตารางครบแล้ว คุณสามารถ export ไปยัง Excel, Google Sheets, Airtable หรือ Notion ได้ทันที — ไม่ต้องเขียนโค้ด CSV เลย

ถ้าต้องการข้อมูลเชิงลึกมากขึ้น ฟีเจอร์ subpage scraping ของ Thunderbit จะให้คุณคลิกเข้าไปในแต่ละเธรด แล้วเสริมข้อมูลคอมเมนต์ลงในตารางโดยอัตโนมัติ แนวคิดนี้คล้ายกับ replace_more() ของ PRAW แต่ไม่ต้องเขียนโค้ดแม้แต่บรรทัดเดียว

โบนัส: Scheduled Scraping สำหรับเฝ้าดู Reddit อย่างต่อเนื่อง

ถ้าคุณต้องติดตาม subreddit ทุกวัน — เช่น เฝ้าดูการพูดถึงแบรนด์ใน r/SaaS หรือคุยเรื่องคู่แข่งในชุมชนเฉพาะทาง — scheduled scraper ของ Thunderbit จะช่วยรันซ้ำตามรอบได้ คุณแค่บอกช่วงเวลาเป็นภาษาธรรมดา (เช่น “ทุกวันทำการตอน 9 โมงเช้า”) แล้วเครื่องมือจะจัดการที่เหลือ พร้อมส่งข้อมูลใหม่ไปยังสเปรดชีตหรือฐานข้อมูลที่เชื่อมไว้

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับความสามารถด้าน Reddit scraping ของ Thunderbit ได้ที่

เคล็ดลับและแนวปฏิบัติที่ดีสำหรับการ Scrape Reddit ด้วย Python

ผมเรียนรู้หลายข้อด้วยวิธีเจ็บตัว — ใช้ได้ไม่ว่าคุณจะเลือกวิธีไหนจากข้างต้น

เคารพข้อกำหนดการใช้งานและ Rate Limit ของ Reddit

ของ Reddit ระบุชัดว่าห้าม commercial scraping โดยไม่มีการอนุมัติเป็นลายลักษณ์อักษร — และข้อกำหนดนี้ใช้กับทุกวิธีเข้าถึง ไม่ใช่เฉพาะ API เท่านั้น สำหรับการใช้งานส่วนตัว งานวิชาการ และการวิจัยภายใน free OAuth tier กับ workflow ของ Thunderbit ยังอยู่ในกรอบการใช้งานที่สมเหตุสมผล

สรุป rate limit แบบเร็ว:

สถานการณ์ขีดจำกัดผลลัพธ์
แบบยืนยันตัวตน (OAuth)60–100 req/minPRAW จัดการให้อัตโนมัติ
แบบไม่ยืนยันตัวตน (.json, HTML)~10–30 req/min429 Too Many Requests
User-Agent ทั่วไปถูกจำกัดหนัก403 Forbidden หรือถูกบล็อกแบบเงียบ ๆ

ตั้งสตริง User-Agent ให้บรรยายชัดเจนเสมอ นี่คือสาเหตุที่พบบ่อยที่สุดที่ทำให้คนเพิ่งเริ่ม scrape เจอ 429 หรือ 403 errors

เก็บและจัดโครงข้อมูลให้สะอาด

  • ใช้ pandas DataFrame และกำหนดลำดับคอลัมน์ให้ชัด เพื่อให้ export CSV/Excel ได้คาดเดาได้
  • แปลง created_utc ให้เป็นเวลาที่อ่านง่าย: pd.to_datetime(df["created_utc"], unit="s")
  • ลบข้อมูลซ้ำด้วย id เมื่อ scrape หลาย sort พร้อมกัน (hot, new และ top มักซ้อนกัน)
  • จัดการผู้เขียนที่ถูกลบ: str(post.author) if post.author else "[deleted]"

รับมือกับข้อผิดพลาดที่พบบ่อยอย่างนุ่มนวล

Errorสาเหตุวิธีแก้
429 Too Many Requestsใช้งานเกิน rate limit (60-100 req/min สำหรับ OAuth)ใช้ exponential backoff; ตรวจ header X-Ratelimit-Reset
403 ForbiddenUser-Agent ไม่ดี หรือ IP ถูกบล็อกใช้ UA ที่ไม่ซ้ำและอธิบายชัดเจน; ตรวจว่า OAuth app ยัง active อยู่
ผู้เขียนเป็น Noneบัญชีถูกลบหรือถูกระงับครอบด้วย if post.author else "[deleted]"
prawcore.TooManyRequestsตัว buffer จำกัดอัตราของ PRAW ถูกกระตุ้นเพิ่ม ratelimit_seconds หรือกระจาย request ให้สม่ำเสมอ
5xx หรือ 413 กับเธรดใหญ่ระบบ backend ของ Reddit รับภาระไม่ไหวในเธรดลึกใส่ retry logic ใน replace_more(); จำกัดความลึกของ recursion

Use Case ของ Reddit Scraping: เอาข้อมูลไปทำอะไรได้บ้าง?

การ scrape เป็นแค่ก้าวแรก สิ่งที่ทำให้คุ้มจริง ๆ คือสิ่งที่คุณเอาข้อมูลไปทำต่อ:

  • ทีมขาย: เฝ้าดู subreddit อย่าง r/SaaS, r/smallbusiness หรือ r/Entrepreneur เพื่อหาโพสต์แนว “กำลังมองหาเครื่องมือที่ทำ X ได้” แล้วส่งแมตช์เข้า lead list หรือ workflow ใน CRM ใช้ scheduled scraper ของ Thunderbit เพื่อเฝ้าดูรายวัน
  • ทีมการตลาดและคอนเทนต์: ติดตามการพูดถึงแบรนด์ วิเคราะห์แนวโน้มความรู้สึก และขุดคำถามที่กำลังมาแรงไปต่อยอดเป็นไอเดียคอนเทนต์ ใช้ Reddit export ร่วมกับ Google Sheets เพื่อทำงานร่วมกันในทีม
  • Ecommerce และ ops: เฝ้าดูบทสนทนาเกี่ยวกับสินค้าคู่แข่งเพื่อหาข้อร้องเรียนซ้ำ ๆ subreddit อย่าง r/BuyItForLife และคอมมูนิตี้เฉพาะทางเป็นขุมทรัพย์ของฟีดแบ็กสินค้า
  • นักวิจัยและนักวิเคราะห์: สร้างชุดข้อมูล NLP — งานวิชาการในปี 2024 ใช้ชุดข้อมูลตั้งแต่ ไปจนถึง สำหรับการจำแนกความรู้สึกและอารมณ์ การเก็บ corpus ด้วย PRAW ยังอ้างอิงในงาน peer review ได้

ถ้าคุณอยากเจาะลึกเรื่อง หรือ เราได้อธิบายเวิร์กโฟลว์เหล่านี้ไว้อย่างละเอียดในบล็อกของ Thunderbit แล้ว

สรุปท้ายเรื่อง

Reddit scraping ในปี 2025 ไม่เหมือนเมื่อสองปีก่อนเลย การเปลี่ยนแปลง API ในปี 2023 ทำให้ Pushshift หายไป ปิดแอปของค่ายอื่นที่หลายคนรัก และเปิดยุคของ paid tiers

แต่ free tier ก็ยังใช้ได้ดีสำหรับงานส่วนตัวและงานวิชาการ และตอนนี้ก็มีวิธีเข้าถึงข้อมูลให้เลือกมากกว่าที่เคย

สรุปสั้น ๆ ของแต่ละวิธีมีดังนี้:

reddit-scraping-methods.webp

ไม่ว่าคุณจะเป็นสาย Python ตัวจริงหรือเป็นคนที่อยากได้สเปรดชีตภายในเที่ยง วันหนึ่งใน 4 วิธีนี้จะพาคุณไปถึงเป้าหมายได้ ถ้าคุณอยากข้ามการเขียนโค้ดไปเลย คุณสามารถ แล้วดูว่ามันจัดการ Reddit ได้ในไม่กี่คลิกยังไง และถ้าคุณอยากฝึกทักษะ Python scraping ต่อ อย่าลืมบันทึกคู่มือนี้ไว้ — ผมจะอัปเดตมันเรื่อย ๆ ตามที่โลกของ Reddit เปลี่ยนไป

ถ้าอยากอ่านเพิ่มเติมเกี่ยวกับวิธี web scraping ลองดูคู่มือของเราเรื่อง , และ

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

การ scrape Reddit ด้วย Python ถูกกฎหมายไหม?

ของ Reddit ห้าม commercial scraping โดยไม่มีการอนุมัติเป็นลายลักษณ์อักษร free OAuth tier เปิดให้ใช้สำหรับงานส่วนตัว งานไม่เชิงพาณิชย์ และงานวิชาการ กรอบทางกฎหมายนี้ไม่ขึ้นกับวิธีที่คุณใช้ — ไม่ว่าจะเป็น API, endpoint .json หรือ HTML scraping ก็ตาม ควรตรวจสอบข้อกำหนดล่าสุดของ Reddit ก่อน scrape ในระดับใหญ่เสมอ

PRAW ยังใช้งานได้หลังการเปลี่ยน API ของ Reddit ในปี 2023 ไหม?

ได้ PRAW 7.8.1 (ตุลาคม 2024) ยังได้รับการพัฒนาอย่างต่อเนื่อง และทำงานภายใต้ ได้โดยอัตโนมัติ การปรับราคาในปี 2023 ส่งผลหลัก ๆ กับการใช้งาน API ปริมาณสูงและเชิงพาณิชย์ ไม่ได้กระทบรูปแบบการ scrape ด้วย PRAW แบบทั่วไปมากนัก

Scrape Reddit โดยไม่ใช้ API key ได้ไหม?

ได้ — ทั้ง endpoint .json และการ parse HTML ด้วย BeautifulSoup ใช้งานได้โดยไม่ต้องมี API key ก็ไม่ต้องใช้ API key เช่นกัน ทั้งสามวิธียังอยู่ภายใต้ข้อกำหนดการใช้งานของ Reddit สำหรับการใช้งานเชิงพาณิชย์

จะ scrape คอมเมนต์ Reddit ไม่ใช่แค่โพสต์ได้อย่างไร?

ถ้าใช้ PRAW ให้เรียก submission.comments.replace_more(limit=10) แล้วตามด้วย submission.comments.list() เพื่อแปลงต้นไม้คอมเมนต์แบบ nested ให้เป็นรายการแบบแบน ถ้าใช้ Thunderbit ให้ใช้ subpage scraping เพื่อเสริมข้อมูลคอมเมนต์จากแต่ละเธรดเข้าไปในข้อมูลโพสต์โดยอัตโนมัติ

วิธีที่เร็วที่สุดในการ scrape Reddit แบบไม่เขียนโค้ดคืออะไร?

ให้คุณ scrape โพสต์และคอมเมนต์ Reddit ได้ในสองคลิก และ export ไปยัง Excel, Google Sheets, Airtable หรือ Notion ได้ตรง ๆ — ไม่ต้องมี Python ไม่ต้องมี API key ไม่ต้องตั้งค่าอะไรให้ยุ่งยาก

เรียนรู้เพิ่มเติม

สารบัญ

ลองใช้ Thunderbit

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

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