IT Diary/# Dev Diary

[ Dev Dairy ] 007-1. 포켓몬 이미지 크롤링 ( selenium )

셜록호움즈 2021. 7. 30. 01:48
728x90
반응형

 

요즘 포켓몬 유나이트를 너무너무 재밌게 하고 있어서

그거와 관련된 조그만 프로젝트를 하면 좋을 것 같아서 고민중에 있다. 

 

일단 오늘은 포켓몬 유나이트의 참전 포켓몬을 크롤링해서 이미지들을 다운받는거 부터 시작하려고 한다.

 

크롤링(crawling) 혹은 스크레이핑(scraping)은 웹 페이지를 그대로 가져와서 거기서 데이터를 추출해 내는 행위다. 

소스는 python 으로 되어있고, 패키지는 파이썬에서 웹 브라우저 상호작용을 자동화하는 selenium 을 사용했다. 

 

일단 본인의 크롬버전을 확인하고

그 크롬버전에 맞는 크롬드라이버를 다운받아줘야한다. 

 

크롬 버전 확인방법은 오른쪽상단에 세개의 점 아이콘을 클릭 후, 도움말에서 chrome정보 보기를 클릭하면 확인이 가능하다.

크롬버전 확인

 

 

크롬드라이버는 https://chromedriver.chromium.org/downloads 여기서 다운이 가능하다. 

본인의 버전에 맞게 설치하면 된다.

 

1
2
3
4
5
6
7
8
9
10
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import urllib.request
import os
 
 
# 크롬 연결
driver = webdriver.Chrome(executable_path='본인이 다운받은 /chromedriver')
driver.get("https://www.google.co.kr/imghp?hl=ko")
cs

다운받은 크롬드라이버의 위치로 크롬을 연결시켜주고

find 에는 다운받을 포켓몬을 list 로 만든다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 가져올 포켓몬 정하기
find = ['이상해꽃''리자몽''피카츄''알로라''나인테일''푸크린''괴력몬''야도란''팬텀''마임맨''잠만보''앱솔''한카리아스''루카리오''암팰리스''개굴닌자','파이어로''에이스본''백솜모카''윽우지']
 
for key in find:
    # print(key)
    # 이미지 찾기
    elem = driver.find_element_by_name("q")
    # 기존 입력값 초기화 함수 실행
    clear_text(elem)
 
    # find에 넣어논 포켓몬 리스트를 검색어로 넣는다.
    elem.send_keys(key)
    # 엔터키 입력
    elem.send_keys(Keys.RETURN)
cs
1
2
3
4
5
 
def clear_text(element):
    # 검색어 길이를 찾고, 그 길이만큼 백스페이스를 날려준다.        
    length = len(element.get_attribute('value'))
    element.send_keys(length * Keys.BACKSPACE)
cs

중간에 한번 for문을 돌고 나서, 기존의 검색어가 아직 남아있기 때문에

그 검색어를 지워주기 위해서 clear_text 함수를 만들었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# 이미지가 없을 때 까지 스크롤 끝까지 내려가는 법
    # 스크롤 할때 잠깐 시간적 여유주기
    SCROLL_PAUSE_TIME = 1.0
 
    # Get scroll height
    last_height = driver.execute_script("return document.body.scrollHeight")
 
    while True:
        # Scroll down to bottom
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
 
        # Wait to load page
        time.sleep(SCROLL_PAUSE_TIME)
 
        # Calculate new scroll height and compare with last scroll height
        new_height = driver.execute_script("return document.body.scrollHeight")
        if new_height == last_height:
            try:
                #css 에서 다음페이지에 해당하는 id를 클릭해준다. 
                driver.find_element_by_css_selector(".mye4qd").click()
            except:
                break
 
        last_height = new_height
     # 이미지가 없을 때 까지 스크롤 끝까지 내려가는 법
 
    # 다운받는 부분
    images = driver.find_elements_by_css_selector(".rg_i.Q4LuWd")
 
    count = 1
    for image in images:
        # 가져올 갯수 정하기
        if count < 40:
            try:
                    image.click()
                    time.sleep(2)
                    imgURL = driver.find_element_by_xpath("/html/body/div[2]/c-wiz/div[3]/div[2]/div[3]/div/div/div[3]/div[2]/c-wiz/div/div[1]/div[1]/div[2]/div[1]/a/img").get_attribute("src")
                    
                    path = "./images/"+key
                    # 폴더가 없으면 생성하기 
                    if not os.path.isdir(path):
                        os.mkdir(path)
                    # 생성한 폴더에 이미지 저장하기
                    urllib.request.urlretrieve(imgURL, "images/"+key+"/"+key+str(count) + ".jpg")
                    count = count + 1
            except:
                pass
 
driver.close
cs

 

나머지 코드는 별거 없고,

 

이미지를 클릭한다음, 그 이미지를 다운받는다.

다운받은 이미지는 각각의 이름으로 폴더를 만들고

그 폴더에 count 를 해서 파일이름으로 저장해준다. 

폴더별로 저장된 이미지

내일은 요 이미지들을 가지고 teachable machine 에 적용시켜 모델을 학습해볼거다. 

 

728x90
반응형