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

كيفية كشط الباب الزجاجي

يعد Glassdoor مصدرًا رائعًا للباحثين عن عمل والموظفين وأصحاب العمل على حدٍ سواء. فهو يحتوي على قدر كبير من المعلومات عن الشركات والوظائف، بما في ذلك الرواتب والمراجعات وأسئلة المقابلة وصور المكتب والمزيد. كل هذه البيانات تجعل Glassdoor هدفًا جذابًا لتجميع الويب.

في هذا الدليل الشامل، سنتعرف على تقنيات واستراتيجيات مختلفة لاستخراج أنواع مختلفة من البيانات من Glassdoor.

نظرة عامة على بنية Glassdoor

قبل أن نتعمق في التفاصيل، دعونا نفهم كيفية تنظيم موقع Glassdoor الإلكتروني:

  • العرض من جانب العميل - يستخدم Glassdoor React لعرض معظم واجهة المستخدم الخاصة به على جانب العميل بدلاً من جانب الخادم. وهذا يعني أن HTML الأولي الذي يتم تقديمه للمتصفح يكون في حده الأدنى ويتم تحميل معظم المحتوى وعرضه باستخدام Javascript.

  • واجهة برمجة تطبيقات GraphQL – يتم جلب البيانات المعروضة على صفحات Glassdoor عبر واجهة برمجة تطبيقات GraphQL. يقدم موقع الويب طلبات AJAX إلى واجهة برمجة التطبيقات هذه للحصول على البيانات المنظمة التي يتم عرضها بعد ذلك على الصفحة.

  • الثقيلة المضادة للكشط - يستخدم Glassdoor العديد من إجراءات مكافحة الخدش مثل الكشف عن الروبوتات، وتحديد المعدل، وحظر الكاشطات.

باختصار، Glassdoor هو تطبيق React من صفحة واحدة يستخدم GraphQL لاسترداد البيانات ويتمتع بدفاعات قوية ضد التجريد. تطرح هذه البنية بعض التحديات الفريدة للكاشطات التي يتعين علينا التغلب عليها.

كشط صفحات نظرة عامة على الشركة

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

للحصول على صفحة نظرة عامة على الشركة، نحتاج إلى معرف Glassdoor الخاص بها والذي تم تضمينه في عنوان URL للصفحة:

https://www.glassdoor.com/Overview/Working-at-Google-EI_IE9079.16,22.htm 

هنا EI_IE9079 يشير إلى معرف شركة Google. يمكننا استخراج هذا المعرف من أي عنوان URL للشركة لإنشاء عنوان URL لصفحة النظرة العامة.

لن يؤدي استخلاص ملف HTML الأولي لهذه الصفحة إلى تزويدنا ببيانات منظمة. المفتاح هو استخراج بيانات GraphQL من الصفحة التي تحتوي على جميع المعلومات بتنسيق JSON منظم.

إليك كيفية استخراج بيانات GraphQL:

import json
import re 

html = # page HTML
match = re.search(r‘window.__ENV__ = (\{.*?\})‘, html)
if match:
    data = json.loads(match.group(1))  

وهذا يعطينا بيانات GraphQL الكاملة للصفحة. يمكننا الآن تحليل الحقول مثل description, headquarters, revenue، الخ:

overview = data[‘EmployerPage‘][‘Employer‘]

print(overview[‘description‘]) 
print(overview[‘headquarters‘])
print(overview[‘revenue‘])

وهذا كل شيء! باستخدام بضعة أسطر فقط من كود Python، يمكننا استخراج البيانات المنظمة للنظرة العامة على Glassdoor لأي شركة.

كشط قوائم الوظائف

يسمح Glassdoor بتصفح قوائم الوظائف المفتوحة التي تنشرها الشركات. تحتوي هذه القوائم على العنوان والموقع والوصف والمزيد.

للحصول على وظائف الشركة ننتقل إلى:

https://www.glassdoor.com/Jobs/Google-Jobs-E9079.htm

يتم تحميل قوائم الوظائف ديناميكيًا عبر مكالمات AJAX عند التمرير لأسفل أو تغيير الصفحات. تأتي البيانات من GraphQL مرة أخرى ونحتاج إلى تحليلها.

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

import math
import json 

def get_jobs(companyId):
    url = f‘https://www.glassdoor.com/Jobs/-Jobs-E{companyId}.htm‘

    # request page 1 to get total job count
    page = requests.get(url) 
    total = extract_job_count(page.text) 
    pages = math.ceil(total / 20)

    jobs = []

    # scrape data from each page
    for page in range(1, pages+1):
        page = requests.get(f‘{url}?p={page}‘)
        data = json.loads(extract_graphql(page.text))  
        jobs.extend(data[‘jobs‘])

    return jobs

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

كشط مراجعات الشركة

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

كما هو الحال مع الوظائف، ننتقل إلى صفحة مراجعات الشركة:

https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm

