גרידת YouTube עם Python: 4 שיטות שבאמת עובדות

עודכן לאחרונה ב-April 15, 2026

אם אי פעם ניסיתם requests.get("https://www.youtube.com/...") ואז לנתח את התוצאה עם BeautifulSoup כדי למצוא כותרות של סרטונים, אתם כבר מכירים את הפאנץ': קיבלתם קיר של תגי <div> ריקים ואפס נתונים שימושיים.

זו התסכול הנפוץ ביותר שאני רואה אצל מפתחים שמנסים לגרד את YouTube בפעם הראשונה. YouTube הוא יישום חד-דפי — כמעט הכול נטען בצד הלקוח באמצעות JavaScript. ה-HTML שסקריפט Python מקבל הוא רק מעטפת. כותרות הסרטונים, מספרי הצפיות והמטא־דאטה האמיתיים? הם קבורים בתוך בלוק JSON ענק בשם ytInitialData שמוזרק על ידי JS אחרי שהעמוד נטען.

לכן הקריאה התמימה לחלוטין ל-soup.find("div", class_="ytd-video-renderer") מחזירה None, כי האלמנט הזה פשוט לא קיים בתשובת ה-HTTP הגולמית. ברגע שהבנתי את זה, כל החידה התחברה — וארבע השיטות שלמטה הן תוצאה של הרבה בדיקות, שבירות, וקריאת יותר מדי בעיות ב-GitHub. אעבור איתכם על כל גישה, אראה בדיוק מתי להשתמש בכל אחת, ואוסיף בסוף קיצור דרך ללא קוד למי שרוצה רק את הנתונים בלי כל ההקמה של הפרויקט.

למה בכלל לגרד את YouTube עם Python?

YouTube הוא לא רק פלטפורמת וידאו — הוא גם מקור נתונים עצום עם . עם ו-, יש שם כמות אדירה של מידע גלוי לציבור שעסקים, חוקרים ויוצרים רוצים לנתח באופן תכנותי.

הבעיה היא שהאנליטיקס המובנה של YouTube מציג רק נתונים עבור הערוץ שלכם. אם אתם רוצים להבין את קצב ההעלאות של המתחרה, לעקוב אחר נושאים טרנדיים בנישה שלכם, או לנתח את תחושות הקהל מתוך תגובות לסרטונים של מישהו אחר, אתם צריכים לגרד את הנתונים.

אלו מקרי השימוש הנפוצים ביותר שראיתי בעולם האמיתי:

מקרה שימושמי צריך את זהאילו נתונים
ניתוח מתחריםצוותי שיווק, אסטרטגי תוכןמספר צפיות, תדירות העלאה, שיעורי מעורבות
יצירת לידיםצוותי מכירות, פנייה ל-B2Bפרטי קשר של הערוץ, אימיילים עסקיים בתיאורים
מחקר שוקמנהלי מוצר, אנליסטיםנושאים טרנדיים, תחושות קהל דרך תגובות
אסטרטגיית תוכןיוטיוברים, סוכנויותפורמטים מצליחים, דפוסי כותרות/תגיות מיטביים
SEO / מחקר מילות מפתחמומחי SEOכותרות סרטונים, תגיות, תיאורים, אותות דירוג
ניטור מותגצוותי PR, מנהלי מותגאזכורים בכותרות, תגובות ותיאורים של סרטונים
מחקר אקדמיחוקרים, מדעני נתוניםמאגרי תגובות ל-ניתוח סנטימנט (מחקר מ-2025 הגיע לדיוק של 93.1% לאחר כוונון עדין של BERT על 45 אלף תגובות ביוטיוב)

למשל, ניתוח תחרותי בין DJI, GoPro ו-Insta360 מצא ש- — סוג התובנה שפשוט אי אפשר לראות מתוך YouTube Studio.

למה requests + BeautifulSoup לבדן לא יגרדו את YouTube

לפני שמגיעים לשיטות שכן עובדות, צריך להבין למה הגישה הברורה נכשלת. זה לא רק תיאוריה — זה יחסוך לכם שעות של דיבוג.

הגישה ה"מתבקשת" נראית בערך כך:

1import requests
2from bs4 import BeautifulSoup
3response = requests.get("https://www.youtube.com/@somechannel/videos")
4soup = BeautifulSoup(response.text, "html.parser")
5videos = soup.find_all("a", id="video-title-link")
6print(len(videos))  # 0 — כל פעם מחדש

התוצאה היא תמיד אפס. כמו ש- אומר: "העמוד נטען דינמית, וזה לא נתמך על ידי ספריית requests." חד יותר: "בשימוש ב-requests וב-BeautifulSoup בלבד אי אפשר להריץ JavaScript."

מסביר את המנגנון: YouTube בנוי כ-Single Page Application (SPA). כשמשתמשים בבקשות HTTP בסיסיות, מקבלים רק את מעטפת ה-HTML הראשונית — התוכן האמיתי עדיין לא רונדר. נתוני הסרטונים מוסתרים בתוך אובייקטי JavaScript שהדפדפן אמור להריץ ולהזריק ל-DOM.

