지구정복

[Python] 리눅스CentOS 7에서 파이썬으로 웹 크롤링하기 2 (selenium- css태그) 본문

데이터 엔지니어링 정복/Python

[Python] 리눅스CentOS 7에서 파이썬으로 웹 크롤링하기 2 (selenium- css태그)

eeaarrtthh 2021. 5. 17. 11:29
728x90
반응형
SMALL

출처 : https://wikidocs.net/35955

 

-순발력게임 selenium으로 실행하기

이번에는 순발력 게임을 셀리니움을 이용해서 실행해보자.

순발력게임 링크는 여기 -> https://zzzscore.com/1to50/

 

아래처럼 각 div에서 XPath를 누른다.

(XPath는 XML 문서의 특정 요소나 속성에 접근하기 위한 경로를 지정하는 언어이다)

복사해서 붙여넣어보면 아래처럼 div의 순서가 25까지 있는 것을 알 수 있다.

 

이제 아래코드로 작성해서 게임을 해보자.

#//*[@id="grid"]/div[1]
#//*[@id="grid"]/div[2]
#//*[@id="grid"]/div[3]
#//*[@id="grid"]/div[25]

from selenium import webdriver
from pickle import TRUE

driver = webdriver.Chrome('chromedriver')
driver.get("https://zzzscore.com/1to50/")

#브라우저에서 사용되는 엔진 자체에서 파싱되는 시간을 기다려준다.
#만일 지정된 시간안에 파싱이 완료되지 않으면 에러 출력한다.
#파싱이 끝나면 다음 코드로 넘어간다.
driver.implicitly_wait(300)


#전역변수 num, 현재 찾아야될 숫자이다.
num = 1

def clickBtn():
    global num
    btns = driver.find_elements_by_xpath('//*[@id="grid"]/div[*]')
    
    for btn in btns:
        print( btn.text, end='\t')
        if btn.text == str(num):
            btn.click()
            print(TRUE)
            num += 1
            return 

while num <=50:
    clickBtn()

12초 나왔다 ㅎㅎ

 

 

-색맹 테스트

각 div값에서 css rgba값을 가져온 다음 Counter함수로 개수가 1인 rgba값을 찾는다. 개수가 1이면 그 색깔만 유일한 것이므로 정답이다. 개수가 1인 index값을 이용해서 버튼을 누르도록한다.

그리고 60초라는 시간 제한이 있으니 time.time()함수(1970년1월1일0시0분0초이후부터 현재까지의 시간을 초로 반환)를 이용해서 analysis()함수를 계속 실행한다.

#//*[@id="grid"]/div[1]
#//*[@id="grid"]/div[2]
#//*[@id="grid"]/div[230]

from selenium import webdriver
from pprint import pprint
import time
from collections import Counter


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

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


def analysis():
    btns_rgba = [ btn.value_of_css_property('background-color') for btn in btns ]
    #pprint( btns_color )
    
        #정답인 rgba는 개수가 1이고 나머지rgba는 개수가 여러개이므로 개수가 1인것이 정답이다.
    result = Counter(btns_rgba)
    #pprint( result )
    
    for key, value in result.items():
        print( key, value)
        if value == 1:
            answer = key
            break
        else:
            answer = None
            print( "No Answer" )
    
    if answer:
        index = btns_rgba.index(answer)
        btns[index].click()



if __name__=="__main__":
    start = time.time()
    while time.time() - start <= 60:
        analysis()
    
    

 

 

class="main"을 이용한 코드는 아래와 같다. 더 쉽지만 위의 예제에서는 css태그를 사용하는 것에 의의가 있다.

from selenium import webdriver
from pprint import pprint
import time

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

start = time.time()
while time.time() - start <= 60:
    try:
        btn = driver.find_element_by_class_name('main')
        btn.click()
    except:
        pass

 

 

 

 

 

 

728x90
반응형
LIST
Comments