Hun's Blog

[Python] 웹 크롤링 7 - 색감테스트 봇 구현 본문

Language/Python

[Python] 웹 크롤링 7 - 색감테스트 봇 구현

jhk-im 2020. 4. 6. 13:21

참고

파이썬 레시피 - 웹 활용 입문편을 공부하면서 정리한 내용

https://wikidocs.net/36472

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

색감테스트 해보기

http://zzzscore.com/color/

 

색감 테스트! 나는 몇점일까?

색감 테스트, 나의 눈은 얼마나 정확한가?!

zzzscore.com

 

 

1. 태그 구성

-> 버튼이 4 -> 9 -> 16 ... 으로 늘어난다.
-> div로 되어있다.
-> xpath 찾기 
-> //*[@id="grid"]/div[1] -> //*[@id="grid"]/div[2] ...

 

태그 내부에 아무런 요소가 없다.

 

2. 스크립트 작성 

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
from selenium import webdriver
from pprint import pprint
import time
from collections import Counter
import time
 
driver = webdriver.Chrome('chromedriver')
driver.implicitly_wait(300)
 
btns = driver.find_elements_by_xpath('//*[@id="grid"]/div')
#print(len(btns))
 
def analysis():
    btns_rgba = [btn.value_of_css_property('background-color'for btn in btns]
    #pprint(btns_rgba)
 
    result = Counter(btns_rgba)
    #pprint(result) # value가 1이면 정답
 
    for key, value in result.items():
        if value == 1:
            answer = key
            break
    else:
        answer = None
        print("정답을 찾을 수 없음")
 
    if answer :
        index = btns_rgba.index(answer)
        btns[index].click()
 
if __name__=="__main__":
    start = time.time()
    while time.time() - start <= 60:
        analysis()
 
 

 

2-1

driver = webdriver.Chrome('chromedriver')
driver.get('http://zzzscore.com/color/')
driver.implicitly_wait(300)

-> 크롬 드라이버 셋팅 

 

2-2
btns = driver.find_elements_by_xpath('//*[@id="grid"]/div')

-> 1to50 봇과 다른점이 있다. 
-> //*[@id="grid"]/div[*]에서 div[]의 *은 찾고자 하는 내부요소가 있는경우만 탐색한다. 
-> 1to50 에서는 항상 숫자가 존재하기 때문에 내부요소가 있으므로 탐색한다.

-> 하지만 지금같은 경우에는 태그 내부에 아무런 요소가 없다. 

-> 이 경우에는 //*[@id="grid"]/div 으로 입력해야한다. 

len(btns) 출력

 

2-3

# 정답 탐색 및 클릭 모듈
def analysis():
    btns_rgba = [btn.value_of_css_property('background-color') for btn in btns]

    -> btns 를 for문으로 돌면서 각 태그의 rgba 값을 추출한다.

    -> selenium 의 value_of_css_property로 해당 요소의 css 속성을 확인할 수 있다. 

    -> 추출한 값중 다른 1곳이 정답이다. 

 

btns_rgba 출력


    result = Counter(btns_rgba)

    -> from collections import Counter 참조 

    -> collection 모듈의 count 메소드는 컨테이너에 동일한 값의 자료가 몇개인지를 파악하는데 사용한다. 

    -> result라는 변수에 담는다. 
    -> result value가 1이면 정답 

         

Counter(btns_rgba) 출력


    for key, value in result.items():

    -> result.items() 메소드로 각각의 아이템을 배열처럼 검사할 수 있다. 

    -> 배열은 Counter 메소드에 따라 key와 value로 저장된다. 
        if value == 1:

        -> vlaue가 1인것이 정답
            answer = key

            -> 정답일 경우 answer라는 변수에 key 를 담는다. 
            break
    else:
        answer = None
        print("정답을 찾을 수 없음")


    #정답 누르기
    #-> answer에 저장된 색이 어느 위치에 있는지 btins_rgba에서 찾는다.
    #-> 해당 인덱스로 btns에 저장되어있는 요소를 찾아 클릭한다.
    if answer :

    -> answer 변수에 key 가 셋팅이 되었을때 
        index = btns_rgba.index(answer)

        -> btns_rgba.index() 메소드를 사용하여 key 를 입력하고 해당 item의 인덱스번호를 반환받는다. 
        btns[index].click()

        -> btns 리스트에 해당 item의 인덱스번호를 입력하고 .click() 메소드를 전송하여 클릭하도록 요청한다. 

 

 

2-4

if __name__=="__main__":

-> 인터프리터에 의해 직접 실행될 경우에만 실행하도록 한다. 
    start = time.time()

   -> time 모듈의 time() 메소드는 실제 시간의 초로 카운트 할수있도록 구현되어있다. 
    while time.time() - start <= 60:

    -> 60초 동안 
        analysis() 

        -> 정답을 찾아 클릭하는 모듈 반복실행

 

최종실행