החדשות הטובות: YouTube כן מטמיע את כל הנתונים שאתם צריכים בתוך ה-HTML הגולמי. הם פשוט לא נמצאים באלמנטים של ה-DOM — אלא בשני בלוקי JSON בתוך תגי <script>:

  • ytInitialData — מבנה העמוד, רשימות סרטונים, מדדי מעורבות, טוקנים להמשך תגובות
  • ytInitialPlayerResponse — מטא־דאטה ליבתית של הסרטון (כותרת, תיאור, משך, פורמטים, כתוביות)

את שניהם אפשר לשלוף עם requests.get() יחיד — בלי דפדפן — ברגע שמבינים איך לחלץ ולנתח אותם. זו שיטה 1 בהמשך.

4 דרכים לגרד את YouTube עם Python: השוואה זה לצד זה

לפני שנצלול לכל שיטה, הנה מטריצת ההחלטה. בדקתי את כל ארבע הגישות והשוויתי ביניהן לפי הקריטריונים שבאמת חשובים כשבוחרים כלי לפרויקט אמיתי.

קריטריוןrequests + BS4 (ytInitialData)Selenium / Playwrightyt-dlpYouTube Data APIללא קוד (Thunderbit)
מורכבות ההקמהנמוכהבינוניתנמוכהבינונית (מפתח API)אין
תמיכה ברינדור JSחלקית (פענוח JSON)כןכןלא רלוונטי (API מובנה)כן
מהירותמהירהאיטיתמהירהמהירהמהירה (ענן)
סיכון לאנטי-בוטבינוניגבוהנמוךאיןמטופל אוטומטית
מכסות / מגבלות קצבאיןאין (אבל זיהוי)אין10,000 יחידות ביוםמבוסס קרדיטים
חילוץ תגובותקשהאפשרי אבל מורכבמובנהמובנהתלוי בעמוד
תמלוליםלאמורכבכןלאלא
הכי מתאים למטא־דאטה מהירתוצאות חיפוש, עמודים דינמייםמטא־דאטה בכמויות + תגובותנתונים מובנים בקנה מידהלא-מתכנתים, ייצוא מהיר

סיכום קצר: youtube-scraping-methods.webp

אילו נתונים באמת אפשר לחלץ מ-YouTube, ובאיזו שיטה?

זו טבלת הייחוס שהייתי רוצה שהייתה לי כשהתחלתי. אף שיטה אחת לא מכסה את כל השדות — וזו בדיוק הסיבה שהמאמר הזה עוסק בארבע.

שדה נתוניםBS4 (ytInitialData)Selenium/Playwrightyt-dlpYouTube APIThunderbit
כותרת הסרטון
מספר צפיות
מספר לייקים⚠️ לא עקבי
תגובות (טקסט)⚠️ מורכב⚠️
תמלול/כתוביות⚠️
תגיות⚠️
כתובות URL של תמונות ממוזערות
מספר מנויים של הערוץ⚠️
תאריך העלאה
משך הסרטון
נתונים ייעודיים ל-Shorts⚠️⚠️⚠️

בחרו את השיטה לפי השורות שהכי חשובות לפרויקט שלכם. אם אתם צריכים תגובות ותמלולים, yt-dlp הוא המנצח הברור. אם אתם צריכים נתונים מובנים בקנה מידה בינוני, ה-API הוא ההימור הטוב ביותר. ואם אתם צריכים נתונים תוך שתי דקות, המשיכו לקרוא על Thunderbit.

extracted-data-categories.webp

שיטה 1: גרידת YouTube עם Python באמצעות requests + BeautifulSoup (פענוח ytInitialData)

השיטה הזו מנצלת את העובדה ש-YouTube מטמיע את כל נתוני העמוד כ-JSON בתוך ה-HTML הגולמי. לא צריך דפדפן — רק לדעת איפה לחפש.

  • רמת קושי: מתחילים
  • זמן נדרש: כ-15 דקות
  • מה צריך: Python 3.10+, requests, beautifulsoup4

שלב 1: שליחת בקשת GET לעמוד YouTube

שלחו בקשה עם כותרת User-Agent אמיתית. הכותרת ברירת המחדל python-requests/2.x נחסמת מיד — מאשר שזה מלכודת הקריסה הנפוצה ביותר למתחילים.

1import requests
2HEADERS = {
3    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
4                  "AppleWebKit/537.36 (KHTML, like Gecko) "
5                  "Chrome/114.0.0.0 Safari/537.36",
6    "Accept-Language": "en-US,en;q=0.9",
7    "Cookie": "CONSENT=YES+cb",  # עוקף את מסך ההסכמה של האיחוד האירופי
8}
9url = "https://www.youtube.com/@mkbhd/videos"
10response = requests.get(url, headers=HEADERS)
11print(response.status_code)  # אמור להיות 200

הקוקי CONSENT הוא קריטי — בלעדיו, בקשות מאזור האיחוד האירופי יופנו ל-consent.youtube.com, שמחזיר HTML בלי ytInitialData בכלל.

שלב 2: ניתוח ה-HTML ואיתור הסקריפט של ytInitialData

השתמשו ב-BeautifulSoup או ב-regex כדי למצוא את תגית <script> שמכילה var ytInitialData =:

1import re
2import json
3# חילוץ JSON של ytInitialData
4match = re.search(
5    r"var ytInitialData\s*=\s*({.*?});</script>",
6    response.text,
7    re.DOTALL
8)
9if match:
10    data = json.loads(match.group(1))
11    print("ytInitialData חולץ בהצלחה")
12else:
13    print("ytInitialData לא נמצא — בדקו כותרות/קוקיות")

