تحليل الـ Meta Tags لآلاف الصفحات بضغطة زر


ماذا سنبني اليوم؟

سنتعلم كيفية بناء سكريبت بايثون قوي يمكنه الزحف إلى قائمة من آلاف الصفحات، استخراج وتحليل الـ Meta Tags الأساسية (مثل العنوان، الوصف، Open Graph Tags، وCanonical URL)، ومن ثم تصدير هذه البيانات إلى ملف CSV منظم. كل هذا بضغطة زر واحدة، مما يوفر ساعات من العمل اليدوي ويساعد في تحديد مشاكل الـ SEO بسرعة.

المتطلبات المسبقة

  • تثبيت Python 3 على جهازك.
  • تثبيت المكتبات التالية: requests، BeautifulSoup4، pandas. يمكنك تثبيتها باستخدام pip:
    pip install requests beautifulsoup4 pandas
  • ملف نصي (مثل urls.txt) يحتوي على قائمة الـ URLs التي ترغب في تحليلها، كل URL في سطر جديد.

شرح الكود

السكريبت سيعمل على الخطوات التالية:

  1. قراءة الـ URLs: سيقرأ السكريبت قائمة الـ URLs من ملف urls.txt.
  2. الزحف للصفحات: لكل URL، سيقوم السكريبت بإرسال طلب HTTP للحصول على محتوى الصفحة.
  3. تحليل الـ Meta Tags: باستخدام مكتبة Beautiful Soup، سيتم تحليل HTML للصفحة لاستخراج الـ Meta Tags المطلوبة.
  4. تجميع البيانات: سيتم تجميع البيانات المستخرجة في قائمة من القواميس.
  5. تصدير البيانات: سيتم تحويل القائمة إلى DataFrame باستخدام مكتبة Pandas، ثم تصديرها إلى ملف CSV.

ملاحظة تقنية هامة: لآلاف الصفحات، من الضروري إضافة تأخير (time.sleep()) بين الطلبات لتجنب حظر الـ IP الخاص بك من قبل الخادم ولتكون مهذبًا مع الخادم. كما يجب التعامل مع الأخطاء مثل الصفحات غير الموجودة (404) أو مشاكل الاتصال.

الكود كاملاً

import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
import os

def get_meta_tags(url):
    """
    يستخرج الـ Meta Tags الأساسية من صفحة ويب.
    """
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    }
    try:
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status() # يرفع استثناء لأخطاء HTTP (4xx أو 5xx)
        soup = BeautifulSoup(response.text, 'html.parser')

        title_tag = soup.find('title')
        title = title_tag.get_text(strip=True) if title_tag else ''

        description_tag = soup.find('meta', attrs={'name': 'description'})
        description = description_tag['content'].strip() if description_tag and 'content' in description_tag.attrs else ''

        keywords_tag = soup.find('meta', attrs={'name': 'keywords'})
        keywords = keywords_tag['content'].strip() if keywords_tag and 'content' in keywords_tag.attrs else ''

        og_title_tag = soup.find('meta', attrs={'property': 'og:title'})
        og_title = og_title_tag['content'].strip() if og_title_tag and 'content' in og_title_tag.attrs else ''

        og_description_tag = soup.find('meta', attrs={'property': 'og:description'})
        og_description = og_description_tag['content'].strip() if og_description_tag and 'content' in og_description_tag.attrs else ''

        og_url_tag = soup.find('meta', attrs={'property': 'og:url'})
        og_url = og_url_tag['content'].strip() if og_url_tag and 'content' in og_url_tag.attrs else ''

        og_image_tag = soup.find('meta', attrs={'property': 'og:image'})
        og_image = og_image_tag['content'].strip() if og_image_tag and 'content' in og_image_tag.attrs else ''

        canonical_tag = soup.find('link', attrs={'rel': 'canonical'})
        canonical_url = canonical_tag['href'].strip() if canonical_tag and 'href' in canonical_tag.attrs else ''

        robots_tag = soup.find('meta', attrs={'name': 'robots'})
        robots = robots_tag['content'].strip() if robots_tag and 'content' in robots_tag.attrs else ''

        return {
            'URL': url,
            'Title': title,
            'Description': description,
            'Keywords': keywords,
            'OG Title': og_title,
            'OG Description': og_description,
            'OG URL': og_url,
            'OG Image': og_image,
            'Canonical URL': canonical_url,
            'Robots': robots,
            'Status Code': response.status_code,
            'Error': ''
        }
    except requests.exceptions.RequestException as e:
        print(f"Error fetching {url}: {e}")
        return {
            'URL': url,
            'Title': '',
            'Description': '',
            'Keywords': '',
            'OG Title': '',
            'OG Description': '',
            'OG URL': '',
            'OG Image': '',
            'Canonical URL': '',
            'Robots': '',
            'Status Code': e.response.status_code if e.response is not None else 'N/A',
            'Error': str(e)
        }
    except Exception as e:
        print(f"An unexpected error occurred for {url}: {e}")
        return {
            'URL': url,
            'Title': '',
            'Description': '',
            'Keywords': '',
            'OG Title': '',
            'OG Description': '',
            'OG URL': '',
            'OG Image': '',
            'Canonical URL': '',
            'Robots': '',
            'Status Code': 'N/A',
            'Error': str(e)
        }

