Як скрапити дані з 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 Коментаріїв