טעות נפוצה: שימוש ב-.*? לא חמדני עם }; כסימן סוף בלבד. סיומי אובייקטים מקוננים מופיעים כל הזמן בתוך ה-JSON ויחתכו את הלכידה מוקדם מדי. השתמשו ב-};</script> כמו ש- עושה — זו ההשמה האחרונה בתוך בלוק הסקריפט שלה.

שלב 3: ניווט במבנה ה-JSON כדי לחלץ נתוני סרטונים

ה-JSON מקונן מאוד. במקום לקבע נתיבים שנשברים בכל פעם ש-YouTube משנה את המבנה (וזה קורה לא מעט — מתעד כמה שינויי פורמט מאז 2023), עדיף להשתמש בחיפוש רקורסיבי לפי מפתח:

1def search_dict(partial, search_key):
2    stack = [partial]
3    while stack:
4        cur = stack.pop()
5        if isinstance(cur, dict):
6            for k, v in cur.items():
7                if k == search_key:
8                    yield v
9                else:
10                    stack.append(v)
11        elif isinstance(cur, list):
12            stack.extend(cur)
13# חילוץ מידע על סרטונים מעמוד ערוץ
14videos = []
15for vr in search_dict(data, "videoRenderer"):
16    videos.append({
17        "video_id": vr.get("videoId"),
18        "title": vr["title"]["runs"][0]["text"],
19        "views": vr.get("viewCountText", {}).get("simpleText", "N/A"),
20        "published": vr.get("publishedTimeText", {}).get("simpleText", "N/A"),
21    })
22print(f"נמצאו {len(videos)} סרטונים")
23for v in videos[:5]:
24    print(f"  {v['title']}{v['views']}")

הגישה הרקורסיבית הזו היא מה ש-, yt-dlp ו-Scrapfly התכנסו אליה — היא שורדת את השינויים התכופים במבנה ה-JSON של YouTube.

שלב 4: ייצוא הנתונים ל-CSV או Excel

1import csv
2with open("youtube_videos.csv", "w", newline="", encoding="utf-8") as f:
3    writer = csv.DictWriter(f, fieldnames=["video_id", "title", "views", "published"])
4    writer.writeheader()
5    writer.writerows(videos)
6print("הנתונים ייוצאו ל-youtube_videos.csv")

מתי להשתמש בשיטה הזו ומתי לא

מתאים ל: משיכת מטא־דאטה מהירה מכמה עמודי ערוץ או סרטון. כלי SEO קלים. ניתוח חד-פעמי שבו צריך כותרת, צפיות ותאריך העלאה.

מגבלות: מבנה ה-JSON משתנה — תקלות מתועדות כוללות את ריפרוט הלייקים (2023: מ-toggleButtonRenderer ל-segmentedLikeDislikeButtonViewModel), ריפרוט התיאור (2023: מ-description.runs[] ל-attributedDescription.content), ועיצוב מחדש של לשונית הסרטונים בערוץ (2022–2023: מ-gridRenderer ל-richGridRenderer). כתובות IP של דאטה-סנטר נחסמות לרוב בעדינות אחרי 50–200 בקשות. אין תגובות, אין תמלולים.

שיטה 2: גרידת YouTube עם Python באמצעות Selenium או Playwright

כשצריך לתקשר עם העמוד — גלילה בתוצאות חיפוש, לחיצה על טאבים, פתיחת תיאורים — אוטומציית דפדפן היא הדרך הנכונה.

  • רמת קושי: בינונית
  • זמן נדרש: כ-30 דקות
  • מה צריך: Python 3.10+, Playwright (pip install playwright && playwright install) או Selenium + ChromeDriver

אני ממליץ על Playwright על פני Selenium בפרויקטים חדשים. מראים ש-Playwright מהיר בערך פי לעומת Selenium. Playwright משתמש ב-WebSocket קבוע דרך Chrome DevTools Protocol בעוד Selenium משתמש ב-WebDriver-over-HTTP, מה שמוסיף שכבת תרגום לכל פקודה.

שלב 1: הגדרת Playwright

1pip install playwright
2playwright install chromium
1from playwright.sync_api import sync_playwright
2pw = sync_playwright().start()
3browser = pw.chromium.launch(headless=False)  # מצב גלוי מפחית חלק מהזיהוי
4context = browser.new_context()
5# הוספת קוקי הסכמה מראש כדי לעקוף את המחסום של האיחוד האירופי
6context.add_cookies([{
7    "name": "SOCS",
8    "value": "CAISNQgDEitib3FfaWRlbnRpdHlmcm9udGVuZHVpc2VydmVyXzIwMjMwODI5LjA3X3AxGgJlbiACGgYIgJnPpwY",
9    "domain": ".youtube.com",
10    "path": "/",
11}])
12page = context.new_page()

שלב 2: ניווט לעמוד YouTube והמתנה לטעינת התוכן

1page.goto("https://www.youtube.com/@mkbhd/videos")
2page.wait_for_selector("a#video-title-link", timeout=15000)
3print("העמוד נטען — אלמנטים של סרטונים נראים")

