شعار proxyscrape داكن

كيفية كشط موقع eBay في عام 2024: دليل المبتدئين

بايثون, كيف, 21 نوفمبر - 21 نوفمبر 20245 دقائق للقراءة

يُعد موقع eBay أحد أكبر الأسواق على الإنترنت في العالم، حيث يستضيف ملايين المنتجات في مختلف الفئات. يمكن أن يكون البحث في eBay لا يقدر بثمن في مهام مثل:

  • مقارنة الأسعار
  • تحليل السوق
  • تتبع اتجاهات المنتجات

في هذا الدليل، سنوضح لك في هذا الدليل كيفية إنشاء برنامج نصي بسيط من Python للبحث عن كلمة رئيسية، واستخراج تفاصيل المنتج مثل العنوان والسعر والعملة والتوافر والمراجعات والتقييمات، وحفظ البيانات في ملف CSV. هذا البرنامج التعليمي رائع للمبتدئين الذين يرغبون في تعلُّم كشط الويب بالطريقة الصحيحة، مع نصائح حول احترام شروط الخدمة واستخدام البروكسيات بشكل مسؤول.

تخطي الشرح؟ إليك الرمز الكامل

إذا كنت تبحث فقط عن التنفيذ الكامل، فإليك نص Python النصي الكامل لكشط تفاصيل المنتج من eBay باستخدام البروكسي. انسخه والصقه في بيئتك للبدء:

import re
import csv
import time

import requests
from bs4 import BeautifulSoup

proxies = {
    "http": "http://username:[email protected]:6060",
    "https": "http://username:[email protected]:6060",
}

def get_product_information(product_url) -> dict:
    r = requests.get(product_url, proxies=proxies)
    soup = BeautifulSoup(r.text, features="html.parser")

    product_title = soup.find("h1", {"class": "x-item-title__mainTitle"}).text
    product_price = soup.find("div", {"class": "x-price-primary"}).text.split(" ")[-1]
    currency = soup.find("div", {"class": "x-price-primary"}).text.split(" ")[0]

    # locate the element that holds quanity number of product
    quantity_available = soup.find("div", {"class":"x-quantity__availability"})
    if quantity_available is not None:
        # Using regex check if we can locate the strings that holds this number
        regex_pattern = r"\d+\savailable"
        if re.search(regex_pattern, quantity_available.text) is not None:
            quantity_available = re.search(regex_pattern, quantity_available.text).group()
            # After string is located we extract the number by splitting it by space and selecting the first element.
            quantity_available = quantity_available.split(" ")[0]
        else:
            quantity_available = "NA"

    total_reviews = soup.find("span", {"class":"ux-summary__count"})
    if total_reviews is not None:
        total_reviews = total_reviews.text.split(" ")[0]
    else:
        total_reviews = "NA"

    rating = soup.find("span", {"class":"ux-summary__start--rating"})
    if rating is not None:
        rating = rating.text
    else:
        rating = "NA"

    product_info = {
        "product_url": product_url,
        "title": product_title,
        "product_price": product_price,
        "currency": currency,
        "availability": quantity_available,
        "nr_reviews": total_reviews,
        "rating": rating
    }

    return product_info

def save_to_csv(products, csv_file_name="products.csv"):

    # Write the list of dictionaries to a CSV file
    with open(csv_file_name, mode='w', newline='') as csv_file:
        # Create a csv.DictWriter object
        writer = csv.DictWriter(csv_file, fieldnames=products[0].keys())

        # Write the header (keys of the dictionary)
        writer.writeheader()

        # Write the rows (values of the dictionaries)
        writer.writerows(products)

    print(f"Data successfully written to {csv_file_name}")

def main(keyword_to_search: str):
    products = []

    r = requests.get(f"https://www.ebay.com/sch/i.html?_nkw={keyword_to_search}", proxies=proxies)

    soup = BeautifulSoup(r.text, features="html.parser")
    for item in soup.find_all("div", {"class": "s-item__info clearfix"})[2::]:
        item_url = item.find("a").get("href")

        product_info: dict = get_product_information(item_url)
        print(product_info)
        # Adding a 1-second delay between requests to avoid overloading the server and reduce the risk of being blocked
        time.sleep(2)

        products.append(product_info)
    # save data to csv
    save_to_csv(products)


