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

كيفية استخلاص بيانات موقع Yelp.com من الويب: الدليل الشامل المكون من 3000 كلمة لاستخراج قوائم الأعمال والمراجعات والبيانات الأخرى

Yelp هي واحدة من أكبر منصات المراجعة الجماعية على الويب. مع أكثر من 200 مليون مراجعة للمطاعم والحانات والصالونات والمحلات التجارية وغيرها من الشركات في أكثر من 30 دولة، فهو يحتوي على منجم ذهب من البيانات للمحللين والباحثين ورجال الأعمال وغيرهم.

ولكن هل من الممكن استخراج هذه البيانات من خلال تجريف الويب؟ قطعاً!

في هذا الدليل الشامل الذي يزيد عن 3000 كلمة، سأشارك كل ما تحتاجه لإنشاء أداة استخراج بيانات ويب يمكنها استخراج مجموعات بيانات ضخمة من Yelp باستخدام Python.

فيما يلي ملخص سريع لما سنغطيه:

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

لذا اربط حزامك، ودعنا نتخلص من ذلك!

إعداد بيئة تجريف ويب بايثون

قبل أن نتمكن من استخراج Yelp، نحتاج إلى إعداد بيئة Python بالتبعيات المطلوبة.

هناك بعض الحزم الرئيسية التي نحتاج إلى تثبيتها:

الطلبات - لإرسال طلبات HTTP إلى خوادم Yelp

شوربة جميلة - لتحليل واستخراج البيانات من صفحات HTML الخاصة بـ Yelp

Scrapy - (اختياري) إطار لبناء كاشطات

أوصي بإنشاء بيئة افتراضية قبل تثبيت ما يلي:

python -m venv scraping-env
source scraping-env/bin/activate

الآن يمكننا تثبيت الحزم:

pip install requests beautifulsoup4 scrapy

هذا كل شيء بالنسبة للتبعيات. نحتاج أيضًا إلى رؤوس صالحة حتى تعتقد خوادم Yelp أن طلباتنا تأتي من متصفح حقيقي:

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
}

المفتاح هو وضع مقنعة User-Agent header. أوصي بتدوير وكلاء مستخدم المتصفح المتعددين لتقليد حركة المرور الحقيقية بشكل أكبر.

ونحن على استعداد للبدء في تجريف!

العثور على الشركات على الصرخة

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

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

دعنا نحلل استعلام بحث نموذجي:

https://www.yelp.com/search?find_desc=restaurants&find_loc=San+Francisco

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

لاستخراج جميع الأعمال المطابقة، نحتاج إلى:

  1. قم بإحضار الصفحة الأولى للحصول على إجمالي عدد الأعمال
  2. قم بالتكرار عبر جميع الصفحات عن طريق زيادة start المعلمة

إليك كيفية تنفيذ منطق ترقيم الصفحات هذا في بايثون:

import requests
from urllib.parse import urlencode
from bs4 import BeautifulSoup

search_url = "https://www.yelp.com/search?"

params = {
  "find_desc": "restaurants",
  "find_loc": "San Francisco"  
}

search_url += urlencode(params)

print("Fetching first page")
first_page = requests.get(search_url, headers=headers)
soup = BeautifulSoup(first_page.content, "html.parser")

businesses = soup.select(".businessName") 
total = int(soup.select_one(".pagination-results-window").text.split()[0].replace(‘,‘, ‘‘))
print(f"Found {total} businesses")

# Calculate pages needed to cover all businesses
num_pages = math.ceil(total / 10)

print(f"Scraping {num_pages} pages...")

for page in range(0, num_pages):

  # Update start param 
  params["start"] = page * 10
  page_url = search_url + "&" + urlencode(params)

  # Fetch page
  print(f"Page {page+1}/{num_pages}")
  page = requests.get(page_url, headers=headers)

  # Extract businesses
  page_soup = BeautifulSoup(page.content, "html.parser")
  businesses.extend(page_soup.select(".businessName"))

print(f"Found {len(businesses)} businesses!")

دعونا نحلل هذا:

  • نبدأ بعنوان URL الأساسي للبحث ومعلمات البحث
  • قم بإحضار الصفحة الأولى للحصول على إجمالي عدد الأعمال
  • حساب عدد الصفحات اللازمة لتغطية كافة الأعمال
  • التكرار من خلال صفحات تحديث start المعلمة
  • في كل صفحة، قم باستخراج قوائم الأعمال وإلحاقها بالقائمة الرئيسية

في اختباري تم استخراج هذا 6,000 قائمة مطاعم في سان فرانسيسكو - ليس سيئًا بالنسبة لـ 30 سطرًا من لغة بايثون!

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

تجريف صفحات الملف الشخصي للأعمال

