Как скрапить данные с Glassdoor с использованием Python

Комментарии: 0

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

Использование прямых запросов через библиотеку requests часто заканчивается блокировкой IP-адреса или вызовом CAPTCHA. С Playwright можно автоматизировать действия в браузере, что делает взаимодействие более естественным и менее подверженным обнаружению. В свою очередь, применение прокси и специфических заголовков браузера увеличивает шансы на успешный скрапинг данных без риска быть заблокированным.

Предварительные условия

Для начала работы потребуется установить Playwright и библиотеку lxml для парсинга HTML. Установка может быть выполнена следующими командами:


pip install playwright lxml
playwright install

Пошаговая инструкция скрапинга списка вакансий с Glassdoor

В этом разделе будут подробно рассмотрены все этапы: от загрузки страницы с помощью Playwright до извлечения деталей о вакансиях и сохранения данных в файл CSV.

Шаг 1. Настройка браузера и отправка запросов

Для начала необходимо настроить Playwright с использованием прокси для подключения к Glassdoor. Это поможет избежать блокировок и позволит браузеру загружать страницу, как если бы ее посещал реальный пользователь.


from playwright.async_api import async_playwright
from lxml.html import fromstring

async def scrape_job_listings():
    async with async_playwright() as p:
        browser = await p.chromium.launch(
            headless=False,
            proxy={"server": '', 'username': '', 'password': ''}
        )
        page = await browser.new_page()
        await page.goto('https ссылка', timeout=60000)
        content = await page.content()
        await browser.close()
        return content

# Вызов функции для получения содержимого страницы
html_content = await scrape_job_listings()

Шаг 2. Парсинг HTML и извлечение данных

После загрузки страницы используйте lxml для парсинга HTML-контента и извлечения релевантной информации о вакансиях. Ниже представлен пример как можно проанализировать название вакансии, местоположение, зарплату и другие детали для каждой вакансии:


parser = fromstring(html_content)
job_posting_elements = parser.xpath('//li[@data-test="jobListing"]')

jobs_data = []
for element in job_posting_elements:
    job_title = element.xpath('.//a[@data-test="job-title"]/text()')[0]
    job_location = element.xpath('.//div[@data-test="emp-location"]/text()')[0]
    salary = ' '.join(element.xpath('.//div[@data-test="detailSalary"]/text()')).strip()
    job_link = element.xpath('.//a[@data-test="job-title"]/@href')[0]
    easy_apply = bool(element.xpath('.//div[@data-role-variant="featured"]'))
    company = element.xpath('.//span[@class="EmployerProfile_compactEmployerName__LE242"]/text()')[0]
    
    job_data = {
        'company': company,
        'job_title': job_title,
        'job_location': job_location,
        'job_link': job_link,
        'salary': salary,
        'easy_apply': easy_apply
    }
    jobs_data.append(job_data)

Шаг 3. Сохранение данных в файл CSV

После извлечения информации о вакансиях можно сохранить ее в файл CSV для удобства анализа данных.


import csv

with open('glassdoor_job_listings.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.DictWriter(file, fieldnames=['company', 'job_title', 'job_location', 'job_link', 'salary', 'easy_apply'])
    writer.writeheader()
    writer.writerows(jobs_data)

Полная версия кода


import csv
from playwright.async_api import async_playwright
from lxml.html import fromstring

async def scrape_job_listings():
    # Настройка браузера Playwright с прокси для избежания обнаружения
    async with async_playwright() as p:
        browser = await p.chromium.launch(
            headless=False,
            proxy={"server": '', 'username': '', 'password': ''}
        )
        page = await browser.new_page()
        await page.goto('https://www.glassdoor.com/Job/united-states-software-engineer-jobs-SRCH_IL.0,13_IN1_KO14,31.htm', timeout=60000)
        
        # Получение содержимого страницы и закрытие браузера
        content = await page.content()
        await browser.close()
        
        # Парсинг содержимого с помощью lxml
        parser = fromstring(content)
        job_posting_elements = parser.xpath('//li[@data-test="jobListing"]')
        
        # Извлечение данных для каждой вакансии
        jobs_data = []
        for element in job_posting_elements:
            job_title = element.xpath('.//a[@data-test="job-title"]/text()')[0]
            job_location = element.xpath('.//div[@data-test="emp-location"]/text()')[0]
            salary = ' '.join(element.xpath('.//div[@data-test="detailSalary"]/text()')).strip()
            job_link = "https://www.glassdoor.com" + element.xpath('.//a[@data-test="job-title"]/@href')[0]
            easy_apply = bool(element.xpath('.//div[@data-role-variant="featured"]'))
            company = element.xpath('.//span[@class="EmployerProfile_compactEmployerName__LE242"]/text()')[0]
            
            job_data = {
                'company': company,
                'job_title': job_title,
                'job_location': job_location,
                'job_link': job_link,
                'salary': salary,
                'easy_apply': easy_apply
            }
            jobs_data.append(job_data)
    
        # Сохранение данных в файл CSV
        with open('glassdoor_job_listings.csv', 'w', newline='', encoding='utf-8') as file:
            writer = csv.DictWriter(file, fieldnames=['company', 'job_title', 'job_location', 'job_link', 'salary', 'easy_apply'])
            writer.writeheader()
            writer.writerows(jobs_data)

# Запуск функции скрапинга
import asyncio
asyncio.run(scrape_job_listings())

Объяснение кода:

  1. Настройка браузера с прокси: Код инициирует сессию браузера с помощью Playwright, используя прокси для имитации поведения реального пользователя. Опция headless=False позволяет окну браузера оставаться открытым, что может помочь обойти системы обнаружения ботов.
  2. Переход на страницу списка вакансий: Скрипт посещает URL страницы списка вакансий Glassdoor для инженеров-программистов в США.
  3. Парсинг содержимого: Данные о вакансиях извлекаются с использованием lxml для парсинга HTML. Извлекаются название вакансии, местоположение, зарплата, ссылка на вакансию, название компании и информация о возможности легкого отклика на вакансию.
  4. Сохранение в CSV: После извлечения всех данных скрипт сохраняет их в файл CSV под названием glassdoor_job_listings.csv, в котором каждому атрибуту соответствует отдельный столбец.

Соблюдение условий использования Glassdoor

При скрапинге Glassdoor или любого другого сайта крайне важно следовать ответственным практикам скрапинга:

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

Освоив методику скрапинга данных с Glassdoor с использованием Python и Playwright, можно значительно улучшить свои возможности по сбору списка вакансий. Эта техника, в сочетании с использованием прокси и соответствующих заголовков, эффективно устраняет риск блокировки со стороны Glassdoor. Также необходимо учитывать политику этичного скрапинга, чтобы избежать перегрузки серверов Glassdoor. Соблюдая эти меры, теперь можно собирать и обрабатывать полезную информацию о трудоустройстве с Glassdoor для собственных потребностей или компании.

Комментарии:

0 комментариев