אם אתם מגרדים תוצאות חיפוש, נווטו במקום זאת ל-https://www.youtube.com/results?search_query=your+query.

שלב 3: טיפול ב-Infinite Scroll כדי לטעון עוד סרטונים

YouTube משתמש ב-Infinite Scroll בעמודי ערוץ ובתוצאות חיפוש. הנה לולאת scrollHeight הקלאסית, מותאמת ממדריך הגלילה של :

1prev_height = -1
2max_scrolls = 20  # כדאי להגביל — ערוץ עם 10K סרטונים ימשיך לגלול לנצח
3scroll_count = 0
4while scroll_count &lt; max_scrolls:
5    page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
6    page.wait_for_timeout(1500)  # המתנה לטעינת תוכן חדש
7    new_height = page.evaluate("document.body.scrollHeight")
8    if new_height == prev_height:
9        break  # לא נטען תוכן חדש
10    prev_height = new_height
11    scroll_count += 1
12print(f"בוצעו {scroll_count} גלילות")

שלב 4: חילוץ נתוני הסרטונים מהעמוד המרונדר

1video_elements = page.query_selector_all("a#video-title-link")
2videos = []
3for el in video_elements:
4    title = el.inner_text()
5    href = el.get_attribute("href")
6    video_id = href.split("v=")[-1] if href else None
7    videos.append({"title": title, "video_id": video_id, "url": f"https://www.youtube.com{href}"})
8print(f"חולצו {len(videos)} סרטונים")

עבור מספר צפיות ותאריכי העלאה, צריך לאסוף אלמנטים סמוכים. מזהיר ש-id="video-title-link" לא אוניברסלי — ל-YouTube יש כמה וריאציות של עמודים. הפתרון העמיד הוא a[href*="watch"].

שלב 5: ייצוא ל-CSV או Google Sheets

1import csv
2with open("youtube_playwright.csv", "w", newline="", encoding="utf-8") as f:
3    writer = csv.DictWriter(f, fieldnames=["title", "video_id", "url"])
4    writer.writeheader()
5    writer.writerows(videos)
6browser.close()
7pw.stop()

מתי להשתמש בשיטה הזו ומתי לא

מתאים ל: גרידת תוצאות חיפוש, אינטראקציה עם רכיבי עמוד דינמיים (לחיצה על טאבים, פתיחת תיאורים), וכל דבר שדורש DOM מרונדר במלואו.

מגבלות: איטי (~1.5–3 שניות לכל סרטון בזרימת גלילה+חילוץ). סיכון גבוה לזיהוי אנטי-בוט — Selenium רגיל קובע navigator.webdriver === true, מה שכל זיהוי בצד JS קורא מיד . כבד במשאבים (כל מופע דפדפן משתמש ב-200–500 MB RAM). עבור 100 סרטונים, צפו ל-3–8 דקות במקום שניות עם yt-dlp.

שיטה 3: גרידת YouTube עם Python באמצעות yt-dlp

yt-dlp הוא אולר השוויצרי של גרידת YouTube. זהו fork קהילתי של youtube-dl עם , גרסאות nightly פעילות, ותמיכה מובנית במטא־דאטה, תגובות, תמלולים וגרידה אצווה — בלי צורך בדפדפן או במפתח API.

  • רמת קושי: מתחילים עד בינוני
  • זמן נדרש: כ-10 דקות
  • מה צריך: Python 3.10+, pip install yt-dlp

שלב 1: התקנת yt-dlp

1pip install yt-dlp

בלי דרייברי דפדפן, בלי מפתחות API, בלי קבצי הגדרות.

שלב 2: חילוץ מטא־דאטה של סרטון בלי להוריד אותו

1import yt_dlp
2opts = {
3    "quiet": True,
4    "skip_download": True,      # בלי בייטים של הווידאו — רק מטא־דאטה
5    "no_warnings": True,
6}
7with yt_dlp.YoutubeDL(opts) as ydl:
8    info = ydl.extract_info(
9        "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
10        download=False
11    )
12print(f"כותרת: {info['title']}")
13print(f"צפיות: {info['view_count']:,}")
14print(f"לייקים: {info.get('like_count', 'N/A')}")
15print(f"משך: {info['duration']} שניות")
16print(f"תאריך העלאה: {info['upload_date']}")
17print(f"ערוץ: {info['channel']} ({info.get('channel_follower_count', 'N/A')} מנויים)")
18print(f"תגיות: {info.get('tags', [])[:5]}")

קריאה טיפוסית ל-extract_info מחזירה 80–120 שדות, בהתאם למצב הסרטון: id, title, channel, channel_id, channel_follower_count, view_count, like_count, comment_count, upload_date, duration, tags, categories, description, thumbnails, is_live, availability, automatic_captions, subtitles, chapters, heatmap, ועוד.

שלב 3: חילוץ תגובות מסרטון YouTube

1opts = {
2    "quiet": True,
3    "skip_download": True,
4    "getcomments": True,
5    "extractor_args": {
6        "youtube": {
7            "max_comments": ["200", "50", "50", "10"],  # סה"כ, הורים, תשובות-לכל, תשובות-סה"כ
8            "comment_sort": ["top"],
9        }
10    },
11}
12with yt_dlp.YoutubeDL(opts) as ydl:
13    info = ydl.extract_info(
14        "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
15        download=False
16    )
17comments = info.get("comments", [])
18print(f"נשלפו {len(comments)} תגובות")
19for c in comments[:3]:
20    print(f"  [{c.get('like_count', 0)} לייקים] {c['author']}: {c['text'][:80]}...")

