본문 바로가기
Programming/Python

[Python] 파이썬으로 크롤링하기 / 웹 데이터 추출 / 업무자동화 - 2. 요소 추출 / 검색 / Selenium 사용하기 / XPath 문법 정리

by EunjiBest 2022. 5. 18.

[Python] 파이썬으로 크롤링하기 / 웹 데이터 추출 / 업무자동화 - 2. 요소 추출 / 검색 / Selenium 사용하기 / XPath 문법 정리

 

 

 

Selenium

 

Selenium이란?

웹 테스트 자동화 도구이다.

브라우저를 제어하는 기능이 있기 때문에, 웹 스크래핑에 용이한 도구이다.

*브라우저는 Android, Safari,Chrome..등 다양한 브라우저가 지원된다.

 

 

파이썬이나 자바 라이브러리로,

요즘은 파이썬이 사용하기 쉽게 만들어진 언어이기 때문에, 파이썬에 조금 더 특화되어있다.

 

웹 스크래핑 순서는 다음과 같다.웹정보 요청 -> Selenium으로 브라우저안 원하는 정보 선택 -> 내용 추출

 

 

그럼 이제부터 웹 정보를 요청하는 것부터, 내용을 추출하는 방법까지 알아보자.

 

 

 

Selenium 설치 및 드라이버작동시키기

 

 

from selenium import webdriver

 

당연히 selenium을 import시켜주어야한다.

 

그전에 설치가 되어있지 않다면,

 

pip install selenium
conda install selenium

 

위 코드를 먼저 쳐주고 실행하자.

 

 

driver = webdriver.Chrome()
driver.get('https://www.naver.com')

driver.close()

 

열고자하는 실행 브라우저를 입력하고,get명령어로 사이트 이름을 넣어주면 selenium를 활용할 준비가 된것이다.그 후 이것저것 추출 및 활용을 하다가,닫을 때는

 

driver.close()을 입력하여 닫아주면된다.

하지만, 중간에 에러가 발생하여 프로그램이 종료되는 경우 드라이버가 꺼지지 않는 현상을 방지하기 위해

 

with webdriver.Chrome() as driver:
  driver.get('https://www.naver.com')

 

다음과 같은 with 표현식을 활용하여주면,에러가 발생해 프로그램이 종료가 될 때, 드라이버도 함께 꺼지기 때문에 브라우저가 메모리를 점유하는 현상을 방지해준다.

 

 

 

 

태그로 요소찾기_단일요소

 

원하는 데이터들이 어느 요소에 있는지 알면, 어디서 데이터를 추출할 수 있는지 쉽게 알 수 있다.

예를들어, 제목을 추출하고 싶다면 당연히 타이틀 요소에 제목이 있을 것이다.

 

그럼 요소를 찾는 법을 알아보자.

 

find = driver.find_element_by_tag_name('p')
print(find.text)

 

매우간단하다. 함수이름도 매우 직관적이다.드라이버. 찾아라_요소를_의해서_태그_이름('p')

 

그럼 p태그의 컨텐츠가 출력될 것이다.출력은 출력 형식이 text라면 find.text를 적어주면 된다.

 

 

만약,p가 여러개라면 어떻게 될까?항상 가장 위에서부터 함수가 훑고 지나가기 때문에제일 위에 써있는 p의 컨텐츠가 출력이 되고, 메서드가 종료된다.

 

 

 

 

 

태그로 요소찾기_복수선택

 

 

그럼 p가 여러개일 때, 두번째 p, 세번째p 출력은 어떻게 해야할까?

 

finds = driver.find_elements_by_tag_name('p')

for f in finds:
  print(f.text)

 

달라진 것이 보이는가?함수 find_elements_by_tag_name -> elements요소가 복수가 되었다.

 

드라이버. 찾아라_요소들을_의해서_태그_이름('p')

 

그럼 finds는 리스트로 저장이되고,for문을 이용해서 리스트를 하나씩 출력해주면 된다.

 

 

비슷하게

파이썬의 리스트 문법을 사용해서 원하는 인덱스 번호의 데이터를 불러올 수 있다.

 

finds = driver.find_elements_by_tag_name('p')
find = finds[0]
print(find.text)

 

 

 

 

요소내의 요소 선택하기

 

다음 코드는,div요소 안에있는 p를 데이터를 출력하기 위한 코드이다.

 

find = driver.find_element_by_tag_name('div')/find_element_by_tag_name('p')
print(find.text)

 

