파이썬을 사용하여 글래스도어 데이터를 스크랩하는 방법

댓글: 0

Glassdoor는 급여 정보, 고용주 리뷰, 입사 지원서 등 구직자와 채용 희망자 모두에게 다양한 정보를 제공하는 최고의 플랫폼 중 하나입니다. 이 가이드에서는 Python과 Playwright를 사용하여 Glassdoor에서 채용 공고를 스크랩하는 과정을 안내합니다. 여기서는 기존의 스크래핑 라이브러리에 플래그를 지정하고 차단할 수 있는 강력한 봇 방지 조치를 채택하고 있기 때문에 Playwright가 필수적입니다. Playwright를 사용하면 실제 브라우저를 시뮬레이션하고 프록시를 포함할 수 있어 이러한 탐지 시스템을 우회하는 데 도움이 됩니다.

Glassdoor의 강력한 스크래핑 방지 메커니즘으로 인해 라이브러리를 통한 직접 요청은 IP 차단 또는 캡차 문제로 이어질 수 있습니다. Playwright를 사용하면 브라우저를 자동화하여 보다 인간과 유사한 상호작용을 할 수 있습니다. 프록시와 브라우저 헤더를 추가하면 탐지를 더욱 피할 수 있습니다.

요구 사항

시작하려면 HTML 파싱을 위해 Playwright와 lxml 라이브러리를 설치해야 합니다. 다음과 같이 설치할 수 있습니다:


pip install playwright lxml
playwright install

글래스도어 채용 공고 스크래핑하기

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 link', 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. 채용 정보 페이지로 이동: 이 스크립트는 미국 내 소프트웨어 엔지니어링 일자리에 대한 Glassdoor 채용 공고 URL을 방문합니다.
  3. 콘텐츠 구문 분석: HTML 구문 분석용 lxml을 사용하여 구인 데이터를 추출합니다. 직책, 위치, 급여, 채용 링크, 회사명, 그리고 쉽게 지원할 수 있는 일자리인지 여부를 캡처합니다.
  4. CSV로 저장: 모든 데이터를 추출한 후 스크립트는 각 속성에 대한 열이 포함된 CSV 파일 glassdoor_job_listings.csv에 저장합니다.

Glassdoor의 서비스 약관 준수

Glassdoor 또는 다른 웹사이트를 스크랩할 때는 책임감 있는 스크랩 관행을 따라야 합니다:

  • 스크랩 비율 제한: 요청 간 지연을 구현하여 서버에 과부하가 걸리지 않도록 하세요.
  • 로테이션 프록시 사용: 프록시와 IP를 순환하여 금지될 위험을 최소화합니다.
  • 서비스 약관을 준수하세요: 웹사이트의 서비스 약관을 정기적으로 검토하고 이를 위반하는 행동을 피하세요.

Python과 Playwright를 사용하여 Glassdoor의 데이터를 스크래핑하는 방법을 알면 채용공고를 수집하는 능력을 쉽게 향상시킬 수 있습니다. 이 기술을 프록시 및 적절한 헤더 사용과 결합하면 Glassdoor에 의해 차단될 위험을 제거하는 데 효과적입니다. 또한 윤리적 스크래핑 정책을 준수하여 Glassdoor의 서버가 다운되는 것을 방지해야 합니다. 이러한 조치를 준수하면 이제 Glassdoor에서 유용한 채용 정보를 수집하고 처리하여 본인 또는 회사의 용도로 사용할 수 있습니다.

댓글:

0 댓글