חילוץ תגובות איטי. מדווחת על קצב של כ-30 KB/s בעת שליפת תגובות — סרטון עם 100K תגובות יכול לקחת שעות. מתעדת סרטונים שבהם כתובות ה-URL של הפורמטים פגות תוקף (~6 שעות) לפני שסיום דפדוף התגובות מסתיים. הגדירו max_comments בצורה אגרסיבית עבור סרטונים גדולים.

שלב 4: חילוץ תמלולים וכתוביות

לא ה-YouTube Data API ולא ניתוח BS4 יכולים לתת לכם תמלול מלא. זה היתרון הייחודי של yt-dlp.

1opts = {
2    "quiet": True,
3    "skip_download": True,
4    "writesubtitles": True,
5    "writeautomaticsub": True,
6    "subtitleslangs": ["en", "en-orig"],
7    "subtitlesformat": "json3",   # ניתן לפענוח מכונה: start/dur במילישניות + טקסט
8    "outtmpl": "%(id)s.%(ext)s",
9}
10with yt_dlp.YoutubeDL(opts) as ydl:
11    info = ydl.extract_info(
12        "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
13        download=False
14    )
15# גישה ישירה לנתוני הכתוביות מתוך מילון info
16auto_captions = info.get("automatic_captions", {})
17manual_subs = info.get("subtitles", {})
18print(f"שפות כתוביות אוטומטיות: {list(auto_captions.keys())[:10]}")
19print(f"שפות כתוביות ידניות: {list(manual_subs.keys())}")

הפורמט json3 מועדף לניתוח מכונה — לכל מקטע יש start/dur במילישניות יחד עם טקסט. קודי השפה הם BCP-47 (en, en-US, zh-Hans, ja, es).

שלב 5: גרידה אצוותית של כמה סרטונים או ערוץ שלם

1opts = {
2    "quiet": True,
3    "skip_download": True,
4    "extract_flat": "in_playlist",  # מהיר — רק מזהי סרטונים וכותרות
5    "sleep_interval": 2,
6    "max_sleep_interval": 6,
7}
8with yt_dlp.YoutubeDL(opts) as ydl:
9    info = ydl.extract_info(
10        "https://www.youtube.com/@mkbhd/videos",
11        download=False
12    )
13entries = info.get("entries", [])
14print(f"נמצאו {len(entries)} סרטונים בערוץ")
15for e in entries[:5]:
16    print(f"  {e.get('title', 'N/A')}{e.get('id')}")

אפשר להעביר כתובת של ערוץ, פלייליסט, או אפילו שאילתת חיפוש (ytsearch10:python scraping) ו-yt-dlp מטפל בדפדוף פנימי.

מתי להשתמש בשיטה הזו ומתי לא

מתאים ל: חילוץ מטא־דאטה בכמויות, תגובות, תמלולים, הורדת סרטונים, או גרידות ברמת ערוץ שבו צריך את כל שדות הנתונים.

מגבלות: לא אידיאלי לגרידת עמודי תוצאות חיפוש (לזה Selenium/Playwright טובים יותר). מירוץ החימוש נגד אנטי-בוט בין 2024–2026 הפך את yt-dlp למורכב יותר להרצה בקנה מידה — YouTube אוכף עכשיו על חלק מהקליינטים. לשימוש בייצור, התקינו את התוסף והשתמשו ב---cookies-from-browser chrome (עם חשבון חד-פעמי — צוות yt-dlp מזהיר שקוקיז מחשבון Google אמיתי עלולים להוביל לחסימת החשבון).

שיטה 4: גרידת YouTube עם Python באמצעות YouTube Data API

ה-YouTube Data API v3 הרשמי הוא הדרך הכי אמינה ומובנית לקבל נתוני YouTube. התשובות הן JSON נקי, השדות מתועדים, ואין משחקי חתול-עכבר של אנטי-בוט. אבל יש מלכוד שרוב המדריכים מדלגים עליו: מערכת המכסות.

  • רמת קושי: בינונית
  • זמן נדרש: כ-20 דקות (כולל הגדרת מפתח API)
  • מה צריך: Python 3.10+, פרויקט ב-Google Cloud, pip install google-api-python-client

שלב 1: קבלת מפתח ל-YouTube Data API

  1. היכנסו ל-
  2. צרו פרויקט חדש (או בחרו קיים)
  3. עברו ל-APIs & Services → Library → חפשו "YouTube Data API v3" → Enable
  4. עברו ל-APIs & Services → CredentialsCreate Credentials → API Key
  5. העתיקו את המפתח — תשתמשו בו בקוד שלמטה

שלב 2: קריאת API ראשונה

