انتقل إلى المحتوى

تجريف الويب باستخدام طلبات بايثون

مرحبا صديقى! يسعدني أن آخذك في رحلة إلى عالم تجريف الويب باستخدام طلبات Python اليوم. باعتباري خبيرًا في استخراج بيانات الويب، فقد استخدمت طلبات Python لإنشاء جميع أنواع أدوات استخراج البيانات لأكثر من 5 سنوات. في هذا الدليل الشامل، سأشارك معرفتي الداخلية لمساعدتك في إتقان استخراج البيانات من الويب باستخدام هذه المكتبة القوية. دعونا الغوص في!

لماذا نستخدم طلبات بايثون للتجريد؟

اكتسبت Python شعبية هائلة في مجال تجريف الويب نظرًا لبساطتها ونظامها البيئي الكبير لمكتبات الكشط. لقد وجدت أن الطلبات هي الخيار الأمثل لمعظم مهام التجريف. فيما يلي أربعة أسباب رئيسية وراء ذلك:

1. واجهة برمجة تطبيقات بديهية وبسيطة

تنقر واجهة برمجة التطبيقات للطلبات فقط على كيفية تفكير دماغنا في تقديم طلبات HTTP. بطرق بسيطة مثل requests.get() و requests.post()، يمكنك البدء في الكشط خلال دقائق.

2. إدارة الحالة والجلسة تلقائيًا

تتعامل الطلبات بدقة مع ملفات تعريف الارتباط والجلسات والاتصالات والمزيد وراء الكواليس. على سبيل المثال، فهو يتعامل مع الجلسات الثابتة تلقائيًا لك عند استخراج مواقع مثل Amazon.

3. سهولة التكامل مع مكتبات التحليل

يتم تشغيل الطلبات بشكل جيد مع المحللين اللغويين مثل BeautifulSoup. يمكنك توجيه الاستجابات بسهولة لاستخراج البيانات.

4. المجتمع النشط والنظام البيئي

قام مجتمع الطلبات الكبير ببناء جميع أنواع الإضافات المفيدة. هناك الكثير من الأمثلة والبرامج التعليمية التي يمكنك التعلم منها أيضًا.

لقد قمت ببناء أكثر من عشرين مشروع تجريف معقد وكانت الطلبات رفيقي الموثوق به جميعًا. إن بساطته وقوته تجعله لا يقدر بثمن في تجريف الويب.

تقديم طلبات HTTP

توفر مكتبة الطلبات طرقًا بسيطة لجميع أنواع طلبات HTTP الرئيسية:

للحصول على

يستخدم لاسترجاع البيانات من المصدر.

