Web Scraping تعلم كيفية استخدام الأدوات والتقنيات
تم التحديث: ٢٧ مارس ٢٠٢٦
ملخص
يستخرج كشط الويب (Web scraping) البيانات من المواقع باستخدام أدوات مثل Playwright (الخيار الافتراضي للمشاريع الجديدة في 2026)، وBeautiful Soup، وScrapy. يحترم الكشط الأخلاقي ملف robots.txt، وتحديد معدل الطلبات (rate limiting)، والشروط القانونية؛ بينما يتولى الاستخراج المدعوم بـ LLM التعامل مع البيانات غير المنظمة؛ وتظل البيانات المنظمة (JSON-LD، microdata) هي الأفضل دائمًا عند توفرها.
الويب مليء بالبيانات. قوائم الوظائف، أسعار المنتجات، قوائم العقارات، الأوراق البحثية — كلها محبوسة داخل HTML، تنتظر من يحللها. كشط الويب هو فن استخراج تلك البيانات برمجياً.
لكن كشط الويب يوجد في منطقة رمادية. بعض المواقع ترحب بالكاشطات (scrapers). والبعض الآخر يحظرها بشدة. تلوح في الأفق مخاوف تتعلق بحقوق النشر وشروط الخدمة. المسؤولية القانونية حقيقية.
في عام 2026، تطور مشهد الكشط. أصبحت أدوات مكافحة الكشط أكثر تطوراً. ولكن مكتبات الكشط تطورت أيضاً. أصبح Playwright الآن هو الخيار الافتراضي لأتمتة المتصفح لمعظم المشاريع الجديدة، بينما يظل Puppeteer بديلاً قوياً مخصصاً لـ Chrome فقط. فتحت نماذج اللغة الكبيرة (LLMs) إمكانيات جديدة لاستخراج البيانات من الصفحات غير المنظمة. وبشكل متزايد، يتساءل المطورون المسؤولون: "هل يجب أن أقوم بالكشط، أم يجب أن أستخدم API العام أو البيانات المنظمة بدلاً من ذلك؟"
يغطي هذا الدليل تقنيات الكشط الأخلاقي، والأدوات الحديثة، ومتى يجب تجنب الكشط.
الكشط الأخلاقي: الأساس
قبل كتابة سطر واحد من الكود، افهم المشهد الأخلاقي والقانوني.
احترام robots.txt
كل موقع ويب لديه ملف /robots.txt. وهو يحدد أجزاء الموقع المتاحة للكشط ومدى السرعة التي يجب أن تزحف بها.
# example.com/robots.txt
User-agent: *
Disallow: /admin/
Disallow: /cart/
Disallow: /checkout/
Crawl-delay: 10
# A specific bot can be granted (or denied) different access
User-agent: Googlebot
Allow: /
هذا يعني: "جميع البوتات، ابتعدوا عن /admin/، و /cart/، و /checkout/، وانتظروا 10 ثوانٍ على الأقل بين الطلبات. يُسمح لـ Googlebot بالدخول إلى كل مكان."
توجيه Crawl-delay هو تلميح غير قياسي ولكنه يحظى باحترام واسع. تفسره محركات البحث الكبرى بشكل مختلف (Google يتجاهله؛ Bing و Yandex يحترمانه)، لذا لا تعتمد عليه كعقد ملزم — أضف تأخيراتك الخاصة في الكود.
قم بجلب ملف robots.txt، وتحليله، واحترام قواعده:
from urllib.robotparser import RobotFileParser
rp = RobotFileParser()
rp.set_url('https://example.com/robots.txt')
rp.read()
if rp.can_fetch('MyScraperBot/1.0', 'https://example.com/page'):
print('OK to scrape')
else:
print('Not allowed by robots.txt')
تحديد معدل الطلبات (Rate Limiting)
حتى لو كان الكشط مسموحاً به، لا تضغط على الموقع بكثافة. أضف تأخيرات بين الطلبات.
import time
import requests
urls = ['https://example.com/page1', 'https://example.com/page2']
for url in urls:
response = requests.get(url)
process_response(response)
time.sleep(2) # 2-second delay between requests
الكاشط حسن السلوك يضيف:
- تأخيرات من 2 إلى 5 ثوانٍ بين الطلبات
- رأس
User-Agentيحدد هوية الكاشط الخاص بك - التراجع (Backing off) إذا تلقيت استجابات 429 (طلبات كثيرة جداً)
الاعتبارات القانونية
الكشط ليس غير قانوني في حد ذاته، ولكن هناك عدة عوامل تحدد قانونيته:
- شروط الخدمة: هل يمنع الموقع الكشط صراحة؟ إذا كان الأمر كذلك، فإن انتهاك شروط الخدمة ينطوي على مخاطر قانونية.
- حقوق النشر: يمكنك كشط المعلومات العامة، ولكن إعادة نشر المحتوى المحمي بحقوق النشر دون إذن يعد انتهاكاً.
- الاحتيال الحاسوبي: لا تتجاوز المصادقة أو CAPTCHA. لا تستخدم الكاشطات لارتكاب الاحتيال.
- حماية البيانات: إذا كانت البيانات تتضمن معلومات شخصية (عناوين بريد إلكتروني، أرقام هواتف)، فسيتم تطبيق قوانين GDPR والقوانين المماثلة.
الممارسات الآمنة:
- تحقق من ملف robots.txt وشروط الخدمة الخاصة بالموقع
- اكشط فقط ما تحتاجه
- لا تعد نشر المحتوى المحمي بحقوق النشر مباشرة
- استخدم البيانات المكشوطة للتحليل، وليس لإعادة التوزيع التجاري
- اطلب الإذن عند الشك
Playwright: المعيار الحديث
أصبح Playwright هو الخيار الافتراضي لأتمتة المتصفح لمعظم مشاريع الكشط الجديدة واختبارات النهاية إلى النهاية (end-to-end) في عام 2026. لا يزال Puppeteer متقدماً قليلاً في عدد نجوم GitHub الخام ويظل مناسباً جداً لأعباء العمل المخصصة لـ Chrome فقط، ولكن دعم Playwright من الدرجة الأولى لـ Chromium و Firefox و WebKit (محرك Safari)، بالإضافة إلى الارتباطات الرسمية لـ Python و Node.js و .NET و Java، يمنحه مساحة انتشار أوسع. إنه يتحكم في المتصفحات بدون واجهة رسومية (headless) ويتعامل مع المواقع التي تعتمد بكثافة على JavaScript بسهولة.
الاستخدام الأساسي
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto('https://example.com')
title = page.title()
print(title)
browser.close()
يقوم Playwright بتصيير JavaScript، والتعامل مع ملفات تعريف الارتباط (cookies)، وإدارة جلسات المتصفح. إنه مثالي لتطبيقات الصفحة الواحدة (single-page apps) والمحتوى الديناميكي.
كشط المحتوى الديناميكي
تحمل المواقع الحديثة البيانات عبر JavaScript. طلبات HTTP التقليدية تحصل فقط على HTML الأولي. ينتظر Playwright حتى يقوم JavaScript بالتصيير، ثم يلتقط الـ DOM المكتمل.
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
# Navigate and wait for data to load
page.goto('https://example.com/products')
page.wait_for_selector('.product-item') # Wait for products to load
# Extract product names and prices
products = page.query_selector_all('.product-item')
data = []
for product in products:
name = product.query_selector('.name').text_content()
price = product.query_selector('.price').text_content()
data.append({'name': name, 'price': price})
print(data)
browser.close()
تعتبر wait_for_selector() ضرورية — فهي تضمن انتهاء الصفحة من التحميل قبل استخراج البيانات.
التعامل مع إجراءات مكافحة البوتات
تحظر المواقع الكاشطات لحماية خوادمها. يساعدك Playwright في الالتفاف على ذلك:
# Add realistic delays
page.wait_for_timeout(1000) # 1 second delay
# Use a realistic User-Agent
context = browser.new_context(
user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
)
# Rotate through proxy servers (if heavily blocked)
context = browser.new_context(proxy={'server': 'http://proxy.example.com:8080'})
# Handle cookies and session state
context.add_cookies([{'name': 'session', 'value': 'abc123'}])
لكن احذر: إذا كان الموقع يحظر الكاشطات بنشاط باستخدام CAPTCHAs وحظر الـ IP، فإن تجاوز هذه الإجراءات قد ينتهك قوانين الاحتيال الحاسوبي. احترم نية الموقع في حظرك.
Beautiful Soup: تحليل HTML الثابت
بالنسبة للمواقع التي تقدم HTML كاملاً في الاستجابة الأولية (بدون JavaScript)، فإن Beautiful Soup خفيف وقوي.
from bs4 import BeautifulSoup
import requests
response = requests.get('https://example.com/products')
soup = BeautifulSoup(response.content, 'html.parser')
# Extract product elements
products = soup.find_all('div', class_='product')
for product in products:
name = product.find('h2').text
price = product.find('span', class_='price').text
print(f'{name}: {price}')
Beautiful Soup أبسط من Playwright، وأسرع، ويستهلك ذاكرة أقل. استخدمه للمواقع الثابتة؛ ووفر Playwright للمواقع الديناميكية.
Scrapy: الكشط على مستوى المؤسسات
Scrapy هو إطار عمل كامل الميزات لمشاريع الكشط واسعة النطاق. وهو يتولى:
- الطلبات المتزامنة (مواقع متعددة في وقت واحد)
- جدولة الطلبات وترتيب أولوياتها
- البرمجيات الوسيطة (Middleware) للتعامل مع ملفات تعريف الارتباط، والوكلاء (proxies)، ووكلاء المستخدم
- دعم مدمج لملف robots.txt وتحديد معدل الطلبات
- تصدير البيانات إلى CSV أو JSON أو قواعد البيانات
import scrapy
class ProductSpider(scrapy.Spider):
name = 'products'
start_urls = ['https://example.com/products']
def parse(self, response):
for product in response.css('div.product'):
yield {
'name': product.css('h2::text').get(),
'price': product.css('.price::text').get(),
}
# Follow pagination links
next_page = response.css('a.next::attr(href)').get()
if next_page:
yield response.follow(next_page, self.parse)
قم بتشغيله:
scrapy crawl products -o output.json
يعتبر Scrapy مبالغاً فيه للمشاريع التي تُنفذ لمرة واحدة، ولكنه ضروري لكشط المواقع الكبيرة التي تحتوي على ملايين الصفحات.
استخراج البيانات المدعوم بـ LLM
يمكن لنماذج اللغة الكبيرة استخراج بيانات منظمة من HTML غير منظم، مما يبسط كود الكشط بشكل كبير.
import anthropic
html = """
<div class="product">
<h2>MacBook Pro 16-inch</h2>
<span class="price">$1,999</span>
<p>Powerful laptop for developers and creators</p>
</div>
"""
client = anthropic.Anthropic()
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[
{
"role": "user",
"content": f"Extract product name, price, and description from this HTML:\n\n{html}"
}
]
)
print(message.content[0].text)
# Output:
# Product Name: MacBook Pro 16-inch
# Price: $1,999
# Description: Powerful laptop for developers and creators
تتعامل الـ LLMs مع HTML الفوضوي، والاختلافات في الهيكل، وأوصاف اللغة الطبيعية. إنها أبطأ وأكثر تكلفة من التحليل باستخدام regex ولكنها أكثر موثوقية بكثير.
البيانات المنظمة: البديل الأفضل
قبل الكشط، تحقق مما إذا كان الموقع يوفر بيانات منظمة. تدمج العديد من المواقع JSON-LD (البيانات المرتبطة) في الصفحة.
<script type="application/ld+json">
{
"@context": "https://schema.org/",
"@type": "Product",
"name": "MacBook Pro",
"offers": {
"@type": "Offer",
"price": "1999"
}
}
</script>
استخرجها:
import json
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
script = soup.find('script', {'type': 'application/ld+json'})
data = json.loads(script.string)
print(data['name']) # MacBook Pro
تعتبر JSON-LD أنظف وأسرع وأكثر أماناً من الناحية القانونية من تحليل HTML. استخدمها كلما كانت متاحة.
قائمة مرجعية للكشط المسؤول
- تحقق من ملف robots.txt — احترم تأخيرات الزحف والمسارات المحظورة
- اقرأ شروط خدمة الموقع — هل الكشط محظور صراحة؟
- أضف تأخيرات بين الطلبات (2-5 ثوانٍ كحد أدنى)
- حدد هوية الكاشط الخاص بك باستخدام رأس User-Agent
- تعامل مع تحديد معدل الطلبات بلباقة (تحقق من استجابات 429)
- احترم حقوق النشر — لا تعد نشر المحتوى بالكامل
- فكر في استخدام واجهات برمجة التطبيقات (APIs) العامة أو البيانات المنظمة بدلاً من ذلك
- تجنب كشط البيانات الشخصية؛ إذا كان ذلك ضرورياً، اتبع قواعد GDPR
- توقف إذا تم حظرك — لا تحاول تجاوز CAPTCHAs أو حظر الـ IP
- قم بتسجيل نشاط الكشط الخاص بك لأغراض التدقيق
الخاتمة
الـ Web scraping أداة قوية لاستخراج البيانات من الويب. لكن القوة بتيجي معاها مسؤولية. ابدأ دايماً بالتأكد من ملف robots.txt وشروط خدمة الموقع. اعمل Scrape باحترام — ضيف تأخيرات (delays)، عرّف نفسك، وانسحب لو تم حظرك.
اختار أداتك بذكاء: Playwright للمواقع الديناميكية، Beautiful Soup للـ HTML الثابت، Scrapy للمشاريع الضخمة، والـ LLMs للبيانات غير المنظمة. وقبل ما تكتب أي scraper، اسأل نفسك: "هل فيه API عامة أو بيانات منظمة ممكن أستخدمها بدلاً من كدة؟"
الخيط اللي بيفصل بين الـ scraping المحترم والإساءة رفيع جداً. خليك دايماً في الجانب الصح.