Python

[알고!] 동적 웹크롤링 셀레니움(Selenium) - (하)

myqzq 2025. 2. 8. 19:15

[일단!] - 일단 실행해보세요! 멋진일이 일어날걸요?

[알고!] - 코드 로직과 필요한 개념들을 같이 정리해봐요!

 

이 글에서는?

  • 셀레니움 코드리뷰 - (하)
  •     3. 요소선택하기

2025.02.08 - [Python] - [알고!] 동적 웹크롤링 셀레니움(Selenium) - (상)

 

[알고!] 동적 웹크롤링 셀레니움(Selenium) - (상)

[일단!] - 일단 실행해보세요! 멋진일이 일어날걸요?[알고!] - 코드 로직과 필요한 개념들을 같이 정리해봐요! 이 글에서는?셀레니움이란?requirements.txt셀레니움 코드리뷰 - (상)    1. 라이브러리

myqzq.tistory.com

2025.02.08 - [Python] - [일단!] 데이터가 필요하다면? - 크롤링(Crawling)

 

[일단!] 데이터가 필요하다면? - 크롤링(Crawling)

[일단!] - 일단 실행해보세요! 멋진일이 일어날걸요?[알고!] - 코드 로직과 필요한 개념들을 같이 정리해봐요! 처음부터 기본부터 시작하면 다소 지루할 것 같아서, 국비수업을 들으며 가장 멋있

myqzq.tistory.com

오늘은 마지막으로 이전에 작성한 게시글의 코드를 셀레니움 위주로 분석해보도록하겠습니다.

 

3. 요소선택하기

 

1) find_element()

조건에 맞는 첫 번째 웹 요소를 찾을 때 사용

만약, 조건에 맞는 요소가 없다면 NoSuchElementException 예외가 발생한다.

element = driver.find_element(By.ID, "element_id")

 

 

2) find_elements()

조건에 맞는 모든 웹 요소를 찾을 때 사용(리스트)

만약, 조건에 맞는 요소가 없더라도 빈 리스트를 반환하기 때문에 예외가 발생하지는 않는다.

elements = driver.find_elements(By.ID, "element_id")

 

 

3) By.[로케이터(locator) 항목] 의 종류

# id 속성을 기준으로 찾을 때
By.ID

# name 속성을 기준으로 찾을 때
By.NAME

# class 속성을 기준으로 찾을 때
By.CLASS_NAME

# XPATH 표현식을 사용해서 요소를 찾을 때
By.XPATH

# CSS 선택자를 사용해서 요소를 찾을 때
By.CSS_SELECTOR

# 태그 이름을 기준으로 요소를 찾을 때
By.TAG_NAME

# 링크의 전체 텍스트를 기준으로 <a> 태그를 찾을 때
By.LINK_TEXT

# 링크의 일부 텍스트를 기준으로 <a> 태그를 찾을 때
By.PARTIAL_LINK_TEXT

 

개인적으로는 XPATH를 많이 사용했다. 하지만 HTML 요소에 의미 있는 id 값이 있다면 By.ID를 고려하는 것이 좋다.

id 값은 고유(unique) 하기 때문에, 가장 빠르고 안정적으로 요소에 접근할 수 있다.

 

마침 우리가 사용하는 웹사이트에서 직접 요소를 확인해 보자.

 

1. 개발자 도구(F12) 열기

웹 브라우저에서 F12 키를 누르면 개발자 도구(DevTools) 가 열린다. 이 도구를 활용하면 웹페이지의 HTML 문서, CSS, JavaScript 등을 확인할 수 있으며, 콘솔(Console) 탭에서는 간단한 테스트나 디버깅 작업도 가능하다.

 

2. 요소 검사 도구 활용하기

요소를 확인하기 위해 개발자 도구 상단 바에서 가장 왼쪽의 아이콘을 클릭하자. (단축키: Ctrl + Shift + C)

이제 웹 화면에서 마우스를 움직여 보면 특정 영역이 번쩍이며 강조되는 것을 볼 수 있다. 웹사이트 곳곳을 천천히 마우스로 가리켜 보면, 각 HTML 요소의 영역이 표시되는 것을 확인할 수 있다.

 

개발자 도구를 열어서 화면의 요소들을 확인하는 작업

 

3. 크롤링의 핵심: 요소 선택과 탐색

크롤링을 할 때 가장 중요한 것은 원하는 요소를 정확하게 선택하고, 목표 요소까지 파고드는 과정이다. 개발자 도구를 활용하여 구조를 분석하고,

적절한 선택자를 사용하면 효율적으로 데이터를 추출할 수 있다.

 

원하는 요소의 XPATH를 복사하는 작업

 

 

위 과정들을 통해 요소의 XPath 값을 찾았고, 이를 활용하여 데이터를 추출했다.

