[일단!] - 일단 실행해보세요! 멋진일이 일어날걸요?
[알고!] - 코드 로직과 필요한 개념들을 같이 정리해봐요!
이 글에서는?
- 셀레니움 코드리뷰 - (하)
- 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 값을 찾았고, 이를 활용하여 데이터를 추출했다.
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()
'Python' 카테고리의 다른 글
[일단!] 유용한 편집기 - VS Code 설치 초보자도 쉽고 자세하게 (2) | 2025.02.08 |
---|---|
[알고!] 동적 웹크롤링 셀레니움(Selenium) - (상) (4) | 2025.02.08 |
[일단!] 데이터가 필요하다면? - 크롤링(Crawling) (2) | 2025.02.08 |