-->

[파이썬] 동적 웹 크롤링 (4) - Selenium을 이용한 비트코인 거래소 크롤링

반응형

이전 포스팅에서 알아보았던 Selenium(셀레니움) 사용법을 활용해서 비트코인 거래소 중 하나인 고팍스 메인페이지의 암호화폐 테이블 전체를 크롤링해서 엑셀에 저장해보려 한다.

 

참고로, webdriver를 설치하고 사용하는 방법과, Selenium(셀레니움) 을 사용해 element에 접근하는 방법 등은 페이지 하단의 '이전포스팅' 링크를 확인하길 바란다.

 

 

 

크롤링 대상 페이지

크롤링 대상 페이지는 이전 포스팅에서와 동일하게, 비트코인 거래소 중 하나인 '고팍스'이다. 많은 비트코인 거래소 중 이 페이지를 선택한 이유는 그냥 webdriver로 접근했을때 여기가 반응이 제일 빨랐기 때문이다. 제일 덜 복잡하고 가벼운 페이지 중 하나인 것 같다. 

 

고팍스 거래소 메인 페이지의 테이블

 

 

테이블 위치 확인

단순히 BeautifulSoup를 사용할때는 find_all('tr') 같은 함수를 사용해서 테이블에 접근하기 시작했다면, 이번엔 좀 다르다. 먼저 크롤링하고자 하는 테이블의 html 상에서의 위치를 확인한다. 

 

아래 사진을 보면 보이다시피, 'table class > thread/tbody > tr class > td class > a href > div class' 순서로 구성되어있고 한 tr (한 row) 당 7개의 td (column) 으로 이루어져 있는 것을 알 수 있다. 여기서 암호화폐 앞 열에 있는 별 아이콘은 제외시키기로 해서 총 6개의 td이다. 

 

 

접근할 테이블 위치 확인

 

 

데이터 접근 방식 결정

그럼, Selenium의 어떤 find 함수를 사용해서 먼저 접근할 것인지 방식을 결정해야 한다. '암호화폐 이름', '현재가' 등 각 열 내부의 div class name 마다 접근하는 방식을 사용할 수도 있고 방식은 다양하다.

 

하지만 최대한 함수 종류 2개를 사용하면서 코드의 활용성을 좀 좋게 하기 위해 단순 함수를 쓰는 방식보다는 depth를 하나하나 들어가는 방식으로 데이터에 접근하기로 했다. 그러면서 최대한 코드를 간결화시키기 위해 여러 방법을 시도해보던 중 크롤링 코드 자체는 10줄 내로 끝나는 아래의 방법(실제로는 6줄)을 찾았다.

 


1) xpath로 <tbody> 태그에 접근 -> depth_1

2) tag name을 사용해 depth_2로 <tr> 태그에 접근 -> depth_2

3) depth_2를 사용해 반복문을 돌멱 각 td에 접근

4) td를 개행별로 쪼개서 리스트형태로 저장

 

 

크롤링 코드

처음에 먼저 find_elelment_by_xpath를 사용해 tbody에 접근하고 그 후 다시 find_elements_by_tag_name을 사용해 tr 태그에 접근한다. 이렇게 하는 이유는 두줄만에 필요한 테이블 안의 tr 태그 값만 한꺼번에 가져올 수 있기 때문이다.

 

여기서 주의할 껀 <tbody>는 테이블 전체를 감싸고 있고 태그 자체도 하나이기 때문에 'element'로 접근해도 되지만 table 내부의 tr 태그는 여러개이고 우리는 테이블의 모든 행에 접근해야 하기 때문에 'elements'로 접근해야 한다. 

 

rom selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

URL='https://www.gopax.co.kr/'

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get(URL)

depth_1_tbody =driver.find_element_by_xpath("//*[@id=\"react\"]/div/div[1]/div[2]/div[2]/div[2]/table/tbody")
depth_2_tr = depth_1_tbody.find_elements_by_tag_name("tr")

 

 

여기까지 한 후의 depth_2_tr은 list 형태로 아래와 같이 인덱스 별로 한 행의 값이 들어 있다.

depth_2_tr[0] = "비트코인\nBTC/KRW\n10,854,000\n0.68%\n10,884,000\n10,648,000 \n41억 KRW"

depth_2_tr[0] = "비트코인 HEDGE\nBTC/KRW\n10,854,000\n0.68%\n10,884,000\n10,648,000 \n41억 KRW"

 

따라서, depth_2_tr[0].text의 결과는 아래와 같다.

 

 

 

