перейти к содержанию

Glassdoor — отличный ресурс для соискателей работы, сотрудников и работодателей. Он содержит огромное количество информации о компаниях и вакансиях, включая зарплаты, отзывы, вопросы для собеседований, фотографии офисов и многое другое. Все эти данные делают Glassdoor привлекательной целью для парсинга веб-страниц.

В этом подробном руководстве мы рассмотрим различные методы и стратегии очистки различных типов данных из Glassdoor.

Обзор архитектуры Glassdoor

Прежде чем мы углубимся в особенности парсинга, давайте разберемся, как структурирован веб-сайт Glassdoor:

  • Клиентский рендеринг – Glassdoor использует React для рендеринга большей части своего пользовательского интерфейса на стороне клиента, а не на стороне сервера. Это означает, что исходный HTML-код, передаваемый браузеру, минимален, а большая часть контента загружается и отображается с помощью Javascript.

  • API GraphQL – Данные, отображаемые на страницах Glassdoor, извлекаются через GraphQL API. Веб-сайт отправляет AJAX-запросы к этому API для получения структурированных данных, которые затем отображаются на странице.

  • Тяжелая защита от царапин – 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:

  • Используйте прокси: чередуйте разные резидентные прокси для каждого запроса, чтобы ваш парсер отображался от разных пользователей.

  • Лимитная ставка: Убедитесь, что между запросами есть задержки, и выполняйте очистку с умеренной скоростью.

  • Мнемо-браузер: установите действительный пользовательский агент, заголовки Accept и включите Javascript, чтобы они выглядели как настоящий браузер.

  • Мониторные блоки: проверьте, не блокируются ли ваши IP-адреса или прокси-серверы, и соответствующим образом смените центр обработки данных или провайдера.

  • Используйте сервисы парсинга: Используйте API-интерфейсы очистки, такие как ScraperAPI и Octoparse, которые имеют встроенную поддержку для обхода механизмов защиты от очистки.

При соблюдении правильных мер предосторожности можно извлекать данные из Glassdoor в больших масштабах, не подвергаясь блокировке.

Очистка Glassdoor с помощью ScraperAPI

ScraperAPI — это платный API для парсинга, который решает все проблемы, связанные с парсингом, и позволяет извлекать данные в большом масштабе.

Он поддерживает сканирование ajax, прокси и напрямую интегрируется с популярными библиотеками, такими как запросы Python.

Вот как мы собираем отзывы о компаниях с помощью 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, в том числе:

  • Извлечение обзорной информации, списков вакансий, зарплат, обзоров, вопросов для собеседований и фотографий путем анализа данных API GraphQL.
  • Расчет страниц с нумерацией страниц на основе общего количества и систематический парсинг всех страниц.
  • Работа с системами защиты от парсинга Glassdoor с помощью прокси и сервисов, таких как ScraperAPI.
  • Обеспечение соблюдения законодательства путем соблюдения Условий обслуживания, конфиденциальности, авторских прав и ограничений скорости.

Обсуждаемые методы можно адаптировать для создания мощных парсеров Glassdoor, которые собирают полезные данные в большом масштабе надежным и этичным способом.

Удачного соскабливания!

Теги:

Присоединяйтесь к беседе

Ваш электронный адрес не будет опубликован. Обязательные поля помечены * *