-목차-
1. 게임 소개
2. 필요 환경 구축하기
3. 웹페이지 분석
4. 코드 구현
5. 결과
1. 게임 소개
위의 링크로 들어가면 즐길 수 있다..!! 1부터 50까지 차례대로 누르는 게임인데 숫자의 위치는 랜덤이고 순발력을 중요시한다..!!
2. 필요 환경 구축하기
(1) 내가 사용한 에디터 : vscode
엄청 유명한 에디터다..!! 누구나 구글링으로 쉽게 다운로드 받을 수 있다.
(2) 내가 사용한 파이썬 모듈 : 파이썬 3.8 모듈
나는 3.8 버전을 사용했다.
(3) 웹 크롤링을 위해 사용한 방법 : selenium
selenium이 느리긴 하지만 다른 크롤링 방법들보단 웹자동화 및 크롤링을 모두 할 수 있고, 추가적인 여러 작업까지 소화가능하기에 초심자에게 정말 좋은 크롤링 방법이다.
vscode에서 다운로드 받는 방법은 커맨드 창에 pip install selenium을 치면 설치가 된다.
(4) 셀레니움과 웹을 연결하기 위해 드라이버 설치 : chromedriver
난 크롬을 주로 사용하므로 크롬드라이버를 사용하겠다.
크롬드라이버를 사용하려면 크롬버전을 확인해야하는데 아래 그림과 같이 크롬에서 설정을 누른 뒤 왼쪽 메뉴바에 있는 chrome 정보를 클릭하여 버전을 확인 할 수 있다.
3. 웹페이지 분석
1to50 게임 사이트에서 F12 버튼을 눌러 웹페이지 소스를 확인해보자.
빨간색 동그라미 친 부분이 바로 숫자들이 표시 되는 부분, 즉 게임을 하는 부분이다.
이제 이 부분의 정보값을 xpath를 통해 코드로 받아올 수 있는데 빨간 동그라미 친 부분을 우클릭한 뒤 copy에 들어가서 full xpath를 복사해오자. (참고로 full xpath를 복사하는게 그냥 xpath를 복사하는 것보다 기록이 더 잘 나옴.)
4. 코드 구현
(1) 일단 각종 모듈을 모두 불러와준다.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.alert import Alert
import time
(2) 게임 페이지 url을 구글 driver을 통해 크롬 페이지를 열자.
url = "http://zzzscore.com/1to50" # 게임 웹페이지 url
driver = webdriver.Chrome()
driver.get(url) # driver을 통해 크롬 페이지 열기
(3) 웹크롤링하는 부분
for_lst = [x for x in range(26)] # for_lst를 통해 첫번째 이중for문에서 효율적으로 계산하기
for j in range(1,26):
for i in range(1,26):
input_data = driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[3]/div['+ str(i) + ']')
data = input_data.text
if(data == ""):
pass
elif(int(j)==int(data)):
input_data.click()
for_lst.remove(int(i))
#print(str(j) + " click : ",data)
break
for_lst = [x for x in range(26)] # for_lst를 통해 두번째 이중for문에서 효율적으로 계산하기
for j in range(26,51):
for i in range(1,26):
input_data = driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[3]/div['+ str(i) + ']')
data = input_data.text
if(data == ""):
pass
elif(int(j)==int(data)):
input_data.click()
for_lst.remove(int(i))
#print(str(j) + " click : ",data)
break
일단 for_lst 라는 리스트에 숫자를 1~25까지 저장해준다. 아까 복사한 full xpath를 input_data에 저장해주고, text함수를 통해 input_data가 지금 어떤 수인지 확인하고 그 갑을 data에 저장해준다.
data가 암 것도 아니라면 넘어간다.
j는 우리가 클릭하고자하는 숫자고 i는 25객의 칸 중에서 i번째 칸을 말한다. 따라서 j 와 data가 같다면 클릭하고 이미 클릭한 i번째 칸은 다음 시행 때 고려하지 않게 하여 시간을 단축한다!
같은 원리로 두번째 이중 for문을 작동시켜준다.
(4) 웹크롤링이 끝나고 창 닫기 말고 기다려주기. (결과를 보기 위해)
driver.implicitly_wait(1000)
time.sleep(100000)
5. 결과
ㅋㅋ 할 때마다 결과가 다르게 나온다. 왜냐면 내 코드는 순차적인 방법을 통해 클릭하기때문이다. 물론 인터넷 속도 차이로 인해 기록이 다르게 나올 수도 있다.
※ 전체 코드
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.alert import Alert
import time
url = "http://zzzscore.com/1to50" # 게임 웹페이지 url
driver = webdriver.Chrome()
driver.get(url) # driver을 통해 페이지 열기
for_lst = [x for x in range(26)] # for_lst를 통해 첫번째 for문에서 효율적으로 계산하기
for j in range(1,26):
for i in range(1,26):
input_data = driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[3]/div['+ str(i) + ']')
data = input_data.text
if(data == ""):
pass
elif(int(j)==int(data)):
input_data.click()
for_lst.remove(int(i))
break
for_lst = [x for x in range(26)] # for_lst를 통해 두번째 for문에서 효율적으로 계산하기
for j in range(26,51):
for i in range(1,26):
input_data = driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[3]/div['+ str(i) + ']')
data = input_data.text
if(data == ""):
pass
elif(int(j)==int(data)):
input_data.click()
for_lst.remove(int(i))
break
driver.implicitly_wait(1000)
time.sleep(100000)
'개인 프로젝트 > 잡다한 것들' 카테고리의 다른 글
리눅스 환경에서 C 코드를 통해 전화번호 관리 프로그램 만들기 (0) | 2022.05.15 |
---|---|
[C/C++] 대칭절 - ! 특별한 날 - ! (0) | 2022.01.18 |
[파이썬 웹스크래핑] 파이썬으로 코로나 웹사이트 정보 정리하기 (0) | 2021.08.23 |
[파이썬 유튜브 다운로드] 파이썬으로 유튜브 영상 다운로드하기 (0) | 2021.08.20 |