그럼, 여기서 개행별로 쪼갠다음 리스트에 넣어주면 끝이라는 것을 알 수 있다. split를 사용해 각 행마다 값을 쪼개주고 list에 넣어준다. 이게 끝이다.

 

depth_1_tbody =driver.find_element_by_xpath("//*[@id=\"react\"]/div/div[1]/div[2]/div[2]/div[2]/table/tbody")
depth_2_tr = depth_1_tbody.find_elements_by_tag_name("tr")

for td in depth_2_tr:
    coin_row = td.text
    coin_row_list = coin_row.split("\n")
    print(coin_row_list)

 

그리고 출력해보면 아래와 같은 list를 얻을 수 있다.

 

 

 

CSV에 크롤링 결과 저장

하지만, 이렇게만 끝내면 심심하지 않은가. 아래와 같이 출력 결과를 전부 csv에 예쁘게 저장해보자. 참고로 open 함수 사용 시, 4번째 인자에 newline='' 을 주면 한번 쓰고 나서 자동으로 개행을 해준다.

 

#-*-coding:utf-8-*-
import csv
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

URL='https://www.gopax.co.kr/'

def crawl():

    column_list = ["이름", "현재가", "변동", "최고가", "최저가", "거래대금"]
    date="14"
    with open('coin_crawl_'+date+'.csv','w',-1,newline='') as f:
        w = csv.writer(f)
        w.writerow(column_list)
        
        driver = webdriver.Chrome(ChromeDriverManager().install())
        driver.get(URL)

        # 주의해야할껀 elements s를 붙여야 list형태로 나옴 하나로 하면, 그냥 하나씩만나옴
        depth_1_tbody =driver.find_element_by_xpath("//*[@id=\"react\"]/div/div[1]/div[2]/div[2]/div[2]/table/tbody")
        depth_2_tr = depth_1_tbody.find_elements_by_tag_name("tr") #여기까지만 하면 list object has no attribute 'text'라고 나옴

        for td in depth_2_tr:
            coin_row = td.text
            coin_row_list = coin_row.split("\n")
            w.writerow(coin_row_list)

def main():
	
	#date=sys.argv[1]
	crawl()
	
if __name__ == '__main__':
	main()	

 

위 코드를 실행하면 아래와 같이 크롤링한 결과가 csv에 저장된 것을 볼 수 있다.

 

 

 

마치며

이로써 아주 간결하게 Selenium을 실전에서 사용해보았다. 사실, Selenium을 제일 잘 활용할 수 있고 쉽게 익숙해지기 위해 암호화폐 거래소의 메인 페이지의 데이터만 긁어왔지만, 몇십만이 되는 데이터를 미친듯이 긁어야 크롤링의 매력 아니겠는가!

 

그런 의미로 다음 크롤링 포스팅에서는 좀 더 방대한 양의 데이터를 크롤링해보기 위해, '네이버 플레이스' 데이터나 뉴스 기사 크롤링을 생각해보고 있다. (크롤링 시리즈는 계속됩니다~) 

 

 


이전포스팅

[파이썬] 동적 웹 크롤링 (1) - Selenium webdriver 설치 및 사용

 

[파이썬] 동적 웹 크롤링 (1) - Selenium webdriver 설치 및 사용

Selenium webdriver를 사용해서 웹크롤링을 수행하기 위해 Selenium 모듈 설치, 사용할 브라우저, 브라우저의 드라이버를 설치해보고 사용방법을 간단히 알아본다. 추가적으로 chromedriver 경로 입력시 발생했던..

liveyourit.tistory.com

[파이썬] 동적 웹 크롤링 (2) - Selenium 을 활용해야 하는 이유? 자바스크립트 실행

 

[파이썬] 동적 웹 크롤링 (2) - Selenium 을 활용해야 하는 이유? 자바스크립트 실행

Selenium webdriver를 사용해서 웹크롤링을 수행할 경우 일반 크롤링과 어떻게 다르고, 어떤 경우에 활용되어야 좋은지 확인해본다. 다음 포스팅들에서는 Selenium으로 각 Element에 접근하는 방법 등 실제 사용방..

liveyourit.tistory.com

[파이썬] 동적 웹 크롤링 (3) - Selenium 사용법 (tag, class, xpath 등)

 

[파이썬] 동적 웹 크롤링 (3) - Selenium 사용법 (tag, class, xpath 등)

아래의 이전 포스팅에서 Selenium 및 브라우저 드라이버 설치, webdriver 객체 생성방법까지 알아보았다. webdriver 객체가 브라우저 제어권을 얻고 타겟 URL에 접근까지 했기 때문에 오늘은 그 후 작업으로 크롤..

liveyourit.tistory.com

 

댓글

Designed by JB FACTORY