شارك المقالة

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

يعتبر Scrapy من أقوى أدوات Web Scraping الموجودة ضمن مكتبات بايثون 3، حيث يوفر بيئة متكاملة لجمع البيانات من مواقع الويب بسرعة وكفاءة عالية.

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

بدلًا من نسخ الروابط يدويًا، يمكن الاعتماد على Scrapy لإنجاز هذه المهمة خلال ثوانٍ معدودة، مع إمكانية حفظ النتائج مباشرة داخل ملف JSON جاهز للاستخدام.

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

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

يتميز Scrapy بالعديد من المزايا التي تجعله الخيار الأول في مشاريع Web Scraping الاحترافية.

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

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

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

فكرة المشروع

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

وتتم العملية بالترتيب التالي:

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

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

إنشاء Spider جديد

يعتمد المشروع على Spider يحمل الاسم التالي:


name = "story"

ويمكن تشغيله باستخدام الأمر:


python3 -m scrapy crawl story

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

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

تم استخدام مجموعة من الإعدادات لتحسين عملية الاستخراج.

  • إيقاف التحقق من robots.txt.
  • تقليل عدد الطلبات المتزامنة.
  • إضافة Download Delay لتجنب إرسال عدد كبير من الطلبات في وقت قصير.

هذه الإعدادات تجعل عملية الـ Scraping أكثر استقرارًا خصوصًا عند التعامل مع مجلدات تحتوي على عدد كبير من الملفات.

تحديد Folder ID

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

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

كما يمكن تمرير Folder ID جديد أثناء تشغيل البرنامج دون الحاجة إلى تعديل الكود.

بدء عملية الاستخراج

تبدأ العملية داخل الدالة start_requests().

حيث يتم إنشاء رابط Google Drive بالشكل التالي:


https://drive.google.com/embeddedfolderview?id=FOLDER_ID#list

بعد إرسال الطلب يقوم Scrapy بتحميل الصفحة ثم استدعاء الدالة المسؤولة عن تحليل البيانات.

قراءة جميع الملفات داخل المجلد

بعد استلام الصفحة يبدأ Scrapy في البحث عن جميع العناصر التي تمثل الملفات باستخدام CSS Selector.

ثم يتم المرور على كل عنصر واستخراج الرابط الداخلي الخاص به.

كل ملف داخل Google Drive يحتوي على رابط يتضمن File ID وهو الجزء الأهم في المشروع.

استخراج File ID باستخدام Regular Expressions

بعد الحصول على الرابط يبدأ البرنامج في استخراج معرف الملف باستخدام التعبيرات النمطية (Regular Expressions).

وتعتبر هذه الطريقة الأسرع والأكثر دقة للحصول على File ID دون الحاجة إلى تحليل الرابط يدويًا.

إذا لم يتم العثور على معرف صحيح يتم تجاهل الملف والانتقال إلى الملف التالي.

إنشاء روابط Preview

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

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

وهذا يجعلها مناسبة جدًا لتطبيقات Flutter أو Android أو React أو حتى مواقع WordPress.

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


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

تجميع الروابط داخل قائمة

بدلًا من حفظ كل رابط مباشرة داخل الملف، يقوم البرنامج أولًا بتجميع جميع الروابط داخل List.

بعد انتهاء عملية القراءة بالكامل يتم إرسال هذه القائمة إلى الدالة المسؤولة عن حفظ البيانات.

هذه الطريقة تجعل الكود أكثر تنظيمًا وأسهل في التطوير مستقبلاً.

حفظ النتائج داخل JSON

بعد الانتهاء من استخراج جميع الروابط يبدأ البرنامج في إنشاء ملف JSON.

ويستخدم مكتبة JSON الموجودة داخل Python لحفظ البيانات مع تنسيق مرتب يسهل قراءته.

وسيكون شكل الملف مشابهًا لما يلي:


[
  "https://drive.google.com/file/d/1AbCdEfGhIj/preview",
  "https://drive.google.com/file/d/2KlMnOpQrSt/preview",
  "https://drive.google.com/file/d/3UvWxYz1234/preview"
]

هذا الملف يمكن استخدامه مباشرة داخل أي تطبيق أو رفعه إلى خادم ليعمل كواجهة بيانات بسيطة (JSON API).

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

يمكن الاستفادة من هذا الـ Spider في العديد من السيناريوهات العملية، مثل:

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

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

  • اجعل المجلد Public قبل تشغيل الـ Spider.
  • تحقق دائمًا من صحة Folder ID.
  • استخدم Download Delay مع المجلدات الكبيرة.
  • احفظ النتائج بصيغة JSON لسهولة استهلاكها.
  • أضف معالجة للأخطاء في حال عدم توفر الاتصال.
  • استخدم Logging لمراقبة عدد الملفات المستخرجة.
  • اجعل اسم ملف الإخراج متغيرًا لإعادة استخدام الكود بسهولة.

الخلاصة

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

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

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



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

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

الكودكامل

import json
import re

import scrapy

# python3 -m scrapy crawl story


class StorySpider(scrapy.Spider):
    name = "story"

    custom_settings = {
        "ROBOTSTXT_OBEY": False,
        "CONCURRENT_REQUESTS_PER_DOMAIN": 2,
        "DOWNLOAD_DELAY": 0.5,
    }

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

    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):
        links = []

        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

            links.append(self._build_preview_url(file_id))

        self.save_story_json(links)

    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 _build_preview_url(self, file_id):
        return f"https://drive.google.com/file/d/{file_id}/preview"

    def save_story_json(self, links):
        with open(self.output_file, "w", encoding="utf-8") as f:
            json.dump(links, f, ensure_ascii=False, indent=2)

        self.logger.info("تم حفظ %d رابط في الملف: %s", len(links), self.output_file)


لمزيد من المقالات : زر تسجيل صوتي مثل WhatsApp في Flutter باستخدام animated_chat_record_button
شاهد أيضًا
مقالات ذات صلة

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

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