يُعد موقع 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)
يرجى تذكر تحديث متغير البروكسيات باسم مستخدم وكلمة مرور جديدين قبل استخدامها.
تعمل طريقتنا على تبسيط العملية، مع التركيز على أربع وظائف رئيسية:
البدء بالأدوات المناسبة أمر بالغ الأهمية. ستحتاج إلى:
mkdir ebay_scraping
cd ebay_scraping
python -m venv venv
المصدر env/bin/activate # على ويندوز استخدم: venv\Scripts\activate
طلبات تثبيت الطلبات bs4
في هذا المثال سوف نستخدم في هذا المثال وكلاء سكنيين بالتناوب Proxyscrape من أجل الحفاظ على إخفاء الهوية وحماية عنوان IP الخاص من الإدراج في القائمة السوداء.
نبدأ باستيراد المكتبات اللازمة لمشروع كشط الويب هذا والتي تشمل:
استيراد csv
استيراد الوقت
استيراد الطلبات
من bs4 استيراد الحساء الجميل
من أجل الحفاظ على خصوصية عنوان IP الخاص بك وبالتالي تقليل فرص إدراج عنوان IP الخاص بك في القائمة السوداء لمواقع ويب معينة، يوصى بإجراء أنشطة كشط الويب تحت درع الوكلاء، كما ذكرنا أعلاه، سنستخدم وكلاء دوارين Proxyscrape Residential Proxies لهذا البرنامج التعليمي ولكن يمكنك استخدام وكلاء آخرين أو عدم استخدام وكلاء على الإطلاق.
proxies = {
"http": "http://username:[email protected]:6060",
"https": "http://username:[email protected]:6060",
}
لنبدأ بشرح عملية البحث التي سنستخدمها في هذا البرنامج التعليمي. سنستعلم عن عنوان 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)
تقديم احصل_على_معلومات_المنتج
الدالة. تأخذ هذه الدالة عنوان 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
أخيرًا، نقوم بتنظيم كيانات المنتج المحللة في قاموس، ثم يتم إرجاعها بواسطة الدالة.
حان الوقت لتخزين هذه النتائج في ملف 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. سواء أكنت بحاجة إلى وكلاء سكنيين أو مراكز بيانات أو وكلاء متنقلين، فنحن نوفر لك كل ما تحتاجه. تحقق من عروضنا للارتقاء بمشاريع كشط الويب الخاصة بك إلى المستوى التالي!
كشط سعيد!