def main():
    urls_file = 'urls.txt'
    output_file = 'meta_tags_analysis.csv'
    delay_between_requests = 0.5 # ثواني

    if not os.path.exists(urls_file):
        print(f"Error: {urls_file} not found. Please create it with one URL per line.")
        return

    with open(urls_file, 'r', encoding='utf-8') as f:
        urls = [line.strip() for line in f if line.strip()]

    print(f"Found {len(urls)} URLs to process.")
    
    all_meta_data = []
    for i, url in enumerate(urls):
        print(f"Processing ({i+1}/{len(urls)}): {url}")
        meta_data = get_meta_tags(url)
        all_meta_data.append(meta_data)
        time.sleep(delay_between_requests) # تأخير لتجنب الضغط على الخادم

    df = pd.DataFrame(all_meta_data)
    df.to_csv(output_file, index=False, encoding='utf-8-sig')
    print(f"\nAnalysis complete! Data saved to {output_file}")

if __name__ == "__main__":
    main()

كيفية التشغيل

  1. احفظ الكود أعلاه في ملف باسم seo_meta_analyzer.py.
  2. أنشئ ملفاً جديداً في نفس المجلد باسم urls.txt وضع فيه قائمة الـ URLs التي تريد تحليلها، كل URL في سطر منفصل.
  3. افتح سطر الأوامر (Command Prompt أو Terminal) وانتقل إلى المجلد الذي حفظت فيه الملفات.
  4. شغل السكريبت باستخدام الأمر:
    python seo_meta_analyzer.py

النتيجة النهائية المتوقعة

بعد تشغيل السكريبت بنجاح، ستجد ملفاً جديداً باسم meta_tags_analysis.csv في نفس المجلد الذي يحتوي على السكريبت. هذا الملف سيحتوي على جدول منظم بجميع البيانات المستخرجة لكل URL، بما في ذلك:

  • URL: عنوان الصفحة.
  • Title: محتوى وسم <title>.
  • Description: محتوى وسم <meta name="description">.
  • Keywords: محتوى وسم <meta name="keywords"> (إن وجد).
  • OG Title: عنوان Open Graph.
  • OG Description: وصف Open Graph.
  • OG URL: رابط Open Graph.
  • OG Image: رابط صورة Open Graph.
  • Canonical URL: رابط الكنسي (Canonical URL).
  • Robots: محتوى وسم <meta name="robots">.
  • Status Code: رمز حالة استجابة HTTP (مثل 200 لنجاح، 404 لغير موجود).
  • Error: أي رسالة خطأ حدثت أثناء معالجة الـ URL.

يمكنك فتح هذا الملف باستخدام أي برنامج جداول بيانات (مثل Microsoft Excel أو Google Sheets) لتحليل البيانات وتحديد الصفحات التي تحتاج إلى تحسين Meta Tags الخاصة بها.