شارك المقالة

شرح Scrapy في Python 3 لاستخراج روابط الفيديوهات من Google Drive وحفظها داخل JSON

يعد Scrapy أحد أقوى أطر عمل Web Scraping الموجودة ضمن مكتبات بايثون 3، حيث يوفر أدوات احترافية تسمح باستخراج البيانات من صفحات الويب بسرعة عالية مع تنظيم ممتاز للكود وإدارة الطلبات بشكل تلقائي.

وفي الكثير من المشاريع الحديثة يتم استخدام Google Drive كمخزن للصور أو الفيديوهات، خصوصًا عند بناء تطبيقات Flutter أو Android أو مواقع الويب التي تحتاج إلى تحديث المحتوى باستمرار دون إعادة نشر التطبيق.

بدلًا من نسخ روابط الفيديوهات يدويًا، يمكن الاعتماد على Scrapy لاستخراج جميع الملفات الموجودة داخل مجلد Google Drive وتحويلها إلى ملف JSON يحتوي على أسماء الفيديوهات وروابط المعاينة الخاصة بها.

في هذا المقال سنتعرف على كيفية إنشاء Spider احترافي يقوم بقراءة جميع الفيديوهات داخل مجلد Google Drive، ثم استخراج اسم كل فيديو ورابط المعاينة (Preview URL) وحفظ النتائج داخل ملف JSON جاهز للاستخدام.

لماذا نستخدم Scrapy في هذا المشروع؟

يتميز Scrapy بالعديد من الإمكانيات التي جعلته من أكثر أدوات Web Scraping استخدامًا داخل مشاريع Python.

ومن أهم هذه المميزات:

  • تنفيذ سريع للطلبات.
  • استهلاك منخفض للذاكرة.
  • إدارة تلقائية للطلبات والاستجابات.
  • سهولة التعامل مع CSS Selectors.
  • تصدير البيانات إلى JSON وCSV وXML.
  • إمكانية إنشاء أكثر من Spider داخل نفس المشروع.

ولهذا السبب يعتبر من أهم مكتبات بايثون 3 المستخدمة في مشاريع استخراج البيانات والأتمتة.

فكرة المشروع

الفكرة تعتمد على قراءة مجلد عام داخل Google Drive يحتوي على مجموعة من الفيديوهات.

بعد ذلك يقوم Scrapy بتنفيذ الخطوات التالية:

  • فتح صفحة Embedded Folder الخاصة بالمجلد.
  • قراءة جميع الملفات الموجودة.
  • استخراج اسم كل فيديو.
  • استخراج File ID.
  • إنشاء رابط Preview لكل فيديو.
  • حفظ جميع النتائج داخل ملف JSON.

بهذه الطريقة يصبح لديك ملف بيانات يمكن استخدامه مباشرة داخل تطبيقات Flutter أو مواقع الويب أو أي نظام يعتمد على JSON.

إنشاء Spider جديد

تم إنشاء Spider باسم:


name = "video"

ولتشغيله يكفي تنفيذ الأمر التالي:


python3 -m scrapy crawl video

سيبدأ Scrapy مباشرة في قراءة محتويات المجلد ثم إنشاء ملف video.json تلقائيًا.

إعدادات Scrapy المستخدمة

تم استخدام بعض الإعدادات المهمة داخل المشروع لتحسين الأداء.

  • تعطيل ROBOTSTXT_OBEY.
  • تقليل عدد الطلبات المتزامنة.
  • إضافة Download Delay بين الطلبات.
  • تصدير النتائج مباشرة إلى ملف JSON.

هذه الإعدادات تساعد على تنفيذ عملية الاستخراج بطريقة مستقرة عند التعامل مع مجلدات كبيرة.

قراءة Folder ID

كل مجلد داخل Google Drive يمتلك معرفًا خاصًا يسمى Folder ID.

يقوم البرنامج باستخدام هذا المعرف لإنشاء رابط Embedded Folder الذي يعرض جميع الملفات داخل صفحة HTML يمكن لـ Scrapy تحليلها بسهولة.

كما يمكن تغيير Folder ID عند تشغيل البرنامج دون تعديل الكود، مما يجعل الـ Spider قابلًا لإعادة الاستخدام مع أي مجلد آخر.

بدء عملية Scraping

تبدأ عملية استخراج البيانات من خلال الدالة start_requests().

حيث يتم إرسال طلب إلى صفحة Google Drive الخاصة بالمجلد، وبعد استلام الصفحة يبدأ Scrapy في تحليل عناصر HTML واستخراج جميع الملفات.

وتعتبر هذه الطريقة مناسبة جدًا لأنها لا تعتمد على Google Drive API أو مفاتيح OAuth، مما يسهل استخدامها مع المجلدات العامة.

استخراج أسماء الفيديوهات

بعد قراءة جميع العناصر يبدأ البرنامج في استخراج اسم كل ملف.

ويحاول الكود الحصول على الاسم من أكثر من مكان داخل الصفحة لضمان نجاح العملية حتى إذا اختلفت طريقة عرض Google Drive.

هذا الأسلوب يجعل الـ Spider أكثر مرونة واستقرارًا مع التحديثات المستقبلية.

استخراج File ID

كل ملف داخل Google Drive يمتلك معرفًا فريدًا يسمى File ID.

يقوم البرنامج باستخدام Regular Expressions لاستخراج هذا المعرف من الرابط الأصلي.

وفي حالة عدم العثور على File ID يتم تجاهل الملف والانتقال إلى العنصر التالي.