الآن بعد أن أصبح بإمكاننا اكتشاف عناوين URL للملفات الشخصية للأعمال، فإن خطوتنا التالية هي زيارة كل عنوان URL واستخراج التفاصيل الأساسية مثل:

  • الاسم
  • العنوان:
  • رقم الهاتف (إلزامي)
  • ساعات العمل
  • الوصف
  • الصور
  • وأكثر من ذلك ...

يتم عرض صفحات الأعمال الخاصة بـ Yelp ديناميكيًا ولكن HTML الأساسي بسيط بما يكفي لتحليله باستخدام BeautifulSoup.

دعونا نلقي نظرة على مثال مقتطف:



<p>
  <strong>Phone:</strong> 
  415-387-2147
</p>

<p>
  <strong>Address:</strong>
  1345 9th Ave, San Francisco, CA 94122
</p>

<!-- And so on... -->

يمكننا استخراج كل جزء من المعلومات باستخدام بعض محددات CSS الموضوعة بشكل جيد:

from bs4 import BeautifulSoup
import requests

business_url = "https://www.yelp.com/biz/burma-superstar-san-francisco"

page = requests.get(business_url, headers=headers)
soup = BeautifulSoup(page.content, "html.parser")

name = soup.select_one("h1").text
phone = soup.find("strong", string="Phone:").next_sibling.strip() 
address = soup.find("strong", string="Address:").next_sibling.strip()

hours = {}
for day in soup.select(".day-hours"):
   day_name = day.select_one(".day-name").text
   hours[day_name] = day.select_one(".hours").text

print(name)
print(phone) 
print(address)
print(hours)

# Burma Superstar
# 415-387-2147
# 1345 9th Ave, San Francisco, CA 94122
# {‘Mon‘: ‘11:30am–3pm, 5–9:30pm‘, ‘Tue‘: ‘11:30am–3pm, 5–9:30pm‘...}

النقاط الرئيسية هي:

  • استعمل select_one لاستخراج العناصر المفردة مثل الاسم والهاتف وما إلى ذلك.
  • بالنسبة للبيانات المتداخلة مثل الساعات، قم بالتكرار وإنشاء قاموس
  • محددات CSS البادئة مع العلامات والفئات للتفرد

باستخدام هذه العناصر الأساسية، يمكننا استخراج عشرات الحقول من كل صفحة ملف تعريف إلى قاموس Python منظم أو كائن JSON.

تتضمن بعض المجالات الأخرى التي قد ترغب في التفكير في تجريفها ما يلي:

  • علامات الفئات مثل "المكسيكي" و"الغداء" وما إلى ذلك.
  • علامات المطبخ مثل "برجر"، و"سوشي"، و"قهوة" وما إلى ذلك.
  • تدابير السلامة الخاصة بفيروس كورونا
  • نطاق السعر
  • Neighborhood
  • خطوط العرض والطول
  • وأكثر من ذلك ...

يتيح لك الإبداع هنا إنشاء مجموعات بيانات واسعة النطاق من Yelp تحتوي على مئات الحقول لتحليلها إذا لزم الأمر.

تجريف التعليقات من صفحات الأعمال Yelp

المراجعات هي جواهر التاج لبيانات Yelp. إنها توفر رؤى مذهلة حول معنويات المستهلك والاتجاهات والتركيبة السكانية والمزيد.

لسوء الحظ، لا يتم تحميل المراجعات مباشرةً بتنسيق HTML. ويتم جلبها ديناميكيًا عبر مكالمات JavaScript.

سنحتاج إلى اعتراض هذه الطلبات وتقليدها لاستخراج بيانات المراجعة.

لنفتح صفحة أعمال ونراقب طلبات الشبكة في أدوات المتصفح:

Yelp يراجع طلب الشبكة

آها – يمكننا أن نرى أن المراجعات يتم تحميلها من عنوان URL مثل:

https://www.yelp.com/biz/{business_id}/reviews

في {business_id} فريدة لكل عمل. يمكننا استخراجه من صفحة الأعمال HTML.

يتم ترقيم المراجعات عبر start معامل. لذلك سوف نتبع نفس استراتيجية ترقيم الصفحات:

  1. قم بإحضار الصفحة الأولى للحصول على إجمالي عدد المراجعة
  2. التكرار من خلال جميع الصفحات عن طريق الزيادة start

فيما يلي برنامج نصي لاستخراج جميع المراجعات الخاصة بالأعمال التجارية:

import json
import requests 

business_id = "WavvLdfdP6g8aZTtbBQHTw" # Extract this from HTML

review_url = f"https://www.yelp.com/biz/{business_id}/review_feed?rl=en&q=&sort_by=relevance_desc"

print("Fetching first page")
first_page = requests.get(review_url, headers=headers)
data = json.loads(first_page.text)

total = data["pagination"]["totalResults"]
print(f"Found {total} reviews")