نحن بحاجة إلى فهم كيفية ترقيم المراجعات. يعرض Glassdoor عددًا ثابتًا من المراجعات لكل صفحة ونحتاج إلى مسح جميع الصفحات للحصول على البيانات الكاملة.

يمكن حساب عدد صفحات المراجعة مقدمًا عن طريق استخراج ملف numberOfPages الحقل من بيانات GraphQL. ثم نقوم بترقيم الصفحات فوق كل صفحة ونجمع التقييمات:

import math
import json

def get_reviews(companyId):
    url = f‘https://www.glassdoor.com/Reviews/-Reviews-E{companyId}.htm‘ 

    # extract number of pages from initial request
    page = requests.get(url)
    data = json.loads(extract_graphql(page.text))
    pages = data[‘numberOfPages‘]

    reviews = []

    for page in range(1, pages+1):
        page = requests.get(f‘{url}?p={page}‘) 
        data = json.loads(extract_graphql(page.text))

        # extract reviews
        reviews.extend(data[‘reviews‘]) 

    return reviews

نقوم هنا باستخراج عدد صفحات المراجعة مقدمًا ثم تكرار كل صفحة لإنشاء المجموعة الكاملة للمراجعات.

يمكن لهذه التقنية حذف جميع التقييمات لأي شركة على Glassdoor!

شطب الرواتب

بالإضافة إلى المراجعات، تعد بيانات الرواتب مفيدة للغاية أيضًا. لدى Glassdoor قسم مخصص للرواتب لكل شركة. دعونا نلقي نظرة على كشط سجلات الرواتب.

نبدأ بعنوان URL لصفحة الرواتب:

https://www.glassdoor.com/Salary/Google-Salaries-E9079.htm 

وسيشمل نهجنا العام مرة أخرى ما يلي:

  1. حساب عدد الصفحات من إجمالي عدد الرواتب
  2. ترقيم الصفحات من خلال كل صفحة لكشط سجلات الرواتب

وهنا التنفيذ:

import math
import json

def get_salaries(companyId):
    url = f‘https://www.glassdoor.com/Salary/-Salaries-E{companyId}.htm‘

    # extract page count
    page = requests.get(url)
    data = json.loads(extract_graphql(page.text)) 
    pages = data[‘numPages‘]

    salaries = []

    for page in range(1, pages+1):
        page = requests.get(f‘{url}?p={page}‘)
        data = json.loads(extract_graphql(page.text))

        # extract salary records 
        salaries.extend(data[‘salaries‘])

    return salaries

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

كشط أسئلة المقابلة

تعد رؤى المقابلة مصدرًا رائعًا آخر للبيانات على Glassdoor. دعونا نلقي نظرة على كيفية التخلص من جميع أسئلة المقابلة المنشورة لشركة ما.

صفحة المقابلة الخاصة بالشركة موجودة على:

https://www.glassdoor.com/Interview/Google-Interview-Questions-E9079.htm

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

خطة لعبنا مألوفة:

  1. حساب عدد الصفحات من إجمالي عدد الأسئلة
  2. استخراج الأسئلة من كل صفحة

وهنا التنفيذ:

import math
import json

def get_questions(companyId):
    url = f‘https://www.glassdoor.com/Interview/-Interview-Questions-E{companyId}.htm‘

    # get total question count
    page = requests.get(url)
    data = json.loads(extract_graphql(page.text))
    total = data[‘interviewQuestionCount‘]
    pages = math.ceil(total / 20)

    questions = []

    for page in range(1, pages+1):
        page = requests.get(f‘{url}?p={page}‘)
        data = json.loads(extract_graphql(page.text))

        # extract questions
        questions.extend(data[‘interviewQuestions‘])

    return questions

باختصار، نحن نحسب إجمالي الصفحات بناءً على عدد الأسئلة، وترقيم الصفحات من خلال مكالمات AJAX، واستخراج الأسئلة - مما يسمح لنا بالحصول على جميع المعلومات المتعلقة بالمقابلة الخاصة بالشركة.

كشط صور المكتب

لإكمال عملية استخراج بيانات Glassdoor، فلنلتقط أيضًا صور مكتب الشركة التي توفر رؤية مرئية رائعة.

يمكن الوصول إلى صفحة الصور الخاصة بالشركة على:

https://www.glassdoor.com/Photos/Google-Office-Photos-E9079.htm

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

import math 
import json

def get_photos(companyId):
    url = f‘https://www.glassdoor.com/Photos/-Office-Photos-E{companyId}.htm‘

    # get total photo count 
    page = requests.get(url)
    data = json.loads(extract_graphql(page.text))
    total = data[‘officePhotoCount‘]
    pages = math.ceil(total / 20)

    photos = []

    for page in range(1, pages+1):
        page = requests.get(f‘{url}?p={page}‘)
        data = json.loads(extract_graphql(page.text))

        # extract photos
        photos.extend(data[‘officePhotos‘])

    return photos

