Hun's Blog

[Python] 웹 크롤링 6 - 1 to 50 봇 본문

Language/Python

[Python] 웹 크롤링 6 - 1 to 50 봇

jhk-im 2020. 4. 6. 12:31

참고

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

https://wikidocs.net/36472

 

위키독스

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

wikidocs.net

 

1to50 게임해보기

http://zzzscore.com/1to50/ 

 

순발력 테스트! 추억의 1부터50까지

손은 눈보다 빠르다! 추억의 1부터50까지

zzzscore.com

 

1. 태그 구성 

1to50 버튼 태그 

-> 25개의 버튼은 div로 되어있다.
-> 게임에 사용되는 모든 버튼 요소 정보를 가져온다.
-> 각 버튼의 내부 텍스트를 파악하여 몇번 버튼인지 파악한다.
-> 찾는 숫자면 클릭한다.

-> div 태그 내부에 style 이라는 정보밖에 없어서 구분할 수가없다. 이럴 땐 xpath를 사용한다. 

 

태그의 xpath 찾기 


    -> xpath를 찾는다.
        ->*[@id="grid"]/div[1], //*[@id="grid"]/div[2] ... //*[@id="grid"]/div[25]

 

 

2. 스크립트 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from selenium import webdriver
driver = webdriver.Chrome('chromedriver')
driver.implicitly_wait(300)
 
btns = driver.find_elements_by_xpath('//*[@id="grid"]/div[*]')
 
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()
 
 

 

2-1

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

-> from selenium 의 webdriver() 메소드를 사용해 크롬 드라이버와 연결한다.

-> get() 메소드에 url 을 입력하여 해당 url을 크롬 웹브라우저로 실행시킨다. 

-> driver 변수에 담는다. 

 

2-2 

driver.implicitly_wait(300)

-> implicitly_wait() 메소드는 특정 상태가 될때까지 기다리고, 상태가 되면 바로 실행한다. 

-> 300초의 시간동안 웹드라이버의 크롬브라우저가 입력받은 url을 실행하고 문제없이 페이지가 로딩되어 실행되면 true를 반환하면서 다음으로 넘어가게 된다. 

 

2-3

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

-> webdriver의 find_elements_by_xpath() 메소드에 위에서 추출한 xpath를 배열번호를 [*] 로 지정하여 입력한다. 

   -> 해당 xpath의 형태를 가진 모든 elemetns를 찾아 btns변수에 담는다. 

   -> print(len(btns)) 로 btns 배열의 길이를 확인한다. 

 

lne(btns)

 

2-4

*clickBtn() 모듈 

 

num = 1

-> 전역변수 num 

def clickBtn():

-> 파이썬의 모듈로서 자바의 메소드와 같은 방식으로 사용된다. 
    global num

    -> global 키워드를 사용하면 전역 영역에 있는 변수를 지역 영역으로 사용할 수 있고 값을 변경할 수 있다. 
    btns = driver.find_elements_by_xpath('//*[@id="grid"]/div[*]')

    -> 버튼을 클릭하면 btns 가 변경되므로 다시한번 모든 버튼을 받아온다. 

    for btn in btns:

    -> btns 배열을 검사하는 for문 
        print(btn.text, end='\t') 
        -> 각각의 xpath 태그에 표시된 text 를 표시한다. 

        -> \t  는 문자열 사이 탭 간격을 줄 대 사용한다. 

        if btn.text == str(num):
        -> btn.text 가 num의 text와 같으면 클릭해야하는 태그라고 판단한다.  

            btn.click()

            -> 해당 xpath 태그를 .clickI() 메소드를 전송하여 클릭하도록 한다. 
            print(True)

            num += 1

            -> 1씩 증가 
            return

 

btns 검사하는 for문 실행 

 

 

2-5 

while num<=50:
    clickBtn()

-> clickBtn() 모듈을 50번 실행한다. 

 

최종 실행화면