슬래쉬/를 사용하여, 앞에는 div요소 찾기/뒤에는 p요소찾기 형식으로 넣어주면div안에있는 p요소의 데이터가 출력된다.

 

 

 

 

 

class 와 id로 찾기

 

위 HTML의 구조가 복잡할 경우 find_element_by_tag_name으로 요소를 찾는것은 코드가 너무 길어지고 복잡해지는 한계가있다.그래서 조금 더 쉽게 찾을 수 있는 방법이 바로 class와 id로 찾는 방법이다.

 

 

1. class로 찾기

 

find = driver.find_element_by_class_name('class_bold')
print(find.text)

 

코드는 간단하다tag에서 class로 바뀐것 말고는 똑같다.당연히 괄호 안에는 태그이름이 아닌 클래의 이름이 들어가야한다.

 

 

마찬가지로,

element에 s를 붙이고 for문으로 전체 클래스 데이터들을 추출할 수 있다.

 

finds = driver.find_elements_by_class_name('css_class')

for f in finds:
  print(f.text)

 

 

2. id로 찾기

 

find = driver.find_element_by_id('css_id')
print(find.text)

 

id의 경우에는 함수 이름이 id_name이라고 하지 않고 id에서 끝난다.

 

finds = driver.find_elements_by_id('css_id')

for f in finds:
  print(f.text)

 

 

 

 

 

XPath

 

DOM문서 내 모든 요소를 각 노드 간의 계층 구조로 표현한다.

 

문서를 각각의 노드로 계층구조를 따라서 쉽게 그려놓은 것이다.

 

 

그럼

Xpath란 무엇일까?

문서의 특정 노드에 접근하기 위한 문법이다.

 

조금 이해하기 쉽게 예를 들자면,

우리가 컴퓨터 파일을 찾을 때, 내 파일에서 경로를 검색하는 것과 비슷하다고 생각하면 된다.

 

/html/body/p

 

이런식으로 슬래시를 이용해 노드간 경로가 이동된다.

가장 큰 노드부터, 작은 노드 순서대로 쓰인다.

 

위 코드처럼 가장 앞 슬래시가 / 한 개인경우에는

html 아래 가장 마지막 노드인 p가 검색이된다.

 

//p

 

슬래시가 // 두 개인 경우, 현재 위치에서 아래있는 모든 노드에서 중 p가 검색이 된다.

 

 

//div/p

 

그럼 위 코드는 

div위치 아래있는 모든 노드 중 p가 검색이 되겠다.

 

 

/html/body/*

 

* 은 와일드 카드라고 불린다.

경로에 있는 모든 노드를 의미하는데,

body아래있는 노드를 다 불러오라는 뜻이다.

 

여기서 body 아래-> 아래있는 노드는 불러오지 못한다.

딱 body아래까지만 있는 모든 노드를 불러올 수 있다.

 

 

/html/body//*

 

//* 이 경우에

body 아래에 있는 모든 노드를 불러온다.

body 아래 뿐만 아니라, body 아래 아래, body 아래 아래 아래....

 

 

//p[1]

 

인덱스를 사용해서 요소를 찾을 수 있다.

여기서 주의할 점은 다른 언어들과 다르게 

인덱스 첫 번째는 0이 아니라 1이라는 점.

 

 

//p[@class]

 

@는, 검색된 모든 노드 중 해당 속성을 가지고 있는 노드를 모두 반환한다.

위 코드의 경우 모든 p요소 중 class속성을 가지고 있는 노드를 반환하라는 뜻이되겠다.

 

 

//p[@class = "bold"]

 

속성 뿐만아니라 속성값도 지정해줄 수 있다.

 

 

 

 

 

요소 쉽게 찾기

 

지금까지 요소를 추출하는 다양한 문법에 대해서 알아보았다.

그런데!

가장 근본적인 문제가 있다.

 

내가 추출하고 싶은 텍스트나, 이미지가 어떤 요소인지 모르면

위에서 사용했던 문법들을 활용할 수 없게된다.

 

그래도 좋게 짜여진 코드는, 대충 위치나 변수 이름등을 보면 찾을 수 있지만,

더 쉽게 찾는 법!

 

좌측 네이버의 로고 이미지를 추출하고 싶다!

할 땐 

우클릭 -> 검사

 

 

를 누르면,

요소 창이 뜨면서 해당 이미지에 대한 요소의 위치를 쉽게 찾을 수 있다.

 

또한,

 

해당 요소를 우클릭하면 XPath의 주소를 알 수 있다.

 

 

 

 

반응형

댓글