if __name__ == '__main__':
    keywords = "laptop bag"
    main(keywords)

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

كيف سنتخلص من إي باي

تعمل طريقتنا على تبسيط العملية، مع التركيز على أربع وظائف رئيسية:

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

المتطلبات الأساسية

البدء بالأدوات المناسبة أمر بالغ الأهمية. ستحتاج إلى:

تثبيت بايثون:

إعداد بيئة التطوير الخاصة بك:

  • حدد الدليل الذي تريد وضع هذا المشروع عليه. قم بإعداد بيئة افتراضية للحفاظ على تبعيات نظيفة ومعزولة.
mkdir ebay_scraping
cd ebay_scraping
python -m venv venv
المصدر env/bin/activate # على ويندوز استخدم: venv\Scripts\activate
طلبات تثبيت الطلبات bs4

إعداد الوكلاء:

في هذا المثال سوف نستخدم في هذا المثال وكلاء سكنيين بالتناوب Proxyscrape من أجل الحفاظ على إخفاء الهوية وحماية عنوان IP الخاص من الإدراج في القائمة السوداء.

شرح النص

الخطوة 1: استيراد المكتبات والوكلاء

نبدأ باستيراد المكتبات اللازمة لمشروع كشط الويب هذا والتي تشمل:

  • CSV: توفر هذه الوحدة فئات لقراءة وكتابة البيانات المجدولة بتنسيق CSV. تتيح للمبرمجين كتابة البيانات بسهولة بتنسيق Excel المفضل أو قراءة البيانات من الملفات التي تم إنشاؤها بواسطة Excel دون معرفة تفاصيل تنسيق CSV الدقيق.
  • الطلبات: تسمح لك هذه الوحدة بإرسال طلبات HTTP باستخدام Python.
  • BeautifulSoup4 هو محلل html قوي مصمم لاستخراج المعلومات التي تحتاجها من بنية html.

الواردات المطلوبة:

استيراد csv
استيراد الوقت
استيراد الطلبات
من bs4 استيراد الحساء الجميل

إعداد الوكيل:

من أجل الحفاظ على خصوصية عنوان IP الخاص بك وبالتالي تقليل فرص إدراج عنوان IP الخاص بك في القائمة السوداء لمواقع ويب معينة، يوصى بإجراء أنشطة كشط الويب تحت درع الوكلاء، كما ذكرنا أعلاه، سنستخدم وكلاء دوارين Proxyscrape Residential Proxies لهذا البرنامج التعليمي ولكن يمكنك استخدام وكلاء آخرين أو عدم استخدام وكلاء على الإطلاق.

proxies = {
   "http": "http://username:[email protected]:6060",
   "https": "http://username:[email protected]:6060",
}

الخطوة 2: الحصول على نتائج البحث

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

سنستخدم عنوان URL المستعلم عنه لإرسال طلب مع طلب.get(). بمجرد أن نتلقى استجابة، سنقوم بتحليل محتوى HTML باستخدام BeautifulSoup (bs4) لاستخراج عنوان URL الخاص بكل منتج. توضح الصورة أدناه مكان وجود عنوان URL لكل منتج داخل HTML.

يوجد رابط المنتج داخل <div> مع العنصر فئة s-item___info clearfix. لاستخراج هذه الروابط، نستخدم الحساء الجميل (bs4) للبحث عن كل <div> مع هذه الفئة المحددة. بمجرد تحديد موقع هذه العناصر، نكرر كل عنصر منها لإيجاد <a> العناصر واستخراج التكريم التي تحتوي على عنوان URL الخاص بالمنتج.

