إذا سبق لك أن جرّبت requests.get("https://www.youtube.com/...") ثم حلّلت النتيجة بـ BeautifulSoup بحثًا عن عناوين الفيديوهات، فأنت تعرف النتيجة مسبقًا: ستحصل على جدار من وسوم <div> فارغة، ومن دون أي بيانات مفيدة تقريبًا.
هذه أكثر مشكلة أراها تتكرر لدى المطورين الذين يحاولون استخراج بيانات YouTube لأول مرة. YouTube عبارة عن تطبيق أحادي الصفحة (SPA) — فهو يعرض معظم المحتوى من جهة العميل عبر JavaScript. الـ HTML الذي يصل إلى سكربت Python الخاص بك ليس سوى غلاف خارجي. أما عناوين الفيديوهات الفعلية، وعدد المشاهدات، والبيانات الوصفية؟ فهي مخبأة داخل كتلة JSON ضخمة تُسمّى ytInitialData، ويجري حقنها بواسطة JavaScript بعد تحميل الصفحة.
لذلك، عندما تستخدم soup.find("div", class_="ytd-video-renderer") ستحصل على None، لأن هذا العنصر ببساطة غير موجود في استجابة HTTP الخام. وبمجرد أن فهمت هذه النقطة، اتضحت الصورة كاملة — والطرق الأربع التالية هي نتيجة كثير من التجارب، وكثير من الأعطال، وكثير جدًا من صفحات GitHub issues. سأشرح لك كل أسلوب، وأوضح لك متى تستخدم كل واحد منها، وسأضيف في النهاية خيارًا بلا كود لمن يريد البيانات بسرعة من دون إعداد مشروع كامل.
لماذا نحتاج إلى استخراج بيانات YouTube باستخدام Python أصلًا؟
YouTube ليس مجرد منصة فيديو — بل هو مصدر بيانات ضخم يضم . ومع وجود أكثر من و، هناك كم هائل من المعلومات العامة التي ترغب الشركات والباحثون وصنّاع المحتوى في تحليلها برمجيًا.
لكن المشكلة أن تحليلات YouTube المدمجة تعرض بيانات قناتك أنت فقط. إذا أردت فهم وتيرة النشر لدى منافس، أو تتبع المواضيع الرائجة في مجالك، أو تحليل آراء الجمهور من تعليقات على فيديوهات الآخرين، فستحتاج إلى الاستخراج (scraping).
فيما يلي أكثر حالات الاستخدام الواقعية التي رأيتها:
| حالة الاستخدام | من يحتاجها | البيانات المطلوبة |
|---|---|---|
| تحليل المنافسين | فرق التسويق، مخططي المحتوى | عدد المشاهدات، وتيرة النشر، معدلات التفاعل |
| توليد العملاء المحتملين | فرق المبيعات، فرق التواصل B2B | معلومات التواصل الخاصة بالقناة، وبريد الأعمال في الوصف |
| أبحاث السوق | مدراء المنتجات، المحللون | المواضيع الرائجة، ومشاعر الجمهور عبر التعليقات |
| استراتيجية المحتوى | صناع محتوى YouTube، الوكالات | الصيغ الأعلى أداءً، وأنماط العناوين/الوسوم المثالية |
| تحسين محركات البحث / البحث بالكلمات المفتاحية | متخصصو SEO | عناوين الفيديوهات، الوسوم، الأوصاف، وإشارات الترتيب |
| مراقبة العلامة التجارية | فرق العلاقات العامة، مدراء العلامات التجارية | الإشارات إلى العلامة في العناوين والتعليقات والأوصاف |
| البحث الأكاديمي | الباحثون، علماء البيانات | مجموعات بيانات التعليقات لـ تحليل المشاعر (أظهرت دراسة في 2025 دقة وصلت إلى 93.1% بعد ضبط BERT على 45 ألف تعليق من YouTube) |
فعلى سبيل المثال، وجدت دراسة تحليلية تنافسية بين 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 مبني كتطبيق أحادي الصفحة (SPA). عندما تستخدم طلبات HTTP بسيطة، فأنت لا تحصل إلا على الغلاف الأولي للصفحة — أما المحتوى الفعلي فلم يُرسم بعد. بيانات الفيديو مخبأة داخل كائنات JavaScript كان المتصفح سيقوم عادةً بتنفيذها ثم حقنها في DOM.
الخبر الجيد: YouTube يفعل تضمين كل البيانات التي تحتاجها داخل HTML الخام. لكنها ليست داخل عناصر DOM، بل داخل كتلتين JSON موجودتين داخل وسوم <script>:
ytInitialData— بنية الصفحة، وقوائم الفيديوهات، ومقاييس التفاعل، ورموز استكمال التعليقاتytInitialPlayerResponse— البيانات الأساسية للفيديو (العنوان، الوصف، المدة، الصيغ، الترجمات)
كلاهما يمكن الوصول إليه عبر requests.get() واحدة — من دون الحاجة إلى متصفح — بمجرد أن تعرف كيف تستخرجهما وتفسيرهما. وهذه هي الطريقة الأولى أدناه.
4 طرق لاستخراج بيانات YouTube باستخدام Python: مقارنة مباشرة
قبل الدخول في كل طريقة، إليك مصفوفة القرار. لقد اختبرت الأساليب الأربعة جميعها، وقارنتها وفق المعايير التي تهم فعلًا عند اختيار أداة لمشروع حقيقي.
| المعيار | requests + BS4 (ytInitialData) | Selenium / Playwright | yt-dlp | YouTube Data API | بدون كود (Thunderbit) |
|---|---|---|---|---|---|
| تعقيد الإعداد | منخفض | متوسط | منخفض | متوسط (مفتاح API) | لا شيء |
| التعامل مع JavaScript | جزئي (تحليل JSON) | نعم | نعم | لا ينطبق (API منظّم) | نعم |
| السرعة | سريع | بطيء | سريع | سريع | سريع (سحابي) |
| خطر الحظر من البوتات | متوسط | مرتفع | منخفض | لا يوجد | مُدار |
| الحصص / حدود الطلبات | لا يوجد (لكن قد يُحظر IP) | لا يوجد (لكن هناك كشف) | لا يوجد | 10,000 وحدة يوميًا | قائم على الرصيد |
| استخراج التعليقات | صعب | ممكن لكنه معقد | مدمج | مدمج | يعتمد على الصفحة |
| النصوص/الترجمات | لا | معقد | نعم | لا | لا |
| الأفضل لـ | البيانات الوصفية السريعة | نتائج البحث والصفحات الديناميكية | بيانات وصفية جماعية + تعليقات | بيانات منظمة على نطاق واسع | غير المبرمجين والتصدير السريع |
ملخص سريع:

ما البيانات التي يمكنك استخراجها من YouTube فعلًا، وبأي طريقة؟
هذه هي المرجعية التي تمنيت لو كانت أمامي عندما بدأت. لا توجد طريقة واحدة تغطي كل الحقول — وهذا بالضبط سبب وجود أربع طرق في هذا المقال.
| حقل البيانات | BS4 (ytInitialData) | Selenium/Playwright | yt-dlp | YouTube API | Thunderbit |
|---|---|---|---|---|---|
| عنوان الفيديو | ✅ | ✅ | ✅ | ✅ | ✅ |
| عدد المشاهدات | ✅ | ✅ | ✅ | ✅ | ✅ |
| عدد الإعجابات | ⚠️ غير ثابت | ✅ | ✅ | ✅ | ✅ |
| التعليقات (نصية) | ❌ | ⚠️ معقد | ✅ | ✅ | ⚠️ |
| النص/الترجمة | ❌ | ⚠️ | ✅ | ❌ | ❌ |
| الوسوم | ✅ | ✅ | ✅ | ✅ | ⚠️ |
| روابط الصور المصغرة | ✅ | ✅ | ✅ | ✅ | ✅ |
| عدد المشتركين في القناة | ⚠️ | ✅ | ✅ | ✅ | ✅ |
| تاريخ النشر | ✅ | ✅ | ✅ | ✅ | ✅ |
| مدة الفيديو | ✅ | ✅ | ✅ | ✅ | ✅ |
| بيانات Shorts الخاصة | ❌ | ⚠️ | ✅ | ⚠️ | ⚠️ |
اختر الطريقة بناءً على الصفوف الأهم لمشروعك. إذا كنت تحتاج التعليقات والنصوص، فـ yt-dlp هو الخيار الأفضل بوضوح. إذا كنت تحتاج بيانات منظمة وعلى نطاق متوسط، فالـ API هو الأنسب. وإذا كنت تحتاج البيانات خلال دقيقتين، فتابع قراءة قسم Thunderbit.