tmp['질문'] = driver.find_element(By.XPATH,'//*[@id="content"]/div[1]/div[1]/div[1]').text.replace('질문\n','')
tmp['상세질문'] = driver.find_element(By.XPATH,'//*[@id="content"]/div[1]/div[1]/div[3]').text.replace('\n','')
tmp['답변개수'] = driver.find_element(By.XPATH,'//*[@id="content"]/div[1]/div[7]/div[1]/div/div/div[1]/span').text
tmp['답변'] = [i.text for i in driver.find_elements(By.CLASS_NAME,'se-component-content')]

코드 설명

아래의 과정이 반복적으로 수행된다.

 

driver.find_element(By.XPATH, '[XPATH 값]').text.replace('[제거하고 싶은 문자열]', '[대체할 문자열]')
  • driver.find_element(By.XPATH, '[XPATH 값]') → Selenium의 driver를 사용하여 특정 요소를 찾음
  • .text → 해당 요소의 텍스트 값을 추출
  • .replace('[제거하고 싶은 문자열]', '[대체할 문자열]') → 문자열 정제 (필요 없는 부분 제거 및 대체)

 

tmp 딕셔너리의 역할

  • tmp['질문'] → '질문'이라는 키값에 해당 XPath에서 추출한 데이터를 저장
  • tmp['상세질문'] → 질문의 상세 내용을 저장
  • tmp['답변개수'] → 답변 개수를 추출하여 저장
  • tmp['답변'] → 답변 목록을 리스트 형태로 저장

이 과정을 통해 웹페이지에서 원하는 정보를 추출하고, tmp 딕셔너리에 저장할 수 있다.

 

텍스트뿐만 아니라 다양한 값도 추출할 수 있다

웹 요소에서 .text 속성뿐만 아니라, 다양한 속성과 메서드를 활용하여 요소의 정보를 가져오거나 조작할 수 있다.

 

 

📌 주요 속성(Properties)

element = driver.find_element(By.ID, "example")

 

 

1. 요소의 텍스트 가져오기

 

  요소 내부의 텍스트 값을 가져온다.

element.text

 

2. 요소의 태그 이름 가져오기

  요소의 HTML 태그명을 가져온다.

element.tag_name

 

3. 요소의 크기 가져오기

  요소의 크기를 딕셔너리 형태로 반환한다.  -> { "width" : 100, "height" : 50 }

element.size

 

4. 요소의 위치 가져오기

  요소의 좌표(위치) 를 딕셔너리 형태로 반환한다.

element.location

 

📌 주요 메서드(Methods)

 

1. 요소의 특정 속성 값 가져오기

  요소의 특정 속성 값(예: href, value 등)을 가져온다.

element.get_attribute("href")

 

2. 요소가 화면에 표시되는지 확인

  요소가 화면에 표시되면 True, 그렇지 않으면 False를 반환한다.

if element.is_displayed():
    print("요소가 화면에 표시됩니다.")

 

3. 요소가 활성화되어 있는지 확인

  요소가 활성화(enabled) 되어 있다면 True, 비활성화 상태라면 False를 반환한다.

if element.is_enabled():
    print("요소가 활성화되어 있습니다.")

 

4. 요소가 선택되어 있는지 확인

  체크박스나 라디오 버튼이 선택되었는지 확인할 때 사용한다.

if element.is_selected():
    print("요소가 선택되어 있습니다.")

 

5. 요소 클릭하기

  버튼, 링크 등 클릭 가능한 요소를 클릭한다.

element.click()

 

6. 요소에 키 입력 보내기

  입력 필드에 텍스트를 입력할 때 사용한다.

element.send_keys("입력할 텍스트")

 

7. 입력 필드 지우기

  입력 필드에 입력된 내용을 삭제한다.

element.clear()

 

 

Selenium은 단순히 요소의 텍스트를 가져오는 것뿐만 아니라, 요소의 속성, 상태, 위치, 크기 등을 확인하거나, 요소와 상호작용할 수 있도록 다양한 속성과 메서드를 제공한다.

특히 웹 자동화를 기획한다면 .click()과 .send_keys()는 필수적으로 사용하게 될 것이다.

 

 

마지막으로..

이 코드를 활용하면 블로그, 카페, 특정 웹사이트 등의 글을 수집하여 필요한 정보를 추출하거나 트렌드를 분석하는 등 다양한 용도로 활용할 수 있다.

 

요즘은 정보를 많이 알고, 트렌드에 뒤처지지 않는 사람이 성공하는 시대다. 웹 크롤링을 어떻게 활용하느냐에 따라 단순한 텍스트뿐만 아니라 이미지, 금액, 날짜 등의 정보도 추출할 수 있다.

 

결국, 이 짧은 코드 한 줄도 큰 변화를 가져올 수 있다고 믿는다. 😊

 

진짜 마지막으로 코드 한 줄 추가!

# 드라이버 종료
driver.quit()