def main(keyword_to_search: str):
   products = []

   r = requests.get(f"https://www.ebay.com/sch/i.html?_nkw={keyword_to_search}", proxies=proxies)

   soup = BeautifulSoup(r.text, features="html.parser")
   for item in soup.find_all("div", {"class": "s-item__info clearfix"})[2::]:
       item_url = item.find("a").get("href")

       product_info: dict = get_product_information(item_url)
		# Adding a 1-second delay between requests to avoid overloading the server and reduce the risk of being blocked
       time.sleep(1)

       products.append(product_info)
   # save data to csv
   save_to_csv(products)

الخطوة 3: استخراج معلومات المنتج

تقديم احصل_على_معلومات_المنتج الدالة. تأخذ هذه الدالة عنوان URL الخاص بالمنتج كمدخل، وترسل طلبًا إلى عنوان URL هذا، ثم تستخدم BeautifulSoup (bs4) لتحليل معلومات المنتج باستخدام قواعد محددة و أنماط الرجعيات.

def get_product_information(product_url) -> dict:
   r = requests.get(product_url, proxies=proxies)
   soup = BeautifulSoup(r.text, features="html.parser")

   product_title = soup.find("h1", {"class": "x-item-title__mainTitle"}).text
   product_price = soup.find("div", {"class": "x-price-primary"}).text.split(" ")[-1]
   currency = soup.find("div", {"class": "x-price-primary"}).text.split(" ")[0]

   # locate the element that holds quanity number of product
   quantity_available = soup.find("div", {"class":"x-quantity__availability"})
   if quantity_available is not None:
       # Using regex check if we can locate the strings that holds this number
       regex_pattern = r"\d+\savailable"
       if re.search(regex_pattern, quantity_available.text) is not None:
           quantity_available = re.search(regex_pattern, quantity_available.text).group()
           # After string is located we extract the number by splitting it by space and selecting the first element.
           quantity_available = quantity_available.split(" ")[0]
       else:
           quantity_available = "NA"

   total_reviews = soup.find("span", {"class":"ux-summary__count"})
   if total_reviews is not None:
       total_reviews = total_reviews.text.split(" ")[0]
   else:
       total_reviews = "NA"

   rating = soup.find("span", {"class":"ux-summary__start--rating"})
   if rating is not None:
       rating = rating.text
   else:
       rating = "NA"

   product_info = {
       "product_url": product_url,
       "title": product_title,
       "product_price": product_price,
       "currency": currency,
       "availability": quantity_available,
       "nr_reviews": total_reviews,
       "rating": rating
   }

   return product_info

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

الخطوة 4: حفظ النتائج

حان الوقت لتخزين هذه النتائج في ملف CSV باستخدام خاصية Python الأصلية csv المكتبة. المكتبة حفظ_إلى_csv(منتجات) تقبل الدالة المنتجات كمدخل، وهو عبارة عن قائمة من القواميس التي تحتوي على تفاصيل المنتج كما هو موضح سابقًا. ثم تُحفظ هذه البيانات في ملف CSV يحمل اسم اسم_ملف_اسم_ملف_csv الوسيطة التي تُفترض إلى "products.csv".

def save_to_csv(products, csv_file_name="products.csv"):

   # Write the list of dictionaries to a CSV file
   with open(csv_file_name, mode='w', newline='') as csv_file:
       # Create a csv.DictWriter object
       writer = csv.DictWriter(csv_file, fieldnames=products[0].keys())

       # Write the header (keys of the dictionary)
       writer.writeheader()

       # Write the rows (values of the dictionaries)
       writer.writerows(products)

   print(f"Data successfully written to {csv_file_name}")

الخاتمة

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

تذكّر دائمًا أن تقوم بالكشط بمسؤولية، والتزم بشروط خدمة الموقع الإلكتروني، واستخدم أدوات مثل تحديد المعدل لتجنب التعطيل. لجعل مهام الكشط الخاصة بك أكثر موثوقية وكفاءة، فكر في استكشاف خدمات البروكسي عالية الجودة لدينا على ProxyScrape. سواء أكنت بحاجة إلى وكلاء سكنيين أو مراكز بيانات أو وكلاء متنقلين، فنحن نوفر لك كل ما تحتاجه. تحقق من عروضنا للارتقاء بمشاريع كشط الويب الخاصة بك إلى المستوى التالي!

كشط سعيد!