ماذا سنبني اليوم؟
اليوم، سنتعلم كيفية ربط أداة Screaming Frog الشهيرة لتحليل مواقع الويب مع لغة Python القوية لتحقيق أتمتة متقدمة في تحليل بيانات الـ SEO. سنقوم بإنشاء سكربت Python يمكنه قراءة تقارير Screaming Frog المُصدرة، ومن ثم تحليل هذه البيانات لتحديد المشكلات الشائعة في الـ SEO مثل العناوين المكررة، الصفحات التي تفتقر إلى H1، أو الأخطاء في أكواد الحالة، مما يوفر لك الوقت ويقدم رؤى قابلة للتنفيذ بسرعة.
الخطوة 1: إعداد Screaming Frog للتصدير
قبل البدء بكتابة أي كود، تحتاج إلى إجراء مسح (crawl) لموقع الويب الخاص بك باستخدام Screaming Frog وتصدير البيانات التي ترغب في تحليلها. للحصول على أفضل النتائج لهذا الدرس، سنركز على بيانات HTML الداخلية.
- قم بتشغيل Screaming Frog وأدخل عنوان URL للموقع الذي تريد فحصه.
- بعد اكتمال الفحص، اذهب إلى
File > Export > Internal HTMLأوReports > All Inlinksأو أي تقرير آخر يهمك. - احفظ الملف بصيغة CSV في مجلد يسهل الوصول إليه، على سبيل المثال،
screaming_frog_data.csv.
ملاحظة تقنية: تأكد من أن التقرير المُصدر يحتوي على الأعمدة الأساسية التي ستحتاجها للتحليل، مثلAddressوStatus CodeوTitle 1وH1-1. يمكنك تخصيص الأعمدة المعروضة في Screaming Frog قبل التصدير.
الخطوة 2: إعداد بيئة Python
سنحتاج إلى مكتبة pandas في Python لمعالجة البيانات بشكل فعال. إذا لم تكن مثبتة لديك، يمكنك تثبيتها باستخدام pip:
pip install pandas openpyxl
الخطوة 3: قراءة وتحليل بيانات Screaming Frog باستخدام Python
الآن، سنقوم بكتابة سكربت Python الذي سيقوم بقراءة ملف CSV المُصدّر من Screaming Frog، ثم يقوم بتحليل بعض المشكلات الشائعة في الـ SEO.
import pandas as pd
# تحديد مسار ملف CSV الخاص بـ Screaming Frog
csv_file_path = 'screaming_frog_data.csv'
# قراءة ملف CSV في DataFrame
# قد تحتاج إلى تحديد ترميز (encoding) مختلف إذا واجهت أخطاء (مثل 'latin1' أو 'cp1252')
try:
df = pd.read_csv(csv_file_path)
except UnicodeDecodeError:
df = pd.read_csv(csv_file_path, encoding='latin1')
print(f"تم تحميل {len(df)} صفحة من بيانات Screaming Frog.")
# --- تحليلات SEO شائعة ---
# 1. الصفحات التي تفتقر إلى H1
# تأكد من أن اسم العمود 'H1-1' يتطابق مع ملف CSV الخاص بك
missing_h1 = df[df['H1-1'].isna() | (df['H1-1'] == '')]
print(f"\nعدد الصفحات التي تفتقر إلى H1: {len(missing_h1)}")
if not missing_h1.empty:
print("أمثلة على الصفحات التي تفتقر إلى H1:")
print(missing_h1[['Address', 'Title 1']].head())
# 2. العناوين المكررة (Title Tags)
# تأكد من أن اسم العمود 'Title 1' يتطابق مع ملف CSV الخاص بك
duplicate_titles = df[df['Title 1'].duplicated(keep=False)].sort_values(by='Title 1')
print(f"\nعدد الصفحات ذات العناوين المكررة: {len(duplicate_titles)}")
if not duplicate_titles.empty:
print("أمثلة على العناوين المكررة:")
# تجميع العناوين المكررة وعرض الروابط المرتبطة بها
for title, group in duplicate_titles.groupby('Title 1'):
if len(group) > 1:
print(f" العنوان: '{title}' يوجد في الصفحات:")
for address in group['Address']:
print(f" - {address}")
# 3. الصفحات ذات أكواد الحالة 4xx أو 5xx
# تأكد من أن اسم العمود 'Status Code' يتطابق مع ملف CSV الخاص بك
error_pages = df[df['Status Code'].astype(str).str.startswith(('4', '5'))]
print(f"\nعدد الصفحات ذات أكواد الحالة 4xx أو 5xx: {len(error_pages)}")
if not error_pages.empty:
print("أمثلة على الصفحات ذات الأخطاء:")
print(error_pages[['Address', 'Status Code', 'Status']].head())
# 4. الصفحات ذات الوصف التعريفي (Meta Description) المفقود أو القصير/الطويل
# تأكد من أن اسم العمود 'Meta Description 1' يتطابق مع ملف CSV الخاص بك
# الطول المثالي للوصف التعريفي يتراوح بين 50-160 حرفاً
# تحويل القيم الفارغة إلى سلاسل نصية فارغة لتجنب الأخطاء في الدالة len()
df['Meta Description 1'] = df['Meta Description 1'].fillna('')
missing_meta_description = df[df['Meta Description 1'] == '']
print(f"\nعدد الصفحات التي تفتقر إلى وصف تعريفي: {len(missing_meta_description)}")
if not missing_meta_description.empty:
print("أمثلة على الصفحات التي تفتقر إلى وصف تعريفي:")
print(missing_meta_description[['Address', 'Title 1']].head())
# الصفحات ذات الوصف التعريفي القصير جداً (أقل من 50 حرفاً)
short_meta_description = df[(df['Meta Description 1'].str.len() > 0) & (df['Meta Description 1'].str.len() < 50)]
print(f"\nعدد الصفحات ذات الوصف التعريفي القصير جداً: {len(short_meta_description)}")
if not short_meta_description.empty:
print("أمثلة على الصفحات ذات الوصف التعريفي القصير:")
print(short_meta_description[['Address', 'Meta Description 1']].head())
# الصفحات ذات الوصف التعريفي الطويل جداً (أكثر من 160 حرفاً)
long_meta_description = df[df['Meta Description 1'].str.len() > 160]
print(f"\nعدد الصفحات ذات الوصف التعريفي الطويل جداً: {len(long_meta_description)}")
if not long_meta_description.empty:
print("أمثلة على الصفحات ذات الوصف التعريفي الطويل:")
print(long_meta_description[['Address', 'Meta Description 1']].head())
# --- تصدير النتائج إلى ملف Excel ---
with pd.ExcelWriter('seo_analysis_report.xlsx', engine='openpyxl') as writer:
df.to_excel(writer, sheet_name='All Data', index=False)
if not missing_h1.empty:
missing_h1.to_excel(writer, sheet_name='Missing H1', index=False)
if not duplicate_titles.empty:
# يمكن أن يكون هذا معقدًا بعض الشيء لتصديره مباشرة بنفس طريقة العرض أعلاه
# للحفاظ على البساطة، سنقوم بتصدير DataFrame الأصلي للعناوين المكررة
duplicate_titles.to_excel(writer, sheet_name='Duplicate Titles', index=False)
if not error_pages.empty:
error_pages.to_excel(writer, sheet_name='Error Pages (4xx_5xx)', index=False)
if not missing_meta_description.empty:
missing_meta_description.to_excel(writer, sheet_name='Missing Meta Desc', index=False)
if not short_meta_description.empty:
short_meta_description.to_excel(writer, sheet_name='Short Meta Desc', index=False)
if not long_meta_description.empty:
long_meta_description.to_excel(writer, sheet_name='Long Meta Desc', index=False)
print("\nتم إنشاء تقرير التحليل في 'seo_analysis_report.xlsx'")
ملاحظة تقنية: أسماء الأعمدة مثل'H1-1'،'Title 1'،'Status Code'، و'Meta Description 1'يجب أن تتطابق تمامًا مع أسماء الأعمدة في ملف CSV الذي صدرته من Screaming Frog. إذا كانت مختلفة، قم بتعديلها في الكود لتناسب ملفك.
الخطوة 4: تحليل متقدم (اختياري)
يمكنك توسيع هذا السكربت ليشمل تحليلات أكثر تعقيدًا:
- الدمج مع واجهات برمجة تطبيقات أخرى: يمكنك جلب بيانات من Google Analytics أو Google Search Console باستخدام Python ودمجها مع بيانات Screaming Frog للحصول على رؤى أعمق حول أداء الصفحات.
- التعلم الآلي: تطبيق نماذج تعلم آلي لتصنيف جودة المحتوى أو التنبؤ بالصفحات التي تحتاج إلى تحسين.
- إنشاء تقارير آلية: استخدام مكتبات مثل
Jinja2لإنشاء تقارير HTML أو PDF مخصصة وجذابة بصريًا. - التصور البياني: استخدام مكتبات مثل
MatplotlibأوSeabornلإنشاء رسوم بيانية تفاعلية تعرض توزيع المشكلات أو اتجاهات الأداء.
النتيجة النهائية المتوقعة
بعد تشغيل سكربت Python هذا، ستظهر لك في نافذة الطرفية (Terminal) ملخصات فورية للمشكلات الرئيسية في الـ SEO التي تم العثور عليها في بيانات Screaming Frog (مثل عدد الصفحات التي تفتقر إلى H1، أو الصفحات ذات العناوين المكررة، أو الصفحات التي بها أخطاء). بالإضافة إلى ذلك، سيتم إنشاء ملف Excel جديد يسمى seo_analysis_report.xlsx في نفس المجلد الذي يوجد به سكربت Python. سيحتوي هذا الملف على عدة أوراق عمل (sheets)، كل منها مخصص لنوع معين من المشاكل المكتشفة (مثل ورقة لـ 'Missing H1'، ورقة لـ 'Duplicate Titles'، وهكذا)، مما يسهل عليك مراجعة وتحديد أولويات مهام التحسين.