ويعتبر File ID هو الجزء الأساسي المستخدم لإنشاء روابط المعاينة.

إنشاء روابط Preview

بعد استخراج File ID يقوم البرنامج بإنشاء رابط Preview لكل فيديو.

تسمح روابط Preview بعرض الفيديو مباشرة داخل التطبيق أو الموقع دون الحاجة إلى تنزيل الملف.

ويكون الرابط بالشكل التالي:


https://drive.google.com/file/d/FILE_ID/preview

يمكن استخدام هذا الرابط داخل Flutter WebView أو iframe أو أي مشغل فيديو يدعم روابط Google Drive.

تصدير النتائج إلى JSON

بعد الانتهاء من معالجة جميع الملفات يقوم Scrapy بحفظ النتائج داخل ملف JSON.

وسيكون شكل البيانات كما يلي:


[
  {
    "name": "video1.mp4",
    "url": "https://drive.google.com/file/d/FILE_ID/preview"
  },
  {
    "name": "video2.mp4",
    "url": "https://drive.google.com/file/d/FILE_ID/preview"
  }
]

يمكن بعد ذلك قراءة هذا الملف داخل أي تطبيق أو استخدامه كمصدر بيانات ديناميكي.

استخدامات عملية للمشروع

يمكن الاعتماد على هذا الـ Spider في العديد من المشاريع، مثل:

  • إنشاء مكتبة فيديوهات داخل تطبيق Flutter.
  • عرض الدروس التعليمية من Google Drive.
  • بناء منصة فيديوهات يتم تحديثها دون إعادة نشر التطبيق.
  • إنشاء API بسيط يعتمد على ملفات Google Drive.
  • ربط Google Drive مع لوحة تحكم لإدارة المحتوى.
  • عرض الفيديوهات داخل مواقع WordPress أو React.

أفضل الممارسات

  • اجعل المجلد عامًا (Public) قبل تشغيل الـ Spider.
  • تأكد من صحة Folder ID.
  • استخدم Logging لمراقبة عدد الملفات المستخرجة.
  • احتفظ بملف JSON داخل خادم يمكن للتطبيق الوصول إليه.
  • أضف معالجة للأخطاء في حالة انقطاع الاتصال.
  • يمكن إضافة فلترة لامتدادات الفيديو مثل MP4 وMOV وMKV إذا احتاج المشروع لذلك.

الخلاصة

يعتبر Scrapy واحدًا من أهم مكتبات بايثون 3 المستخدمة في مشاريع Web Scraping، ويمنح المطورين القدرة على استخراج البيانات من مصادر مختلفة بكفاءة وسرعة.

وفي هذا المشروع تعلمنا كيفية قراءة محتويات مجلد Google Drive، واستخراج أسماء الفيديوهات وروابط المعاينة الخاصة بها، ثم حفظ النتائج داخل ملف JSON يمكن استخدامه بسهولة داخل تطبيقات Flutter أو Android أو مواقع الويب.

كما يمكن تطوير هذا الـ Spider مستقبلًا ليشمل تصنيف الفيديوهات، واستخراج معلومات إضافية مثل حجم الملف أو تاريخ الإنشاء، أو حتى إنشاء واجهة API متكاملة تعتمد على Google Drive كمصدر رئيسي للمحتوى.



رابط المكتبة
Scrapy

لمزيد من المقالات : تعلم المزيد عن Python وWeb Scraping وFlutter



الكود كامل
import re

import scrapy


class VideoSpider(scrapy.Spider):
    name = "video"

    custom_settings = {
        "ROBOTSTXT_OBEY": False,
        "CONCURRENT_REQUESTS_PER_DOMAIN": 2,
        "DOWNLOAD_DELAY": 0.5,
        "FEEDS": {
            "video.json": {
                "format": "json",
                "encoding": "utf-8",
                "overwrite": True,
                "store_empty": True,
            }
        },
    }

    def __init__(self, folder_id=None, **kwargs):
        super().__init__(**kwargs)
        self.folder_id = folder_id or "###"

    def start_requests(self):
        url = f"https://drive.google.com/embeddedfolderview?id={self.folder_id}#list"
        yield scrapy.Request(url, callback=self.parse_files)

    def parse_files(self, response):
        entries = response.css("div.flip-entry")
        self.logger.info("عدد العناصر التي تم العثور عليها: %d", len(entries))

        for entry in entries:
            href = entry.css("a::attr(href)").get("")
            file_id = self._extract_file_id(href)
            if not file_id:
                continue

            name = self._extract_name(entry)
            if not name:
                continue

            yield {
                "name": name,
                "url": self._build_preview_url(file_id),
            }

    def _extract_file_id(self, href):
        match = re.search(r"/file/d/([a-zA-Z0-9_-]+)/", href)
        return match.group(1) if match else None

    def _extract_name(self, entry):
        name = entry.css("a::attr(title)").get()
        if not name:
            name = entry.css("a::text").get()
        if not name:
            name = entry.css("::text").get()
        return name.strip() if name else None

    def _build_preview_url(self, file_id):
        return f"https://drive.google.com/file/d/{file_id}/preview"
لمزيد من المقالات : مشروع Flutter MESH Onboarding لتغيير تحربه صفحه البدايه ثلاثية الأبعاد تغير انطباع المستخدم

مزيد من المقالات : شرح React createAsyncThunk لجلب البيانات من API وعرض حالات التحميل والنجاح والفشل
شاهد أيضًا
مقالات ذات صلة

🚫 مانع الإعلانات مفعل

يجب إيقاف مانع الإعلانات لاستكمال تصفح الموقع