reviews = data["reviews"]

for page in range(total//20 + 1): # 20 reviews per page

  print(f"Fetching page {page+1}/{math.ceil(total/20)}")
  next_page = f"{review_url}&start={page*20}"
  page_data = requests.get(next_page, headers=headers).json()

  reviews.extend(page_data["reviews"])

print(f"Scraped {len(reviews)} reviews!")

فقاعة! لدينا الآن مجموعة المراجعة الكاملة للأعمال التجارية التي تحتوي على بيانات مثل:

{
   "id": "xAG4O7l-t1ubiIsO4cXMYg",
   "rating": 5,
   "user": {
      "id": "rpOyqD_893cqmDAtJLbdog",
      "profile_url": "https://www.yelp.com/user_details?userid=rpOyqD_893cqmDAtJLbdog",
      "name": "Sarah K.",
      "location": "Los Angeles, CA", 
      //...
   },
   "text": "This place is incredible! The sushi melts in your mouth and the...",
    //...
}

يمكن أن يوفر تحليل هذه البيانات إشارات قوية لمشاعر العملاء عبر المواقع والتركيبة السكانية وأنواع المأكولات والمزيد.

تجنب اكتشاف الروبوتات

الآن وبعد أن قمنا ببناء أدوات استخراج للشركات والمراجعات، فقد حان الوقت لتجميع كل ذلك معًا.

مشكلة واحدة - إذا بدأنا في مهاجمة خوادم Yelp بآلاف الطلبات، فسيتم حظرنا بسرعة.

يستخدم Yelp أنظمة متقدمة للكشف عن الروبوتات لمنع إساءة الاستخدام، بما في ذلك:

  • حدود الاستخدام - حدد مدى السرعة التي يمكنك بها طلب الصفحات
  • CAPTCHAs - تحدي المستخدمين للتحقق من أنهم بشر
  • حظر IP - حظر عناوين IP المسيئة

فيما يلي بعض النصائح لتجنب الحظر أثناء حذف Yelp على نطاق واسع:

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

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

إليك كيفية استخدام الوكلاء مع وحدة الطلبات:

from proxy_list import proxies 

# Rotate proxy per request
proxy = random.choice(proxies)

requests.get(url, headers=headers, proxies={"http": proxy, "https": proxy}) 

أنصح بوجود مجموعة من 10,000 على الأقل الوكلاء من نطاقات IP المختلفة ليكونوا آمنين.

إضافة تأخيرات عشوائية

تساعد إضافة تأخيرات متنوعة بين الطلبات في محاكاة السلوك البشري العضوي:

from random import randint

# Add random delay between 2s and 6s
time.sleep(randint(2, 6))

تهدف إلى متوسط 3-5 ثواني بين الصفحات. أي أسرع سوف يرفع الأعلام الحمراء.

استخدم متصفحًا بلا رأس

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

فقط تأكد من تغيير بصمة المتصفح والوكيل في كل جلسة.

حل اختبارات CAPTCHA باستخدام 2Captcha

إذا قمت بالضغط على اختبار CAPTCHA، فيمكن لخدمات مثل 2Captcha حلها تلقائيًا لمواصلة عملية الاستخلاص.

تتقاضى معظم الخدمات حوالي 2 دولارًا أمريكيًا لكل 1000 اختبار CAPTCHA يتم حلها، وهو أمر مفيد لتوسيع نطاق أدوات الكاشطات الكبيرة.

احترام قيود الحساب

راقب صفحة حالة حسابك. إذا كان معدل الكشط الخاص بك شديدًا للغاية، فقد تفرض شركة Yelp حدودًا مؤقتة للاستخدام.

قم بتسريع طلباتك وتراجع إذا أشارت الأخطاء إلى أنك تقترب من حد الاستخدام.

كشط الصرخة: الخطوات التالية

ويغطي ذلك التقنيات الأساسية لاستخلاص قوائم الأعمال والملفات الشخصية والمراجعات الخاصة بـ Yelp!

تفتح البيانات التي يمكنك استخراجها الكثير من الاحتمالات:

  • تحليل معنويات المستهلك عبر التركيبة السكانية
  • تتبع الاتجاهات وأنواع المأكولات الناشئة
  • بناء نماذج تنبؤية لعوامل نجاح الأعمال
  • تحسين SEO الخاص بك وسمعتك
  • إجراء أبحاث سوقية واسعة النطاق
  • تحديد الفرص الإعلانية

فقط تذكر الالتزام بشروط خدمة Yelp، والحد من حجم الطلب، وتجنب استخراج أي بيانات خاصة للمستخدم.

أتمنى أن تجد هذا الدليل مفيدًا! لا تتردد في التواصل معنا إذا كان لديك أي أسئلة أخرى.

تجريف سعيد!

الوسوم (تاج):

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

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