الطريقة 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، وهي صفحة لا تحتوي أصلًا على ytInitialData.
الخطوة 2: تحليل HTML وتحديد سكربت ytInitialData
استخدم BeautifulSoup أو تعبيرًا منتظمًا للعثور على وسم <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)، وإعادة تصميم تبويب Videos في القناة (2022–2023: من gridRenderer إلى richGridRenderer). غالبًا ما تبدأ عناوين IP الخاصة بمراكز البيانات في التعرض للحظر الناعم بعد 50–200 طلب. لا تعليقات، ولا نصوص.
الطريقة 2: استخراج YouTube باستخدام 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 عبر 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: التعامل مع التمرير اللانهائي لتحميل المزيد من الفيديوهات
يستخدم YouTube التمرير اللانهائي في صفحات القنوات ونتائج البحث. إليك الحلقة القياسية scrollHeight، معدلة من :
1prev_height = -1
2max_scrolls = 20 # ضع حدًا هنا — قناة فيها 10 آلاف فيديو قد تستمر في التمرير إلى الأبد
3scroll_count = 0
4while scroll_count < 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، وهو ما تلتقطه . كما أنها تستهلك موارد كبيرة (كل نسخة متصفح تستخدم تقريبًا 200–500 MB من الذاكرة). بالنسبة إلى 100 فيديو، توقّع 3–8 دقائق بدلًا من ثوانٍ مع yt-dlp.
الطريقة 3: استخراج YouTube باستخدام Python عبر yt-dlp
يُعد yt-dlp السكين السويسري لاستخراج بيانات YouTube. إنه فرع مجتمعي من youtube-dl مع ، وإصدارات ليلية نشطة، ودعم مدمج للبيانات الوصفية والتعليقات والنصوص والاستخراج الدفعي — وكل ذلك من دون الحاجة إلى متصفح أو مفتاح 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 — وقد يستغرق فيديو يحتوي على 100 ألف تعليق ساعات. كما توثق حالات تنتهي فيها صلاحية روابط الصيغ بعد نحو 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", {})
17manuall_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 باستخدام YouTube Data API
يُعد YouTube Data API v3 الرسمي أكثر الطرق موثوقية وتنظيمًا للحصول على بيانات YouTube. الاستجابات JSON نظيفة، والحقول موثقة، ولا توجد لعبة شد وجذب مع أنظمة مكافحة البوتات. لكن هناك نقطة مهمة يغفل عنها معظم الشروحات: نظام الحصص (quota).
- مستوى الصعوبة: متوسط
- الوقت المطلوب: حوالي 20 دقيقة (بما في ذلك إعداد مفتاح API)
- ما تحتاجه: Python 3.10+، ومشروع Google Cloud، و
pip install google-api-python-client
الخطوة 1: الحصول على مفتاح YouTube Data API
- انتقل إلى
- أنشئ مشروعًا جديدًا (أو اختر مشروعًا موجودًا)
- انتقل إلى APIs & Services → Library ثم ابحث عن "YouTube Data API v3" واضغط Enable
- انتقل إلى APIs & Services → Credentials ثم Create Credentials → API Key
- انسخ المفتاح — ستحتاجه في الكود أدناه
الخطوة 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', 'مخفي')}")
13print(f"التعليقات: {video['statistics'].get('commentCount', 'معطلة')}")
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.list | 100 وحدة | 50 نتيجة |
videos.list | وحدة واحدة | 50 معرّف فيديو (دفعة واحدة) |
channels.list | وحدة واحدة | 50 معرّف قناة |
commentThreads.list | وحدة واحدة | 100 تعليق |
captions.list | 50 وحدة | لا ينطبق |
والآن الحساب. لنفترض أنك تريد استخراج 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: على نطاق صغير إلى متوسط، عندما تحتاج إلى بيانات منظمة وموثوقة، وعندما تكون التعليقات وإحصاءات القناة مهمة، وعندما يمكنك التعايش مع حد الحصة.
متى يكون الاستخراج المباشر أفضل: المشاريع واسعة النطاق (>10 آلاف فيديو/يوم)، أو الحقول التي لا يعرضها الـ API (النصوص الكاملة — فـ captions.download يتطلب OAuth وإذن مالك الفيديو)، أو عندما تحتاج أكثر من 500 نتيجة بحث لكل استعلام (وهو حد API ثابت بغض النظر عن ادعاء totalResults).
الاختصار بلا كود: استخراج YouTube باستخدام Thunderbit (من دون Python)
إذا كنت تحتاج Python ضمن خط بيانات، فاستخدم الطرق 1–4 أعلاه. لكن إذا كنت تحتاج بيانات YouTube خلال دقيقتين — ربما أنت مسوّق يريد سحب إحصاءات المنافسين، أو مطور يريد سحبًا سريعًا من دون إعداد بيئة مشروع — فهناك طريق أسرع.
هو إضافة Chrome لاستخراج الويب بالذكاء الاصطناعي صممناها خصيصًا للحالات التي يكون فيها كتابة الكود مبالغة لا داعي لها. يعمل مباشرة على صفحات YouTube داخل المتصفح.
كيفية استخراج YouTube باستخدام Thunderbit في 3 خطوات
الخطوة 1: ثبّت وافتح صفحة قناة على YouTube، أو صفحة نتائج البحث، أو صفحة فيديو.
الخطوة 2: انقر على "AI Suggest Fields" في الشريط الجانبي لـ Thunderbit. يقرأ الذكاء الاصطناعي الصفحة ويقترح أعمدة مثل عنوان الفيديو، وعدد المشاهدات، وتاريخ الرفع، والمدة، واسم القناة، ورابط الصورة المصغرة. يمكنك إضافة الأعمدة أو حذفها أو إعادة تسميتها حسب الحاجة.
الخطوة 3: انقر "Scrape" ثم صدّر النتائج إلى Google Sheets أو Excel أو CSV أو Airtable أو Notion. ستصل البيانات في جدول نظيف جاهز للاستخدام.
لمن هذا الخيار؟
- المسوقون الذين يحتاجون بيانات قنوات المنافسين لكن لا يبرمجون
- المطورون الذين يريدون سحبًا سريعًا للبيانات من دون إعداد بيئة افتراضية وتثبيت الاعتمادات
- أي شخص يصطدم بحواجز مكافحة البوتات — فـ Thunderbit يقوم بالاستخراج داخل جلسة المتصفح التي تستخدمها أنت، وبالتالي يرث ملفات الارتباط وPO tokens الخاصة بك. وهذا يتجاوز كثيرًا من مشكلات الحظر التي تزعج أدوات الاستخراج من جهة الخادم
- يمكن لـ Thunderbit أيضًا استخدام لزيارة كل صفحة فيديو وإثراء الجدول بمزيد من التفاصيل (مثل عدد الإعجابات، والوصف، والوسوم)
ولمزيد من التعمق في كيفية تعامل Thunderbit مع YouTube تحديدًا، راجع و.
نصائح لاستخراج YouTube باستخدام Python من دون حظر
تنطبق هذه النصائح على الطرق الأربع كلها. تُقدّر إجراءات مكافحة البوتات في YouTube بصعوبة ، مع ثلاثة مؤشرات رئيسية: تحليل سلوك IP، ومتطلبات تنفيذ JavaScript، وبنية HTML المتغيرة باستمرار.
لكل الطرق:
- بدّل User-Agent مع مجموعة الرؤوس كاملة — يجب أن تتطابق
AcceptوAccept-LanguageوSec-CH-UAمع الـ UA المعلن. لدى قائمة محدثة. - أضف تأخيرات عشوائية بين 2 و8 ثوانٍ بين الطلبات. الفواصل الثابتة إشارة كشف.
- استخدم بروكسيات سكنية لأي شيء يتجاوز بضع صفحات. عناوين IP الخاصة بمراكز البيانات (AWS وGCP وHetzner) .
- بدّل الجلسة وIP معًا — YouTube يربط الجلسات بـ IP، وظهور ملف تعريف ارتباط الجلسة نفسه من عنوانين مختلفين علامة حمراء.
لـ requests + BS4: اضبط ملف تعريف الارتباط CONSENT=YES+cb. من دونه، ستُعاد توجيه طلبات الاتحاد الأوروبي إلى صفحة موافقة بلا بيانات.
لـ Selenium/Playwright: شغّلهما في وضع مرئي باستخدام xvfb على خوادم Linux بدلًا من --headless=new — فما يزال Chrome بدون واجهة يترك إشارات بصمة كافية للكاشفات المتقدمة. فكّر في لأنه يطبّق نحو 17 إجراء إخفاء.
لـ yt-dlp: استخدم خيارات sleep_interval وmax_sleep_interval. وثبّت إضافة لتوليد PO Token. واستخدم --cookies-from-browser chrome بحساب مؤقت.
للـ API: راقب استهلاك الحصة عبر ونفّذ الطلبات بشكل دفعي بكفاءة. استدعاء واحد لـ videos.list مع 50 معرّفًا مفصولًا بفواصل يكلف وحدة واحدة — استخدمه.
لـ Thunderbit: تتم معالجة مكافحة البوتات تلقائيًا لأن الاستخراج يتم داخل جلسة المتصفح الخاصة بك. أنت عمليًا تؤتمت ما كنت ستفعله يدويًا.
هل استخراج YouTube باستخدام Python قانوني؟
يعتمد ذلك على ما الذي تستخرجه، وكيف تستخرجه، وماذا تفعل بالبيانات لاحقًا.
تغيّر المشهد القانوني في 2024 مع قضية Meta Platforms v. Bright Data (المحكمة الفدرالية الشمالية في كاليفورنيا، يناير 2024)، حيث . أصبح استخراج البيانات العامة المتاحة أقل خطورة بكثير بعد هذا الحكم. ومن ناحية أخرى، انتهت قضية hiQ v. LinkedIn بحكم قدره بسبب خرق شروط الخدمة، وانتهاكات CFAA (حسابات مزيفة)، والتعدي على الممتلكات المنقولة — بالإضافة إلى أمر قضائي دائم.
شروط استخدام YouTube نفسها : "لا يُسمح لك بالوصول إلى الخدمة باستخدام أي وسيلة آلية (مثل الروبوتات أو شبكات البوت أو أدوات الاستخراج)" إلا بإذن كتابي مسبق أو بما يسمح به القانون المطبق. وYouTube Data API هو الطريقة الرسمية المصرح بها للوصول إلى البيانات.
بعض القواعد العملية:
- استخراج البيانات العامة المرئية لأغراض البحث الشخصي أو التحليل غير التجاري يكون عادة أقل خطورة
- الـ API هو الطريق الأكثر أمانًا — لأنه مصرح به صراحة
- تجنب استخراج المحتوى الخاص أو المحمي بتسجيل دخول، أو تنزيل الفيديوهات المحمية بحقوق نشر لإعادة التوزيع، أو مخالفة GDPR عبر بيانات شخصية من التعليقات
- تعليقات YouTube تحتوي على بيانات شخصية وفق المادة 4(1) من GDPR — لذا يجب التعامل بحذر مع معلومات أشخاص الاتحاد الأوروبي
- استشر مستشارًا قانونيًا في مشاريع الاستخراج التجارية
وهذا ليس استشارة قانونية. المشهد يتغير بسرعة — فموجة جديدة من التي استخرجت بيانات YouTube لأغراض التدريب تعيد تشكيل المجال في 2025–2026.
أي طريقة يجب أن تستخدم لاستخراج YouTube باستخدام Python؟
دليل الاختيار:
- تحتاج بيانات وصفية سريعة من بضع صفحات؟ → الطريقة 1 (requests + BS4). سريعة، خفيفة، ولا تعتمد إلا على
requestsوbeautifulsoup4. - تحتاج إلى استخراج نتائج البحث أو التعامل مع صفحات ديناميكية؟ → الطريقة 2 (Selenium/Playwright). عرض كامل للمتصفح، ودعم للتمرير اللانهائي، لكن بطيئة وأكثر عرضة للكشف.
- تحتاج بيانات وصفية جماعية أو تعليقات أو نصوص؟ → الطريقة 3 (yt-dlp). الأداة الأقوى بين الخيارات الفردية — ولسبب وجيه لديها .
- تحتاج بيانات منظمة وموثوقة على نطاق متوسط؟ → الطريقة 4 (YouTube Data API). رسمية ونظيفة، لكنها محدودة بحصة .
- تحتاج البيانات خلال دقيقتين من دون كتابة كود؟ → . يعمل عبر المتصفح، ومدعوم بالذكاء الاصطناعي، ويصدّر إلى Google Sheets بنقرات.
لا توجد طريقة واحدة تغطي كل السيناريوهات. احفظ جدول المقارنة وجدول الحقول القابلة للاستخراج أعلاه — سيوفران عليك وقتًا في مشروعك التالي. وإذا أردت استكشاف المزيد من ، فلدينا الكثير من الأدلة على مدونة Thunderbit، من إلى .
الأسئلة الشائعة
هل يمكنني استخراج 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 معرّفًا لكل استدعاء مقابل وحدة واحدة)، قد تصل نظريًا إلى 500,000 عملية فحص إحصاءات فيديو يوميًا — لكن search.list يكلف 100 وحدة لكل استدعاء، مما يستهلك الرصيد بسرعة. أما في أساليب الاستخراج المباشر (BS4، Selenium، yt-dlp)، فالحد عملي أكثر منه ثابتًا: غالبًا ما تبدأ حواجز IP بعد بضع مئات إلى بضعة آلاف من الطلبات لكل IP يوميًا، اعتمادًا على إعداد البروكسي ونمط الطلبات. يستخدم Thunderbit نظام رصيد مرتبطًا بـ .
اعرف المزيد