Jak zeskrobać dane z Glassdoor za pomocą Pythona

Komentarze: 0

Glassdoor to jedna z najlepszych platform, która zapewnia szeroki zakres informacji zarówno dla osób poszukujących pracy, jak i chcących ich zatrudnić, w tym informacje o wynagrodzeniach, recenzje pracodawców i podania o pracę. W tym przewodniku omówimy proces skrobania ofert pracy z Glassdoor przy użyciu Pythona i Playwright. Playwright jest tutaj niezbędny, ponieważ Glassdoor stosuje silne środki antybotowe, które mogą oznaczać i blokować tradycyjne biblioteki skrobiące. Dzięki Playwright możemy symulować prawdziwą przeglądarkę i dołączyć serwery proxy, pomagając nam ominąć te systemy wykrywania.

Ze względu na solidne mechanizmy Glassdoor zapobiegające skrobaniu, bezpośrednie żądania z bibliotekami takimi jak żądania mogą prowadzić do blokowania IP lub wyzwań CAPTCHA. Playwright pozwala nam zautomatyzować przeglądarkę, czyniąc nasze interakcje bardziej ludzkimi. Dodając serwery proxy i nagłówki przeglądarki, możemy jeszcze bardziej uniknąć wykrycia.

Wymagania

Aby rozpocząć, musisz zainstalować Playwright i bibliotekę lxml do parsowania HTML. Można je zainstalować w następujący sposób:


pip install playwright lxml
playwright install

Skrobanie ofert pracy z Glassdoor

Przejdziemy przez każdy krok, od załadowania strony za pomocą Playwright do wyodrębnienia szczegółów oferty pracy i zapisania danych w pliku CSV.

Krok 1. Konfiguracja przeglądarki i wysyłanie żądań

Najpierw skonfiguruj Playwright z proxy, aby połączyć się z Glassdoor. Pomoże to zapobiec blokowaniu i pozwoli przeglądarce załadować stronę tak, jakby odwiedzał ją prawdziwy użytkownik.


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 link', timeout=60000)
        content = await page.content()
        await browser.close()
        return content

# Wywołanie funkcji w celu pobrania zawartości strony
html_content = await scrape_job_listings()

Krok 2. Parsowanie HTML i wyodrębnianie danych

Po załadowaniu strony, użyj lxml do przeanalizowania zawartości HTML i wyodrębnienia odpowiednich informacji o pracy. Oto jak przeanalizować nazwę stanowiska, lokalizację, wynagrodzenie i inne szczegóły dla każdej oferty pracy:


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)

Krok 3. Zapisywanie danych do pliku CSV

Po wyodrębnieniu szczegółów zadania możemy zapisać je w pliku CSV w celu łatwej analizy danych.


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)

Kompletny kod


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

async def scrape_job_listings():
    # Skonfiguruj przeglądarkę Playwright z proxy, aby uniknąć wykrycia.
    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)
        
        # Pobranie zawartości strony i zamknięcie przeglądarki
        content = await page.content()
        await browser.close()
        
        # Parsowanie zawartości za pomocą lxml
        parser = fromstring(content)
        job_posting_elements = parser.xpath('//li[@data-test="jobListing"]')
        
        # Wyodrębnianie danych dla każdej oferty pracy
        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)
    
        # Zapisywanie danych w pliku 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)

# Uruchom funkcję skrobania
import asyncio
asyncio.run(scrape_job_listings())

Wyjaśnienie pełnego kodu:

  1. Konfiguracja przeglądarki z proxy: Kod inicjuje sesję przeglądarki z Playwright, włączając proxy, aby naśladować ludzkie zachowanie podczas przeglądania. Ustawienie headless=False umożliwia pozostawienie otwartego okna przeglądarki, co może dodatkowo pomóc w ominięciu wykrywania botów.
  2. Przejście do strony z ofertami pracy: Skrypt odwiedza adres URL ofert pracy Glassdoor dla stanowisk inżynierii oprogramowania w Stanach Zjednoczonych.
  3. Parsowanie treści: Dane oferty pracy są ekstrahowane przy użyciu lxml do parsowania HTML. Przechwytujemy tytuł oferty, lokalizację, wynagrodzenie, link do oferty, nazwę firmy i czy jest to łatwa aplikacja.
  4. Zapisywanie do CSV: Po wyodrębnieniu wszystkich danych, skrypt zapisuje je do pliku CSV, glassdoor_job_listings.csv, z kolumnami dla każdego atrybutu.

Przestrzeganie warunków korzystania z usługi Glassdoor

Podczas skrobania Glassdoor lub jakiejkolwiek innej strony internetowej, ważne jest, aby przestrzegać odpowiedzialnych praktyk skrobania:

  • Przestrzegaj limitów stawek: Unikaj przeciążania serwera poprzez wdrażanie opóźnień między żądaniami.
  • Używaj rotacyjnych serwerów proxy: Zminimalizuj ryzyko zbanowania poprzez rotację serwerów proxy i adresów IP.
  • Przestrzegaj warunków korzystania z usługi: Regularnie sprawdzaj warunki korzystania z usługi i unikaj działań, które je naruszają.

Wiedząc, jak skrobać dane Glassdoor za pomocą Pythona i Playwrighta, z łatwością zwiększysz swoje możliwości zbierania ofert pracy. Technika ta, w połączeniu z wykorzystaniem serwerów proxy i odpowiednich nagłówków, skutecznie eliminuje ryzyko zablokowania przez Glassdoor. Należy również pamiętać o zasadach etycznego scrapingu, aby zapobiec awarii serwerów Glassdoor. Przestrzegając tych środków, można teraz zbierać i przetwarzać przydatne informacje o zatrudnieniu z Glassdoor na własny użytek lub na użytek firmy.

Komentarze:

0 komentarze