1from googleapiclient.discovery import build
2API_KEY = "YOUR_API_KEY_HERE"
3youtube = build("youtube", "v3", developerKey=API_KEY)
4# שליפת פרטים עבור סרטון ספציפי
5response = youtube.videos().list(
6    part="snippet,statistics,contentDetails",
7    id="dQw4w9WgXcQ"
8).execute()
9video = response["items"][0]
10print(f"כותרת: {video['snippet']['title']}")
11print(f"צפיות: {video['statistics']['viewCount']}")
12print(f"לייקים: {video['statistics'].get('likeCount', 'hidden')}")
13print(f"תגובות: {video['statistics'].get('commentCount', 'disabled')}")
14print(f"משך: {video['contentDetails']['duration']}")
15print(f"תגיות: {video['snippet'].get('tags', [])[:5]}")

התשובה נקייה, טיפוסית ומתועדת. אין צורך בארכיאולוגיה של JSON.

שלב 3: חילוץ פרטי סרטונים, מידע על ערוצים ותגובות

1# חיפוש סרטונים
2search_response = youtube.search().list(
3    part="snippet",
4    q="python web scraping tutorial",
5    type="video",
6    maxResults=10,
7    order="viewCount"
8).execute()
9for item in search_response["items"]:
10    print(f"  {item['snippet']['title']}{item['id']['videoId']}")
11# תגובות
12comments_response = youtube.commentThreads().list(
13    part="snippet",
14    videoId="dQw4w9WgXcQ",
15    maxResults=20,
16    order="relevance"
17).execute()
18for item in comments_response["items"]:
19    comment = item["snippet"]["topLevelComment"]["snippet"]
20    print(f"  [{comment['likeCount']} לייקים] {comment['authorDisplayName']}: {comment['textDisplay'][:80]}")

מציאות המכסה של YouTube API (מה שאף אחד לא מספר לכם)

זה החלק שמפריד בין מדריך שימושי לבין מדריך להעתקה-הדבקה. ההקצאה ברירת המחדל היא , שמתאפסת בחצות לפי שעון פסיפיק. הנה כמה עולה כל קריאה:

נקודת קצה של ה-APIעלות מכסה לכל קריאהמקסימום תוצאות לכל קריאה
search.list100 יחידות50 תוצאות
videos.list1 יחידה50 מזהי סרטון (באצווה)
channels.list1 יחידה50 מזהי ערוצים
commentThreads.list1 יחידה100 תגובות
captions.list50 יחידותלא רלוונטי

עכשיו החישוב. נניח שאתם רוצים לגרד 1,000 תוצאות חיפוש:

  • קריאות חיפוש: 1,000 תוצאות ÷ 50 לעמוד = 20 קריאות × 100 יחידות = 2,000 יחידות (20% מהתקציב היומי — נגמר)
  • פרטי סרטון עבור 1,000 הסרטונים האלה: 1,000 מזהים ÷ 50 לאצווה = 20 קריאות × 1 יחידה = 20 יחידות (זול — videos.list באצווה הוא החסד הגדול)
  • תגובות עבור 1,000 הסרטונים האלה (בהנחה שעמוד אחד לכל סרטון): 1,000 קריאות × 1 יחידה = 1,000 יחידות

סה"כ: כ-3,020 יחידות לגרידה צנועה. אבל אם לסרטונים האלה יש שרשראות תגובות עמוקות (50+ עמודים לכל סרטון), תשרפו במהירות את 7,000 היחידות שנותרו. סרטון עם 50,000 תגובות = בערך 500 עמודים = 500 יחידות. גרדו 20 סרטונים כאלה — והיום נגמר.

תהליך דורש ביקורת ציות מלאה: כתובת מדיניות פרטיות, כתובת תנאי שימוש, סרטון הדגמה של האפליקציה, ונימוק מתמטי לצריכת המכסה. דיווחים מהקהילה מצביעים על תגובת Google טיפוסית בתוך 3–5 ימי עסקים, אישור מלא יכול לקחת שבועות עד חודשים, ורבות מהבקשות נדחות — במיוחד שימושים בסגנון "אני רוצה יותר נתונים לניתוח".

מתי להשתמש ב-API: בהיקף קטן עד בינוני, כשצריך נתונים מובנים ואמינים, כשתגובות וסטטיסטיקות ערוץ חשובות, וכשאפשר לחיות עם תקרת המכסה.

מתי גרידה עדיפה: פרויקטים בקנה מידה גדול (>10K סרטונים ביום), שדות שה-API לא חושף (תמלולים מלאים — captions.download דורש OAuth והרשאת בעל הסרטון), או כשצריך יותר מ-500 תוצאות חיפוש לשאילתה (מגבלה קשיחה של ה-API בלי קשר ל-totalResults).

קיצור הדרך ללא קוד: גרידת YouTube עם Thunderbit (בלי Python)

אם אתם צריכים Python כחלק מצינור נתונים, השתמשו בשיטות 1–4 למעלה. אבל אם אתם צריכים נתוני YouTube בתוך 2 דקות — אולי אתם משווקים שרוצים נתוני מתחרים, או מפתחים שרוצה שליפה מהירה בלי להקים סביבת פרויקט — יש מסלול מהיר יותר.

הוא תוסף Chrome לגרידת אתרים באמצעות AI, שנבנה במיוחד למקרים שבהם כתיבת קוד היא פשוט מוגזמת. הוא עובד ישירות על עמודי YouTube בדפדפן שלכם.

איך לגרד את YouTube עם Thunderbit ב-3 שלבים

שלב 1: התקינו את ופתחו עמוד ערוץ YouTube, עמוד תוצאות חיפוש או עמוד סרטון.

