QA Engineering/Tool & Automation

[셀레니움 크롤링] 채용사이트의 채용공고 긁어 보기

잡아라폴폴 2025. 3. 6. 23:32
반응형

파이썬을 이용해 채용사이트에서 내가 원하는 wording의 공고문을 가져오는 스크립트를 작성함

우선 크롬에서 개발자 도구를 이용해 내가 가져오기 위한 사이트에 접속을 해봄

이번에는 잡코리아에서 채용공고를 가져와 볼까 함
https://www.jobkorea.co.kr/ URL을 입력 하면, 다들 아는 것 처럼 잡코리아에 접속 되고 아쉽게도 팝업 창이 딱 떠오름

팝업을 종료하는 방법은 여러가지가 있지만, 여기에서는 beautifulsoup4를 이용해 html을 파싱 함

위에 캡쳐 화면 처럼 자세히 보면 div 태그에 class를 modal로 사용중인것을 볼 수 있음. 대부분 팝업에 class modal 효과를 주기 위해 사용한 것으로 보이기때문에, 
modals = soup.find_all(class_="modal")
변수를 사용해 모달이 있는지 먼저 확인 하려고 함

만약에 모달이 없는 경우에는 다음 검색 동작을 진행 하면 되고, 이 부분에 대한 로직을 def 로 정의 함

def close_modals(driver):
    """모달 팝업을 감지하고 닫음"""
    html = driver.page_source
    soup = BeautifulSoup(html, "html.parser")
    modals = soup.find_all(class_="modal")

    if modals:
        print(f"총 {len(modals)}개의 모달이 발견되었습니다.")
        selenium_modals = driver.find_elements(By.CLASS_NAME, "modal")

        if selenium_modals:
            for modal in selenium_modals:
                try:
                    close_btn = modal.find_element(By.CLASS_NAME, "btnClosePop")
                    close_btn.click()
                    print("모달을 닫았습니다.")
                    time.sleep(1)
                except:
                    print("닫기 버튼을 찾지 못했습니다.")

다음은 검색창에서 내가 원하는 채용 공고 워딩을 검색 할 차례다
사실 앞에 부분 보다 쉽기때문에 find_element(By.****) 을 이용해 검색어를 input box에 입력 하고 클릭 까지 하는 로직을 정의 함

def search_keyword(driver, word):
    """검색어 입력 후 검색 실행"""
    try:
        smkey_div = driver.find_element(By.CLASS_NAME, "smKey")
        text_input = smkey_div.find_element(By.CSS_SELECTOR, 'input[type="text"]')
        text_input.click()
        text_input.send_keys(word)

        print(f"'{word}' 입력 완료")
        time.sleep(1)

        submit_button = smkey_div.find_element(By.CSS_SELECTOR, 'input[type="submit"]')
        submit_button.click()

        print("검색 버튼 클릭 완료")
    except Exception as e:
        print("오류 발생:", e)

    time.sleep(5)

이렇게 까지 정의 하면, 쉽게 검색 내용까지 도달 할 수 있음

다음 단계는 실제로 내가 긁어오고자 하는 정보들을 찾아야 함
앞서 사용한 beautifulsoup4를 사용하기에는 정보가 너무 많고 불분명 하기 때문에 특정 class나 id 값이 unique 한지 확인해 보고 그걸 사용하는게 더 좋다는 생각으로 보임

위에 이미지를 보면, article 태그에 content를 사용하는것이 나타남
각 정보들을 리스트 형태로 나타내 주고 있기 때문에 이것들을 가공해서 가지고 있는 속성 값을 추출 하는것이 좋을것으로 생각이 됨

아래 처럼 어떤 부분을 찾을지 선언 하고, 
content_list = driver.find_element(By.CLASS_NAME, "content list")
list_items = content_list.find_elements(By.CLASS_NAME, "list-item")

아래 코드와 같이 내가 찾을 부분의 태그 속성값을 찾는 로직을 만들어 정의 함

def extract_list_items(driver):
    """content-list 안의 list-item을 찾아 데이터 추출"""
    items_data = []
    try:
        content_list = driver.find_element(By.CLASS_NAME, "content-list")
        list_items = content_list.find_elements(By.CLASS_NAME, "list-item")

        if list_items:
            print(f"총 {len(list_items)}개의 list-item 발견!")
            for idx, item in enumerate(list_items, start=1):
                data_gavirturl = item.get_attribute("data-gavirturl")
                data_gainfo = item.get_attribute("data-gainfo")

                if data_gavirturl or data_gainfo:
                    item_info = {
                        "index": idx,
                        "data_gavirturl": data_gavirturl,
                        "data_gainfo": data_gainfo
                    }
                    items_data.append(item_info)

                    print(f"{idx}.", end=" ")
                    if data_gavirturl:
                        print(f"data-gavirturl: {data_gavirturl}", end=" ")
                    if data_gainfo:
                        print(f"data-gainfo: {data_gainfo}")
                    print("\n")
        else:
            print("list-item 요소를 찾지 못했습니다.")
    
    except Exception as e:
        print("list-item 추출 중 오류 발생:", e)
    
    return items_data

정의된 함수들을 실행 하면, 내가 원하는 키워드로 검색이 가능 하고 찾고자 하는 내용까지 출력이 가능함

그밖에도 페이지를 클릭해 다음 화면을 가지고 오고 이 화면들을 콘솔로만 출력하는게 아니라
txt, csv등 문서로도 저장 할 수 있음

개발쪽으로 직무 전환중인데 맘대로도 안되고... 답답해서 오랜만에 포스팅도 해볼 겸 만들어봤음

자세한 내용들은 아래 동영상이랑 csv를 참고 (?) 하면 쉽게 커스터마이징이 가능 할거 같고,
그래도 잘 모르겠으면 github에서 그냥 스크립트를 긁어서 사용하면 될듯함 ㅎㅎ

search_qa_2025-03-06_232355.csv
0.11MB

Github 바로가기

반응형