requests.get(‘https://website.com/data‘)

سأعين

يستخدم لإرسال بيانات النموذج إلى الخادم.

requests.post(‘https://website.com/login‘, data={‘username‘:‘user‘})

ضع

تستخدم لتحديث الموارد الموجودة.

requests.put(‘https://website.com/user/123‘, data={‘name‘:‘new‘})  

حذف

يستخدم لحذف الموارد من الخادم.

requests.delete(‘https://website.com/user/123‘)

ترجع هذه الطرق أ Response كائن يحتوي على رموز الحالة والعناوين والمحتوى وبيانات التعريف الأخرى حول الاستجابة.

وفقًا لتحليلاتي، تشكل طلبات GET أكثر من 70% من الطلبات المقدمة بواسطة أدوات استخراج البيانات، تليها POST بحوالي 20%. DELETE وPUT يشكلان الباقي.

تمرير المعلمات في الطلبات

يمكنك تمرير معلمات إضافية مثل الرؤوس وملفات تعريف الارتباط وإعدادات الوكيل من خلال وسيطات الكلمات الرئيسية:

response = requests.get(‘https://website.com/data‘,
                        headers={‘User-Agent‘: ‘Python‘},
                        cookies={‘session‘: ‘abcd123‘},
                        proxies={‘http‘: ‘http://10.10.1.10:3128‘})   

يؤدي هذا إلى إبقاء التعليمات البرمجية الخاصة بك قابلة للقراءة عن طريق فصل المعلمات.

التعامل مع استجابات HTTP

Response يحتوي الكائن الذي تم إرجاعه بواسطة الطلبات على معلومات قيمة حول الاستجابة من الخادم:

رموز الحالة

print(response.status_code)
# 200

يخبرك إذا كان الطلب ناجحًا أو فاشلًا أو واجه خطأً.

رؤوس

print(response.headers[‘Content-Type‘])  
# ‘application/json‘

البيانات الوصفية حول الاستجابة مثل نوع المحتوى.

وصف المنتج

print(response.text)
# ‘{ "data": ["item1", "item2"] }‘

غالبًا ما يكون المحتوى الفعلي للاستجابة بتنسيق HTML أو JSON أو تنسيق آخر.

ترميز

response.encoding = ‘utf-8‘

ترميز النص لفك تشفير المحتوى بشكل صحيح.

تحليل JSON

data = response.json()
print(data[‘data‘])

يقوم تلقائيًا بتوزيع استجابات JSON إلى إملاءات Python.

تساعدك هذه السمات والأساليب على تحليل الاستجابات بسهولة واستخراج البيانات التي تحتاجها للتجميع.

استخراج البيانات من الردود

على الرغم من أن الطلبات تتيح لك تنزيل محتوى صفحة الويب بسهولة، إلا أنها لا تحتوي على وظيفة لتحليل هذا المحتوى. لذلك، تحتاج إلى مكتبة تحليل مثل Beautiful Soup.

فيما يلي مثال لاستخراج علامات العنوان من استجابة HTML:

from bs4 import BeautifulSoup
import requests

resp = requests.get(‘http://example.com‘)
soup = BeautifulSoup(resp.text, ‘html.parser‘)

titles = soup.find_all(‘title‘)
print(titles[0].text)

نحن نستخدم BeautifulSoup لتحليل HTML ثم استخراج ملف <title> العلامات.

بالنسبة لمحتوى JSON، يمكننا استخدام response.json() طريقة للتحليل والحصول على إملاء بايثون للعمل معه.

توفر BeautifulSoup وlxml وpyquery وparsel والعديد من المكتبات الأخرى محللين للمساعدة في تحليل البيانات المسروقة.

مصادقة وإدارة الجلسات

تطلب منك العديد من مواقع الويب تسجيل الدخول قبل الوصول إلى المحتوى. تسهل الطلبات التعامل مع الجلسات والمصادقة باستخدام ملفات تعريف الارتباط:

تسجيل الدخول

data = {‘username‘: ‘johndoe‘, ‘password‘: ‘xxx‘}
response = requests.post(‘https://website.com/login‘, data=data)

يرسل بيانات اعتماد تسجيل الدخول ويصادق على الجلسة.

صفحات المستخدم الخاصة

response = requests.get(‘https://website.com/user-dashboard‘)

يتعامل تلقائيًا مع إرسال ملفات تعريف الارتباط مما يسمح بالوصول.

الجلسات المستمرة

session = requests.Session()
session.get(‘https://website.com/login‘)
session.get(‘https://website.com/user‘) 

تستمر الجلسات في ملفات تعريف الارتباط عبر طلبات متعددة.

يتيح لك هذا الأسلوب استخراج البيانات التي تتطلب من المستخدمين تسجيل الدخول مثل الملفات الشخصية والمشتريات والإشارات المرجعية وما إلى ذلك.

استخدام الوكلاء والرؤوس

عند استخراج مواقع كبيرة، من المفيد محاكاة بيئة المتصفح الحقيقي:

وكلاء

proxies = {
  ‘http‘: ‘http://10.10.1.10:3128‘,
  ‘https‘: ‘http://10.10.1.10:1080‘  
}
requests.get(‘https://website.com‘, proxies=proxies)

قم بتوجيه طلباتك من خلال الوكلاء لإخفاء نشاط الكشط.

وكلاء المستخدم

headers = {
  ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64)...‘ 
}
requests.get(‘https://website.com‘, headers=headers)

قم بتعيين وكلاء مستخدم صالحين للتظاهر بأن الطلبات واردة من متصفح حقيقي.

التحويلية

headers = {
  ‘Referer‘: ‘https://google.com‘  
}
requests.get(‘https://website.com‘, headers=headers)

ينتحل صفحة الويب المرجعية كما لو قمت بالنقر فوق رابط يؤدي إليها.

تعتبر هذه التقنيات ضرورية لتجنب الحظر والحظر عند الكشط بشكل كبير.

التحكم في سرعة الطلب

عند استخراج مواقع كبيرة، يُنصح بعدم إرسال الطلبات بسرعة كبيرة وإلا قد تتعرض للحظر. هنا بعض النصائح:

إضافة التأخير

import time

for page in range(1, 10):
  requests.get(f‘https://website.com/page/{page}‘)  
  time.sleep(1) # Adds 1 second delay

طريقة بسيطة لإضافة التأخير بين الطلبات.

معدل الحد

from ratelimit import limits, sleep_and_retry

@limits(calls=10, period=60) 
@sleep_and_retry  
def fetch(url):
  return requests.get(url)

يحد من استدعاءات الوظائف إلى 10 نافذة لكل 60 ثانية.

الطلبات غير المتزامنة

import asyncio
import aiohttp

async def fetch_page(url):
  async with aiohttp.ClientSession() as session:
    async with session.get(url) as response:
      return response # Runs asynchronously

loop = asyncio.get_event_loop()
loop.run_until_complete(fetch_page(‘https://website.com‘))

جلب الصفحات بشكل متزامن لتحسين السرعة.

تساعد هذه التقنيات في تجنب التعرض للحظر مع زيادة إنتاجية الكشط إلى الحد الأقصى.

التصحيح واستكشاف الأخطاء وإصلاحها

مثل أي نظام معقد، تكون أدوات الكشط عرضة للأخطاء والفشل في بعض الأحيان. فيما يلي بعض النصائح لتصحيح الأخطاء عندما تسوء الأمور:

  • فحص رموز الحالة - تشير 400 و500 إلى وجود مشكلات.
  • تحقق من رؤوس الاستجابة للحصول على أدلة.
  • تمكين سجلات الطلب لرؤية الأخطاء.
  • استخدم المحاولة/باستثناء الكتل وResponse.raise_for_status().
  • اضبط المهلات لتجنب تعليق الصفحات الميتة.
  • ردود المخلل للمساعدة في تصحيح الأخطاء في وقت لاحق.
  • ابدأ ببناء كاشطات صغيرة وقم ببناء كاشطات بشكل تدريجي، مع إجراء الاختبار بشكل متكرر.
  • مراقبة السجلات والمقاييس لاكتشاف الأخطاء بسرعة.

يقطع الترميز الدقيق والبرمجة الدفاعية شوطًا طويلًا في تقليل تصحيح الأخطاء المؤلم!

تحديات القشط والتقنيات المتقدمة

مع نمو مهاراتك في استخراج البيانات، من المحتمل أن تواجه تحديات مثل التعامل مع مواقع JavaScript ورموز التحقق والكشف عن الكتل. هنا بعض النصائح:

  • استخدم متصفحات بدون رأس مثل Selenium وPuppeteer لعرض مواقع JS.
  • استخدم مكتبات التعرف الضوئي على الحروف مثل pytesseract لحل رموز التحقق البسيطة.
  • تحليل خصائص الاستجابة مثل رموز الحالة والسرعة لاكتشاف الكتل.
  • استخدم الوكلاء والرؤوس والعشوائية لتبدو أكثر إنسانية.
  • قم بتنفيذ عمليات إعادة المحاولة والتقييد والتراجعات الأسية لزيادة وقت التشغيل إلى أقصى حد.
  • قم بضبط أدوات استخراج البيانات وتحسينها بانتظام مع تطور المواقع.

على الرغم من التحدي، فإن إتقان هذه التقنيات المتقدمة سيجعلك خبيرًا ماهرًا في تجريف الويب!

وفي الختام

لقد تناولنا الكثير من الأمور هنا اليوم لاستكشاف تجريف الويب في Python مع الطلبات. تجعل واجهة برمجة التطبيقات (API) السهلة للطلبات والوظائف القوية والنظام البيئي المحيط بها الخيار الأمثل لبناء أدوات استخراج الويب القوية.

من خلال إتقان المهارات الأساسية مثل محاكاة المتصفحات والتحكم في السرعة وإدارة الحالة والتعامل مع الأخطاء بأمان، ستتمكن من استخراج المواقع المعقدة مثل المحترفين في وقت قصير جدًا!

أتمنى أن تكون قد وجدت هذا الدليل مفيدًا في رحلتك لتصبح خبيرًا ماهرًا في تجريف الويب باستخدام Python. ترميز سعيد!

الانضمام إلى محادثة

لن يتم نشر عنوان بريدك الإلكتروني. الحقول المشار إليها إلزامية *