שלב 2: לחצו על "AI Suggest Fields" בסרגל הצד של Thunderbit. ה-AI קורא את העמוד ומציע עמודות כמו כותרת הסרטון, צפיות, תאריך העלאה, משך, שם הערוץ ו-URL של התמונה הממוזערת. אפשר להוסיף, להסיר או לשנות שמות של עמודות לפי הצורך.

שלב 3: לחצו על "Scrape" וייצאו ל-Google Sheets, Excel, CSV, Airtable או Notion. הנתונים יגיעו כטבלה נקייה, מוכנה לעבודה.

למי זה מתאים

  • משווקים שצריכים נתוני ערוצי מתחרים אבל לא כותבים קוד
  • מפתחים שרוצים שליפה מהירה בלי להקים virtual environment ולהתקין תלויות
  • כל מי שנתקע מול חסימות אנטי-בוט — Thunderbit מגרד בתוך סשן הדפדפן המחובר של המשתמש, כך שהוא יורש את הקוקיז ואת ה-PO tokens שלכם. זה עוקף הרבה מהבעיות שמטרידות גרידות בצד השרת
  • Thunderbit יכול גם להשתמש ב- כדי לבקר בכל עמוד סרטון ולהעשיר את הטבלה בפרטים נוספים (לייקים, תיאור, תגיות)

להבנה עמוקה יותר של האופן שבו Thunderbit מטפל ב-YouTube ספציפית, עיינו ב- וב-.

טיפים לגרידת YouTube עם Python בלי להיחסם

הטיפים האלה רלוונטיים לכל ארבע השיטות ב-Python. מנגנוני האנטי-בוט של YouTube מדורגים , עם שלושה אותות עיקריים: ניתוח התנהגות IP, דרישת הרצת JS, ומבנה HTML שמשתנה לעיתים קרובות.

לכל השיטות:

  • סובבו מחרוזות User-Agent וגם את כל סט הכותרות — Accept, Accept-Language, ו-Sec-CH-UA צריכים להתאים ל-UA המוצהר. כולל רשימה עדכנית.
  • הוסיפו השהיות אקראיות של 2–8 שניות בין בקשות. מרווחים קבועים הם אות זיהוי.
  • השתמשו בפרוקסי Residential לכל דבר מעבר לכמה עמודים. כתובות IP של דאטה-סנטר (AWS, GCP, Hetzner) .
  • סובבו session + IP יחד — YouTube קושר סשנים ל-IP, וקוקי של אותו סשן שמופיע בשתי כתובות IP הוא דגל אדום.

עבור requests + BS4: הגדירו את הקוקי CONSENT=YES+cb. בלעדיו, בקשות מהאיחוד האירופי יופנו לעמוד הסכמה בלי נתונים.

עבור Selenium/Playwright: הריצו במצב גלוי עם xvfb בשרתי Linux במקום --headless=new — Chrome ללא UI עדיין חושף מספיק טביעות אצבע לזיהוי מתקדם. שקלו את , שמיישם כ-17 מנגנוני התחמקות.

עבור yt-dlp: השתמשו באפשרויות sleep_interval ו-max_sleep_interval. התקינו את התוסף ליצירת PO Token. השתמשו ב---cookies-from-browser chrome עם חשבון חד-פעמי.

עבור ה-API: עקבו אחרי צריכת המכסה דרך ובצעו בקשות באצווה ביעילות. קריאה אחת ל-videos.list עם 50 מזהים מופרדים בפסיקים עולה 1 יחידה — נצלו את זה.

עבור Thunderbit: מנגנוני האנטי-בוט מטופלים אוטומטית כי הגרידה מתבצעת בתוך סשן הדפדפן שלכם. בפועל, אתם פשוט מבצעים אוטומציה למה שהייתם עושים ידנית.

האם חוקי לגרד את YouTube עם Python?

זה תלוי מה מגרדים, איך מגרדים, ומה עושים עם הנתונים.

הנוף המשפטי השתנה ב-2024 עם Meta Platforms v. Bright Data (מחוז צפון קליפורניה, ינואר 2024), שבו . גרידה של מידע נגיש לציבור הפכה ל"פחות מסוכנת משמעותית" אחרי הפסיקה הזו. מנגד, hiQ v. LinkedIn הסתיים ב- בשל הפרת תנאי שימוש, הפרות CFAA (חשבונות מזויפים), ו-trespass to chattels — בנוסף לצו מניעה קבוע.

תנאי השימוש של YouTube עצמם : "אינכם מורשים לגשת לשירות באמצעים אוטומטיים כלשהם (כגון רובוטים, בוטנטים או סקרייפרים)" אלא אם יש אישור כתוב מראש או אם הדבר מותר לפי הדין החל. YouTube Data API הוא הדרך הרשמית והמאושרת לגשת לנתונים.

כמה כללי אצבע פרקטיים:

  • גרידה של נתונים גלויים לציבור לצורכי מחקר אישי או ניתוח לא-מסחרי היא בדרך כלל בסיכון נמוך יותר
  • ה-API הוא המסלול הבטוח ביותר — הוא מורשה במפורש
  • הימנעו מגרידת תוכן פרטי/מאחורי התחברות, מהורדת סרטונים מוגנים בזכויות יוצרים לצורכי הפצה מחדש, או מהפרת GDPR באמצעות נתונים אישיים מתגובות
  • תגובות ב-YouTube מכילות מידע אישי לפי GDPR Art. 4(1) — התייחסו למידע של נושאי מידע מהאיחוד האירופי בזהירות
  • התייעצו עם יועץ משפטי עבור פרויקטים מסחריים

