أتمتة سحب بيانات المنافسين (Web Scraping) بطريقة قانونية


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

سنقوم ببناء سكربت بايثون احترافي لسحب بيانات المنافسين من الويب بطريقة قانونية وأخلاقية. سيتعلم هذا الدرس كيفية استخدام مكتبات Python مثل requests و BeautifulSoup4 لاستخراج معلومات محددة من صفحات الويب وتخزينها، مع التركيز على أهمية الالتزام بالمعايير القانونية والأخلاقية.

الاعتبارات القانونية والأخلاقية

قبل الشروع في سحب أي بيانات، من الضروري فهم والالتزام بالاعتبارات القانونية والأخلاقية. يجب عليك دائمًا التحقق من ملف robots.txt الخاص بالموقع المستهدف (عادةً على example.com/robots.txt) لمعرفة الصفحات التي يُسمح بسحبها. اقرأ شروط الخدمة (Terms of Service) للموقع، وتجنب سحب البيانات الشخصية. التزم بحدود المعدل (rate limiting) لتجنب إثقال خوادم الموقع، واستخدم تأخيرات بين الطلبات. استخدم User-Agent لتعريف طلباتك. سحب البيانات المتاحة للجمهور (publicly available data) بشكل معتدل وعن طريق محاكاة سلوك المستخدم الطبيعي هو المفتاح.

الأدوات والمكتبات المستخدمة

  • Python 3: لغة البرمجة الأساسية.
  • Requests: مكتبة لإنشاء طلبات HTTP (GET, POST, إلخ).
  • BeautifulSoup4: مكتبة لتحليل مستندات HTML و XML.
  • Pandas: (اختياري) لمعالجة وتخزين البيانات في هياكل سهلة الاستخدام مثل DataFrames وتصديرها إلى CSV/Excel.

إعداد بيئة العمل

للبدء، تأكد من تثبيت Python 3. ثم قم بتثبيت المكتبات المطلوبة باستخدام pip:

pip install requests beautifulsoup4 pandas

بناء سكربت سحب البيانات

سيبدأ سكربت Python الخاص بنا بطلب صفحة الويب، ثم تحليل محتواها للعثور على العناصر المطلوبة (مثل أسماء المنتجات وأسعارها). سنقوم بتخزين هذه البيانات في قائمة من القواميس ثم نحولها إلى ملف CSV.

ملاحظة تقنية: لاستخراج البيانات، ستحتاج إلى فحص بنية HTML للموقع المستهدف باستخدام أدوات المطور في متصفحك (Inspect Element). ابحث عن سمات CSS (مثل الفئات class أو المعرفات id) التي تميز البيانات التي تريد سحبها. السليكتورات المستخدمة في الكود أدناه هي أمثلة تحتاج إلى تعديل بناءً على الموقع الفعلي.

هذا مثال لسكربت يمكنه سحب أسماء المنتجات وأسعارها من صفحة ويب افتراضية:

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

def scrape_competitor_data(url):
    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'
    }
    
    # Introduce a random delay to be polite and avoid overwhelming the server
    time.sleep(random.uniform(2, 5)) 

    try:
        response = requests.get(url, headers=headers)
        response.raise_for_status() # Raise an exception for HTTP errors
    except requests.exceptions.RequestException as e:
        print(f"Error fetching {url}: {e}")
        return []

    soup = BeautifulSoup(response.text, 'html.parser')
    
    products_data = []
    
    # This is a hypothetical structure. You'll need to adjust these selectors 
    # based on the actual HTML structure of the target website.
    # Example: Looking for divs with class 'product-item'
    product_items = soup.find_all('div', class_='product-item') 
    
    if not product_items:
        print(f"No product items found on {url} with the specified selector.")
        
    for item in product_items:
        product_name_tag = item.find('h3', class_='product-name') # Assuming product name is in an h3 with class 'product-name'
        product_price_tag = item.find('span', class_='product-price') # Assuming price is in a span with class 'product-price'
        product_link_tag = item.find('a', class_='product-link') # Assuming product link is in an a tag with class 'product-link'

        name = product_name_tag.get_text(strip=True) if product_name_tag else 'N/A'
        price = product_price_tag.get_text(strip=True) if product_price_tag else 'N/A'
        link = product_link_tag['href'] if product_link_tag and 'href' in product_link_tag.attrs else 'N/A'
        
        products_data.append({
            'Product Name': name,
            'Price': price,
            'Link': link
        })
        
    return products_data

if __name__ == "__main__":
    target_url = "http://www.example.com/competitor-products" # REPLACE WITH ACTUAL COMPETITOR URL
    
    print(f"Starting to scrape data from: {target_url}")
    scraped_data = scrape_competitor_data(target_url)
    
    if scraped_data:
        df = pd.DataFrame(scraped_data)
        output_filename = "competitor_products.csv"
        df.to_csv(output_filename, index=False, encoding='utf-8')
        print(f"Successfully scraped {len(scraped_data)} products and saved to {output_filename}")
    else:
        print("No data was scraped.")

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

بعد تشغيل السكربت، سيتم إنشاء ملف CSV جديد باسم competitor_products.csv في نفس المجلد الذي يوجد به السكربت. سيحتوي هذا الملف على جدول منظم يضم أسماء المنتجات وأسعارها وروابطها (إذا تم العثور عليها) من صفحة المنافس المستهدفة. يمكنك بعد ذلك فتح هذا الملف باستخدام برامج جداول البيانات مثل Microsoft Excel أو Google Sheets لتحليل بيانات المنافسين.