وبهذا يمكننا استخراج جميع الصور المكتبية المتاحة للشركة!

التعامل مع مكافحة القشط

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

يحتوي Glassdoor على مجموعة من آليات مكافحة الاستخلاص لمنع استخراج البيانات الشاملة بما في ذلك:

  • حجب IP
  • بصمة المتصفح
  • أنظمة الكشف عن الروبوتات
  • معدل الحد

فيما يلي بعض النصائح لتجنب الكتل أثناء كشط Glassdoor:

  • استخدم الوكلاء: قم بتدوير الوكلاء السكنيين المختلفين لكل طلب حتى تظهر المكشطة الخاصة بك كمستخدمين مختلفين.

  • معدل الحد: تأكد من وجود تأخير بين الطلبات وكشط بمعدل متواضع.

  • تقليد المتصفح: قم بتعيين وكيل مستخدم صالح، وقبول الرؤوس، وتمكين Javascript لتظهر كمتصفح حقيقي.

  • كتل المراقبة: تحقق مما إذا تم حظر عنوان IP أو الوكلاء لديك وقم بتبديل مركز البيانات أو الموفر وفقًا لذلك.

  • استخدام خدمات القشط: الاستفادة من واجهات برمجة التطبيقات (APIs) مثل ScraperAPI وOctoparse التي تتمتع بدعم مدمج لتجاوز آليات مكافحة الكشط.

مع اتخاذ الاحتياطات الصحيحة، من الممكن استخراج البيانات من Glassdoor على نطاق واسع دون أن يتم حظرها.

كشط الباب الزجاجي باستخدام ScraperAPI

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

وهو يدعم زحف أجاكس والوكلاء ويتكامل مباشرة مع المكتبات الشائعة مثل طلبات بايثون.

إليك كيفية استخلاص مراجعات الشركة باستخدام ScraperAPI:

import requests
import math
import json

API_KEY = ‘XXX‘ # assign key

def get_reviews(companyId):

    url = f‘https://www.glassdoor.com/Reviews/-Reviews-E{companyId}.htm‘

    # initial request to get page count
    response = requests.get(url, 
        headers={‘apikey‘: API_KEY})

    pages = extract_page_count(response.text)

    reviews = []

    for page in range(1, pages+1):
        response = requests.get(f‘{url}?p={page}‘,
            headers={‘apikey‘: API_KEY})

        data = json.loads(response.text)    
        reviews.extend(data[‘reviews‘])

    return reviews 

هنا يتعامل ScraperAPI مع الوكلاء والمتصفحات والجوانب الأخرى مما يسمح لنا بالتركيز على استخراج البيانات.

هذه طريقة سهلة لبناء كاشطات Glassdoor قابلة للتطوير دون الحاجة إلى القلق بشأن الأنظمة المضادة للكشط.

عند بناء كاشطات Glassdoor، من المهم التأكد من أن عملك متوافق مع القانون. وفيما يلي بعض الجوانب الرئيسية التي يجب مراعاتها:

  • شروط الخدمة – دراسة شروط الخدمة الخاصة بشركة Glassdoor لفهم المسموحات والقيود المفروضة على استخدام بياناتها. بشكل عام، يُسمح بتجميع كميات معقولة بشكل دوري لأغراض غير تجارية.

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

  • حقوق التأليف والنشر - تخضع مراجعات Glassdoor والبيانات الأخرى المقدمة من المستخدمين لحقوق الطبع والنشر. لا تقم بإعادة إنتاج المحتوى حرفيًا من الموقع.

  • حدود السعر - احترم أي حدود للمعدلات تفرضها شركة Glassdoor ولا تفرط في تحميل خوادمها بعدد زائد من الطلبات.

  • استخدم حالات – لا تستخدم بيانات Glassdoor لأغراض غير أخلاقية مثل مضايقة الموظفين والتمييز وما إلى ذلك.

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

وفي الختام

في هذا الدليل، استكشفنا استراتيجيات وتقنيات مختلفة لاستخراج بيانات الشركة من Glassdoor باستخدام Python بما في ذلك:

  • استخراج معلومات النظرة العامة وقوائم الوظائف والرواتب والمراجعات وأسئلة المقابلة والصور عن طريق تحليل بيانات GraphQL API
  • حساب صفحات ترقيم الصفحات من إجمالي الأعداد وكشط جميع الصفحات بشكل منهجي
  • التعامل مع أنظمة مكافحة الخدش الخاصة بشركة Glassdoor باستخدام الوكلاء والخدمات مثل ScraperAPI
  • ضمان الامتثال القانوني من خلال احترام شروط الخدمة والخصوصية وحقوق النشر وحدود الأسعار

يمكن تكييف الأساليب التي تمت مناقشتها لبناء كاشطات Glassdoor قوية تجمع البيانات المفيدة على نطاق واسع بطريقة قوية وأخلاقية.

تجريف سعيد!

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

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

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