כל זה אינו ייעוץ משפטי. הנוף משתנה במהירות — גל חדש של שגרדו YouTube לצורכי אימון משנה את המפה ב-2025–2026.

איזו שיטה כדאי לבחור לגרידת YouTube עם Python?

מדריך ההחלטה:

  • צריך מטא־דאטה מהיר מכמה עמודים? → שיטה 1 (requests + BS4). מהירה, קלה, בלי תלויות מעבר ל-requests ו-beautifulsoup4.
  • צריך לגרד תוצאות חיפוש או לעבוד עם עמודים דינמיים? → שיטה 2 (Selenium/Playwright). רינדור מלא של דפדפן, תמיכה בגלילה אינסופית, אבל איטי ונוטה לזיהוי.
  • צריך מטא־דאטה בכמות, תגובות או תמלולים? → שיטה 3 (yt-dlp). הכלי הבודד הכי חזק — לא במקרה.
  • צריך נתונים מובנים ואמינים בקנה מידה בינוני? → שיטה 4 (YouTube Data API). רשמי, נקי, אבל מוגבל ל-.
  • צריך נתונים בתוך 2 דקות בלי לכתוב קוד?. מבוסס דפדפן, מונע AI, מייצא ל-Google Sheets בכמה לחיצות.

אין שיטה אחת שמכסה כל מקרה שימוש. שמרו לכם את טבלת ההשוואה ואת טבלת שדות הנתונים למעלה — הן יחסכו לכם זמן בפרויקט הבא. ואם תרצו להעמיק בעוד , יש לנו הרבה מדריכים בבלוג של Thunderbit, מ- ועד .

נסו את Thunderbit לגרידת YouTube

שאלות נפוצות

אפשר לגרד את YouTube בלי מפתח API?

כן. שיטות 1 (requests + BS4), 2 (Selenium/Playwright) ו-3 (yt-dlp) לא דורשות מפתח API. רק שיטה 4 (YouTube Data API) דורשת אחד. Thunderbit גם עובד בלי שום מפתח API — הוא מגרד ישירות בדפדפן שלכם.

מה הדרך המהירה ביותר לגרד את YouTube עם Python?

ב-Python, yt-dlp ו-requests + BS4 הם המהירים ביותר — שניהם עוקפים את העלות של הדפדפן ויכולים למשוך מטא־דאטה בתוך שניות לכל סרטון. yt-dlp מהיר במיוחד בעבודת אצווה כי הוא מטפל בדפדוף פנימי. למי שלא עובד עם Python, Thunderbit הוא המהיר ביותר בסך הכול כי אין זמן הקמה.

איך מגרדים תגובות מ-YouTube עם Python?

yt-dlp כולל חילוץ תגובות מובנה דרך האפשרות getcomments — זו הדרך הפשוטה ביותר. גם YouTube Data API תומך בתגובות דרך commentThreads.list (יחידת מכסה אחת לכל קריאה, עד 100 תגובות לעמוד). Selenium/Playwright יכולים טכנית לעשות זאת באמצעות גלילה וחילוץ אלמנטים מרונדרים של תגובות, אבל זה איטי ושביר.

אפשר לגרד YouTube Shorts עם Python?

כן. yt-dlp מתמודד היטב עם מטא־דאטה של Shorts — הוא מתייחס אליהם כסרטונים רגילים עם שדות ייעודיים נוספים ל-Shorts. ל-YouTube Data API יש תמיכה חלקית (ספירת הצפיות ב-Shorts — כעת כל התחלת נגינה/הפעלה חוזרת נספרת). ל-BS4 ול-Selenium/Playwright יש תמיכה מוגבלת ב-Shorts כי מדפי ה-Shorts משתמשים במבני DOM שונים.

כמה סרטוני YouTube אפשר לגרד ביום?

עם YouTube Data API אתם מוגבלים לכ-10,000 יחידות מכסה ביום. באמצעות קריאות videos.list באצווה (50 מזהים לקריאה ב-1 יחידה), זה יכול להגיע עד 500,000 בדיקות סטטוס של סרטונים ביום — אבל search.list שעולה 100 יחידות לקריאה שורף את התקציב מהר. בשיטות גרידה (BS4, Selenium, yt-dlp), המגבלה היא מעשית ולא קשיחה: חסימות IP בדרך כלל נכנסות לפעולה אחרי כמה מאות עד כמה אלפי בקשות לכל IP ביום, תלוי בהגדרת הפרוקסי ובדפוסי הבקשות. Thunderbit משתמש במערכת קרדיטים שקשורה ל- שלכם.

למידע נוסף

תוכן עניינים

נסה את Thunderbit

חלץ לידים ונתונים אחרים ב-2 קליקים בלבד. מופעל על ידי AI.

קבל את Thunderbit זה בחינם
חלץ נתונים באמצעות AI
העבר בקלות נתונים ל-Google Sheets, Airtable או Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week