٨ مايو ٢٠٢٥
مقدمة: ما هو استخراج بيانات الويب، ولماذا هو مهم للذكاء الاصطناعي؟
يعد استخراج بيانات الويب حجر الزاوية في الذكاء الاصطناعي (AI)، والبيانات الضخمة، والتعلم الآلي (ML). فهو يمكّن الشركات من جمع مجموعات البيانات لتدريب النماذج، وتحليل الأسواق، ومراقبة التوجهات. تعد مواقع الويب مصادر غنية بالبيانات—من محتوى HTML الثابت، ومحتوى JavaScript الديناميكي، وواجهات برمجة التطبيقات (APIs) المخفية، والمزيد—مما يتطلب تقنيات متخصصة لاستخراج المعلومات بفعالية.
ومع ذلك، فإن التحديات مثل رموز CAPTCHA وأنظمة مكافحة الروبوتات تستلزم حلولاً مبتكرة. وتعتبر تقنيات مثل اكتشاف واجهات برمجة التطبيقات باستخدام Burp Suite أو حل رموز CAPTCHA باستخدام Ultralytics YOLO حاسمة للتغلب على هذه الحواجز. يستكشف هذا الدليل تقنيات استخراج بيانات الويب المتقدمة، ويسلط الضوء على حالات الاستخدام، ويؤكد على الممارسات الأخلاقية لجمع البيانات بشكل مسؤول في المشاريع القائمة على الذكاء الاصطناعي.
يعمل استخراج بيانات الويب على تشغيل تطبيقات الذكاء الاصطناعي والتعلم الآلي من خلال توفير مجموعات بيانات عالية الجودة. تشمل الأمثلة ما يلي:
نقطة رئيسية: يتطلب بناء مجموعات بيانات قوية للذكاء الاصطناعي أساليب استخراج أخلاقية ومتوافقة مع الأنظمة.
تقدم مواقع الويب الثابتة محتوى HTML ثابتًا، مما يجعلها مثالية لعمليات الاستخراج المباشرة.
يوضح كود Python التالي كيفية استخراج عناوين وأسعار الكتب من موقع books.toscrape.com
.
import requests
from bs4 import BeautifulSoup
url = "http://books.toscrape.com/"
response = requests.get(url)
response.raise_for_status()
soup = BeautifulSoup(response.text, "html.parser")
books = soup.select("article.product_pod")
for book in books:
title = book.h3.a["title"]
price = book.find("p", class_="price_color").text
print(f"Title: {title}, Price: {price}")
كيف تعمل:
متى تستخدمها: أفضل للمواقع الثابتة التي لا تستخدم JavaScript، مثل المدونات المعلوماتية أو قوائم المنتجات.
تقوم المواقع الديناميكية بتحميل المحتوى عبر JavaScript، مما يتطلب أدوات أتمتة المتصفح مثل Selenium لعرض الصفحات.
from selenium import webdriver
from bs4 import BeautifulSoup
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument("--headless")
driver = webdriver.Chrome(options=options)
driver.get("https://news.ycombinator.com/")
html = driver.page_source
soup = BeautifulSoup(html, "html.parser")
titles = soup.find_all("tr", class_="athing")
for title in titles:
title_text = title.find("span", class_="titleline").find("a").text
print(f"Title: {title_text}")
driver.quit()
كيف تعمل:
متى تستخدمها: مثالية للتطبيقات أحادية الصفحة (SPAs)، وموجزات وسائل التواصل الاجتماعي، أو لوحات المعلومات.
النص البديل للصورة: "استخراج المحتوى الديناميكي باستخدام Selenium وBeautifulSoup."
لنفترض أن شركتك تحتاج إلى استخراج بيانات المنتجات من موقع للتجارة الإلكترونية (example-shop.com
) يقوم بتحميل الكتالوج الخاص به ديناميكيًا. الاعتماد على أتمتة المتصفح (مثل Selenium) للاستخراج بطيء ويستهلك الكثير من الموارد. بدلاً من ذلك، يمكنك العثور على واجهة برمجة تطبيقات مخفية والاستعلام منها لاستخراج البيانات بشكل أسرع وأكثر كفاءة.
كيف تقوم بضبط Burp Suite Proxy؟
127.0.0.1:8080
كخادم وكيل (proxy).كيف تقوم بالتقاط حركة المرور؟
example-shop.com
وتفاعل مع الموقع (على سبيل المثال، قم بتصفية المنتجات أو تحميل الصفحات).GET /api/v1/products?page=1
كيف تقوم بتحليل الطلبات؟
https://example-shop.com/api/v1/products?page=1
{
"products": [
{"id": 1, "name": "Laptop", "price": 999.99},
{"id": 2, "name": "Phone", "price": 499.99}
]
}
User-Agent
, Authorization
) أو معلمات الاستعلام (page=1
).كيف تقوم باختبار نقطة نهاية واجهة برمجة التطبيقات؟
page=2
وتحقق من الاستجابة.كيف تقوم باستخراج البيانات مباشرة من واجهة برمجة التطبيقات؟
إليك نص برمجي بلغة Python لاستخراج بيانات المنتجات عن طريق الاستعلام من واجهة برمجة التطبيقات المخفية:
import requests
# تعريف نقطة النهاية الأساسية والترويسات
base_url = "https://example-shop.com/api/v1/products"
headers = {"User-Agent": "Mozilla/5.0"}
page = 1
products = []
# التصفح عبر الواجهة لجلب جميع المنتجات
while True:
response = requests.get(f"{base_url}?page={page}", headers=headers)
response.raise_for_status()
data = response.json()
# التوقف إذا لم يتم إرجاع المزيد من المنتجات
if not data["products"]:
break
products.extend(data["products"])
page += 1
# عرض بيانات المنتجات المستخرجة
for product in products:
print(f"Name: {product['name']}, Price: {product['price']}")
robots.txt
: تأكد من أن الواجهة غير محظورة للوصول الآلي.غالبًا ما تستضيف مواقع الويب البيانات بتنسيقات بديلة مثل:
import requests
import pandas as pd
url = "https://example.com/data.csv"
response = requests.get(url)
with open("data.csv", "wb") as f:
f.write(response.content)
df = pd.read_csv("data.csv")
print(df.head())
متى تستخدمها: مثالية للملفات المنظمة أو التدفقات في الوقت الفعلي.
تستخدم مواقع الويب تدابير أمنية لردع الاستخراج الآلي وحماية بياناتها. وتشمل هذه التدابير رموز CAPTCHA، وحظر عناوين IP، وأنظمة مكافحة الروبوتات، وتشويش المحتوى الديناميكي. أدناه، نستكشف التحديات الشائعة والحلول الأخلاقية، بما في ذلك استخدام أدوات مثل Ultralytics YOLO, aiohttp
، وتقنيات التزامن.
تم تصميم رموز CAPTCHA (مثل اختيار الصور أو ألغاز النصوص المشوهة) للتمييز بين البشر والروبوتات من خلال طلب تفاعل المستخدم. وهي تمنع عادةً الاستخراج الآلي ما لم يتم تطبيق تقنيات محددة.
يمكن تدريب Ultralytics YOLO لتصنيف وحل رموز CAPTCHA النصية البسيطة (مثل التعرف على الأحرف المشوهة) باستخدام مجموعة بيانات مصنفة مخصصة. فيما يلي نهج خطوة بخطوة:
جمع صور CAPTCHA:
المعالجة المسبقة وزيادة البيانات:
تدريب نموذج YOLO:
دمج حل CAPTCHA في الاستخراج:
التحقق والتحسين:
import requests
from ultralytics import YOLO
from PIL import Image
import numpy as np
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# تحميل نموذج YOLO المدرب مسبقًا
model = YOLO("captcha_yolo.pt") # يفترض وجود نموذج مدرب
def solve_captcha(image_path):
# تشغيل استدلال YOLO
results = model.predict(image_path, conf=0.5)
boxes = results[0].boxes # الصناديق المحيطة
classes = results[0].names # أسماء الفئات (مثل "A", "B", "1")
# فرز الصناديق حسب الإحداثي السيني لإعادة بناء النص
detections = sorted(
[(box.xyxy[0], classes[int(box.cls)]) for box in boxes],
key=lambda x: x[0][0] # الفرز حسب x_min
)
captcha_text = "".join([cls for _, cls in detections])
return captcha_text
# الاستخراج مع معالجة CAPTCHA
options = Options()
options.add_argument("--headless")
driver = webdriver.Chrome(options=options)
driver.get("https://example-data.com/scrape")
captcha_img = driver.find_element_by_id("captcha-image")
img_url = captcha_img.get_attribute("src")
response = requests.get(img_url)
with open("captcha.png", "wb") as f:
f.write(response.content)
captcha_text = solve_captcha("captcha.png")
driver.find_element_by_id("captcha-input").send_keys(captcha_text)
driver.find_element_by_id("submit").click()
# استخراج البيانات (مبسط)
html = driver.page_source
soup = BeautifulSoup(html, "html.parser")
data = soup.select(".data-item")
for item in data:
print(item.text)
driver.quit()
القيود:
تراقب مواقع الويب أنماط حركة المرور لاكتشاف الروبوتات. يمكن أن تؤدي الطلبات عالية التردد من عنوان IP واحد إلى حظر أو تحديد المعدل، مما يوقف أنشطة الاستخراج الخاصة بك.
time.sleep()
.ThreadPoolExecutor
أو aiohttp
.مثال 1: ThreadPoolExecutor (التزامن القائم على الخيوط)
يستخدم هذا النهج concurrent.futures.ThreadPoolExecutor
في Python لتشغيل عدة طلبات HTTP في خيوط متوازية، وهو مناسب للمهام المرتبطة بالإدخال/الإخراج مثل استخراج بيانات الويب.
import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
from bs4 import BeautifulSoup
def scrape_page(page):
url = f"http://books.toscrape.com/catalogue/page-{page}.html"
response = requests.get(url)
response.raise_for_status()
soup = BeautifulSoup(response.text, "html.parser")
books = soup.select("article.product_pod")
return [(book.h3.a["title"], book.find("p", class_="price_color").text) for book in books]
# استخراج الصفحات من 1 إلى 5 بشكل متزامن
pages = range(1, 6)
results = []
with ThreadPoolExecutor(max_workers=3) as executor:
futures = [executor.submit(scrape_page, page) for page in pages]
for future in as_completed(futures):
results.extend(future.result())
for title, price in results:
print(f"Title: {title}, Price: {price}")
كيف تعمل:
ThreadPoolExecutor
ينشئ مجمعًا من الخيوط (محدود بـ 3 عمال لتجنب إرهاق الخادم).scrape_page
، حيث يجلب ويحلل صفحة.مثال 2: aiohttp (الإدخال/الإخراج غير المتزامن)
يستخدم هذا النهج aiohttp
مع بناء جملة async/await
في Python لطلبات HTTP غير المحظورة، وهو مثالي للاستخراج عالي التزامن مع الحد الأدنى من استخدام الموارد.
import aiohttp
import asyncio
from bs4 import BeautifulSoup
async def scrape_page(session, page):
url = f"http://books.toscrape.com/catalogue/page-{page}.html"
async with session.get(url) as response:
response.raise_for_status()
text = await response.text()
soup = BeautifulSoup(text, "html.parser")
books = soup.select("article.product_pod")
return [(book.h3.a["title"], book.find("p", class_="price_color").text) for book in books]
async def main():
async with aiohttp.ClientSession() as session:
tasks = [scrape_page(session, page) for page in range(1, 6)]
results = await asyncio.gather(*tasks, return_exceptions=True)
return [item for sublist in results if not isinstance(sublist, Exception) for item in sublist]
# تشغيل البرنامج غير المتزامن
results = asyncio.run(main())
for title, price in results:
print(f"Title: {title}, Price: {price}")
كيف تعمل:
aiohttp.ClientSession
يدير طلبات HTTP غير المتزامنة.scrape_page
هي دالة غير متزامنة تجلب وتحلل صفحة دون حظر.asyncio.gather
يشغل المهام بشكل متزامن، مع حلقة أحداث واحدة تتعامل مع جميع الطلبات.مقارنة:
requests
غير متوافقة، مما يستلزم بدائل متوافقة مع async مثل aiohttp
.ملاحظة أخلاقية: يجب على كلا الطريقتين تحديد التزامن (مثل max_workers=3
أو دفعات مهام محكومة) لتجنب إرهاق الخوادم، مع احترام robots.txt
وحدود المعدل لمنع حظر عناوين IP.
fake-useragent
.غالبًا ما تستخدم مواقع الويب أسماء فئات مشوشة أو محددات منشأة ديناميكيًا لكسر أدوات الاستخراج.
robots.txt
: تحقق دائمًا من أذونات الزحف الخاصة بالموقع.يغذي استخراج الويب الذكاء الاصطناعي/التعلم الآلي من خلال توفير:
على سبيل المثال، يمكن لبيانات واجهة برمجة تطبيقات التجارة الإلكترونية من حالة استخدام Burp Suite تدريب نموذج للتنبؤ بالأسعار، بينما يمكن أن تدعم البيانات التي تم حل رموز CAPTCHA الخاصة بها تنظيم مجموعات البيانات للتطبيقات المتخصصة.
إن استخراج البيانات من HTML الثابت، والصفحات الديناميكية، وواجهات برمجة التطبيقات المخفية، ومصادر الويب الأخرى يمكّن الابتكار في الذكاء الاصطناعي والتعلم الآلي. تفتح أدوات مثل Burp Suite الباب أمام استخراج فعال قائم على واجهات برمجة التطبيقات المخفية، بينما يقدم Ultralytics YOLO نهجًا مسؤولاً للتعامل مع رموز CAPTCHA البسيطة بإذن. يضمن التزامن المحسن مع ThreadPoolExecutor
أو aiohttp
استخراجًا فعالاً وأخلاقيًا.
تلتزم شركتنا بالاستخراج المسؤول، وتتجاوز العقبات الأمنية مثل أنظمة مكافحة الروبوتات مع احترام مالكي مواقع الويب.
جرب هذه التقنيات أو استكشف واجهات برمجة التطبيقات لتعزيز تدفقات عملك.
المقال القادم: الدليل الشامل لحلول تخزين البيانات وأفضل الممارسات لقابلية التوسع
في مقالنا التالي، سنتعمق في حلول تخزين البيانات ونستكشف كيفية اختيار الخيار الأفضل لاحتياجات عملك. سواء كنت تعمل مع البيانات المنظمة, البيانات شبه المنظمة، أو البيانات الضخمة، سيرشدك هذا الدليل خلال تحسين التخزين الخاص بك من أجل قابلية التوسع, الأتمتة، و التكامل مع خطوط أنابيب الذكاء الاصطناعي. إليك نظرة خاطفة على ما سنتناوله:
كيفية اختيار نوع تخزين البيانات المناسب:
MongoDB
)، و حلول التخزين القائمة على السحابة مثل AWS S3
أو Google BigQuery
.أتمتة تخزين البيانات من أجل الكفاءة:
SQLAlchemy
, PyMongo
، أو مجموعات تطوير البرامج السحابية (SDKs) لتخزين البيانات المستخرجة أو المعالجة تلقائيًا.قابلية التوسع: التعامل مع البيانات على نطاق واسع:
RabbitMQ
أو Kafka
لإدارة مهام استخراج أو معالجة البيانات ذات الحجم الكبير.دمج تخزين البيانات مع خطوط أنابيب التعلم الآلي:
pandas
, scikit-learn
، أو TensorFlow
لتحليل وتنبؤات متقدمة.تعاون وشارك معرفتك:
المراجع:
concurrent.futures
: https://docs.python.org/3/library/concurrent.futures.htmlابق على اطلاع على أحدث الأفكار والتقنيات من خلال زيارة مدونتنا