Web Scraping تعلم كيفية استخدام الأدوات والتقنيات
تم التحديث: ٢٧ مارس ٢٠٢٦
ملخص
استخراج البيانات من الويب (Web scraping) هو عملية استخلاص البيانات من المواقع باستخدام أدوات مثل Playwright (الأفضل في فئته)، وBeautiful Soup، وScrapy. الاستخراج الأخلاقي يحترم ملف robots.txt، وتحديد معدل الطلبات (rate limiting)، والشروط القانونية؛ كما أن الاستخراج المدعوم بالنماذج اللغوية الكبيرة (LLM) يتعامل مع البيانات غير المنظمة؛ وتظل البيانات المنظمة (JSON-LD، microdata) هي الخيار الأفضل دائماً عند توفرها.
الويب مليء بالبيانات. قوائم الوظائف، أسعار المنتجات، إعلانات العقارات، الأوراق البحثية — كلها محاصرة داخل HTML، وتنتظر من يحللها. استخراج البيانات من الويب هو فن استخلاص تلك البيانات برمجياً.
لكن استخراج البيانات من الويب يوجد في منطقة رمادية. بعض المواقع ترحب بالمستخرجين، بينما تحظرهم مواقع أخرى بشراسة. تلوح في الأفق مخاوف تتعلق بحقوق الطبع والنشر وشروط الخدمة، والمسؤولية القانونية حقيقية.
في عام 2026، تطور مشهد استخراج البيانات. أصبحت أدوات مكافحة الاستخراج أكثر تطوراً، لكن مكتبات الاستخراج تطورت أيضاً. برز Playwright كأداة مهيمنة لأتمتة المتصفحات. وفتحت النماذج اللغوية الكبيرة (LLMs) إمكانيات جديدة لاستخراج البيانات من الصفحات غير المنظمة. وبشكل متزايد، يتساءل المطورون المسؤولون: "هل يجب أن أقوم بالاستخراج، أم يجب أن أستخدم API العام أو البيانات المنظمة بدلاً من ذلك؟"
يغطي هذا الدليل تقنيات الاستخراج الأخلاقية، والأدوات الحديثة، ومتى يجب الامتناع عن الاستخراج.
الاستخراج الأخلاقي: الأساس
قبل كتابة سطر واحد من الكود، افهم المشهد الأخلاقي والقانوني.
احترام robots.txt
كل موقع ويب لديه ملف /robots.txt. وهو يحدد أجزاء الموقع المتاحة للاستخراج ومدى السرعة التي يجب أن تزحف بها.
# amazon.com/robots.txt
User-agent: *
Disallow: /s
Disallow: /gp/
Disallow: /*/dp/
Disallow: /cart/
# Googlebot is allowed everywhere; others are restricted
User-agent: Googlebot
Disallow:
هذا يعني: "أيها المستخرجون العامون، لا تستخرجوا من /s (البحث)، أو /gp/ (الصفحات)، أو /*/dp/ (تفاصيل المنتج). أما Googlebot، فأنت مسموح لك."
قم بجلب ملف robots.txt، وتحليله، واحترام قواعده:
import requests
from urllib.robotparser import RobotFileParser
rp = RobotFileParser('https://example.com/robots.txt')
rp.read()
if rp.can_fetch('*', 'https://example.com/page'):
print('OK to scrape')
else:
print('Not allowed by robots.txt')
تحديد معدل الطلبات
حتى لو كان الاستخراج مسموحاً به، لا تضغط على الموقع بكثافة. أضف تأخيرات بين الطلبات.
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 أفضل أداة لأتمتة المتصفحات في عام 2026. فهو يتحكم في المتصفحات بدون واجهة رسومية (Chrome، Firefox، Safari) ويتعامل مع المواقع التي تعتمد بكثافة على 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)، وإدارة جلسات المتصفح. إنه مثالي لتطبيقات الصفحة الواحدة والمحتوى الديناميكي.
استخراج المحتوى الديناميكي
تحمل المواقع الحديثة البيانات عبر 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'}])
لكن احذر: إذا كان الموقع يحظر المستخرجات بنشاط باستخدام CAPTCHA وحظر 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-3-5-sonnet-20241022",
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
تتعامل النماذج اللغوية الكبيرة مع 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)
- احترم حقوق الطبع والنشر — لا تعد نشر المحتوى بالكامل
- فكر في استخدام واجهات برمجة التطبيقات العامة أو البيانات المنظمة بدلاً من ذلك
- تجنب استخراج البيانات الشخصية؛ وإذا لزم الأمر، اتبع قواعد GDPR
- توقف إذا تم حظرك — لا تحاول تجاوز CAPTCHA أو حظر IP
- سجل نشاط الاستخراج الخاص بك للتدقيق
الخلاصة
يعد استخراج البيانات من الويب أداة قوية لاستخلاص البيانات من الإنترنت. لكن القوة تأتي مع المسؤولية. ابدأ دائماً بالتحقق من ملف robots.txt وشروط خدمة الموقع. قم بالاستخراج باحترام — أضف تأخيرات، وحدد هويتك، وتراجع إذا تم حظرك.
اختر أداتك بحكمة: Playwright للمواقع الديناميكية، وBeautiful Soup لـ HTML الثابت، وScrapy للمشاريع على مستوى المؤسسات، والنماذج اللغوية الكبيرة للبيانات غير المنظمة. وقبل كتابة أي مستخرج، اسأل نفسك: "هل هناك API عام أو بيانات منظمة يمكنني استخدامها بدلاً من ذلك؟"
الخط الفاصل بين الاستخراج المحترم والإساءة رفيع جداً. ابقَ في الجانب الصحيح منه.