민주의네모들

[python] Selenium으로 웹 페이지 크롤링하기 2 / 표(table) 본문

이모저모

[python] Selenium으로 웹 페이지 크롤링하기 2 / 표(table)

mjoooo 2020. 2. 24. 16:00
반응형

지난 포스팅에서는 웹 페이지에서 원하는 평문(text)를 크롤링하는 방법에서 알아보았다.

(아래 링크 참조)

2020/02/14 - [이모저모] - [python] Selenium으로 웹 페이지 크롤링하기

 

[python] Selenium으로 웹 페이지 크롤링하기

1. Selenium 이란? 이번 포스팅에서는 selenium이라는 프레임워크를 통해 웹 페이지를 크롤링하는 방법에 대해 간단히 살펴보겠다. Selenium이란 주로 웹앱을 테스트하는 웹 프레임워크이다. webdriver의 API를 통..

minjoos.tistory.com

 

오늘은 평문이 아닌 특정 형태를 가지고 있는 정보들 중에서,

표(table)에 담긴 정보를 크롤링하는 방법에 대해 알아보겠다.

(사실 별거 없고 코드만 살짝 바뀔 뿐이다)

 

 

from selenium import webdriver
import datetime
driver = webdriver.Chrome('./chromedriver')
driver.implicitly_wait(1)
driver.get('http://www.kma.go.kr/info_open/info/open.jsp')
driver.implicitly_wait(1)

일단 import 해줄 것들을 해주고, 크롤링할 웹 사이트를 정해 url을 넣어준다.

나는 기상청 사이트 중 테이블이 있는 페이지로 정했다. (아래 사진 참조)

http://www.kma.go.kr/info_open/info/open.jsp

 

이제 위 사진에 보이는 table에 담긴 정보를 크롤링 할 것이다.

 

먼저 개발자도구(F12)를 열어 테이블 위치의 코드를 살펴본다.

 

테이블의 이름은 "table_information" 인 것을 확인할 수 있다.

table = driver.find_element_by_class_name('table_information')

따라서 find_element_by_class_name 메소드를 이용해 위 테이블을 table 변수에 담아준다.

이제 table이 어떻게 구성되어 있는지 살펴보자.

 

'table_information' 테이블 구성

테이블은 위와 같이 <table>안에 <tbody>, <tbdoy>안에 <tr>, <tr>안에 <td> 순으로 포함되어 있다.

각각이 무엇을 나타내는지 알아보고 싶다면,

개발자 도구 상단 왼쪽의 클릭 버튼을 활성화해주어(위 사진의 파란색 버튼) 마우스의 커서가 가리키는 부분의 코드를 바로 알 수 있게끔 해준다. 

그렇게 하면 원하는 위치에 마우스를 갖다 대면 그 부분의 코드를 바로 찾을 수 있고, 반대로 특정 코드에 마우스를 갖다 대면 웹 페이지에 파란색으로 그 코드가 가리키는 부분이 표시된다.

 

결과적으로 각 <tbody>는 테이블 내용이 있는 body부분을 나타내는 것이고

<tr>...<tr> 부분은 그 테이블을 구성하는 각 을 말한다.

<tr>안에 있는 <th> <td> 등은 그 열을 구성하는 각 을 말한다.

 

 

 

따라서,

내가 위 테이블의 [주요업무] [목록] [세부내용] [공개주기] [공개시기] [경로] [담당부서] 중

[목록] 만을 크롤링 하고 싶다 하면 아래와 같이 코드를 짜면 된다.

tbody = table.find_element_by_tag_name("tbody")
rows = tbody.find_elements_by_tag_name("tr")
for index, value in enumerate(rows):
    body=value.find_elements_by_tag_name("td")[0]
    print(body.text)

여기서 잠깐,  목록은 2번째 행인데 왜 body=value.find_elements_by_tag_name("td")[0]이냐?

[1] 이어야 하는것 아닌가? 라고 생각할 수 있지만

개발자도구 코드를 잘 살펴보면 첫번째 행인 [주요업무]는 <td>가 아니라 <th>임을 알 수 있다.

 

우리는 find_elements_by_tag_name을 이용해 <td>인 것들 중, 첫번째인 [목록]을 출력해야 하므로

[0]이 되어야 하는 것이다.

 

위 코드를 실행시켜 보면

아래와 같이 출력이 된다.

 

이를 활용해서 하나의 열에 있는 정보를 프린트 하고 싶다 하면, 코드를 아래와 같이 살짝만 바꾸어 주면 된다.

table = driver.find_element_by_class_name('table_information')
tbody = table.find_element_by_tag_name("tbody")
rows = tbody.find_elements_by_tag_name("tr")[0]
body= rows.find_elements_by_tag_name("td")
for index, value in enumerate(body):
    print(value.text)

<tr>중 첫번째([0]) 열을 rows로 받아서 <td> 들의 text를 출력하는 코드이다.

 

위 코드를 실행시켜 보면

아래와 같이 잘 출력된다.

 

 

즉, 표(table)를 크롤링하기 위해 무엇보다 중요한 것은

개발자 도구로 테이블의 구조(예를 들어 <tbody>안에 <tr>이 있고, <tr>안에 ... )를 파악하는 것이며,

구조에 따라 코드를 조금씩만 바꿔주면 원하는 정보를 크롤링할 수 있다.

 

 

 

 

 

다음 포스팅에서는

blank에 값 입력, 버튼 클릭 등 웹 페이지를 코드로 제어한 후

나오는 정보를 크롤링하는 방법에 대해 알아보도록 하겠다.

 

 

반응형