셀레니움 활용 2

JOOYEUN SEO·2024년 10월 7일

100 Days of Python

목록 보기
50/76
post-thumbnail

🗂️ Day50 프로젝트: 틴더 자동 스와이핑 봇

틴더에서 하루 스와이핑 최대치에 다다를때까지 자동으로 모든 사람을 like하는 봇
(실습을 위해 dislike로 변경)

1. 틴더 계정 생성

🔍 유의 사항

  • 실습용 프로필 사진 다운
    (새로고침을 할 때마다 머신러닝으로 생성한 가상 인물 사진을 보여주는 사이트)
  • 구글 계정 또는 페이스북 계정으로 로그인(페이스북이 좀 더 간단한 절차)
  • 전화번호 인증은 직접 틴터에 로그인해서 해야 한다(최초 1회만)

2. 로그인 화면으로 이동

🔍 유의 사항

  • 틴더 홈페이지에서 로그인 클릭 후 페이스북 계정으로 로그인 클릭
  • 로그인 팝업창을 켜기
    • NoSuchElementException 예외가 뜰 경우:
      버튼 클릭 사이에 약간의 지연을 추가하여 새 요소가 로드되는 데 걸리는 시간 벌기
    • XPath를 사용하면 더 쉬움

3. 로그인

🔍 유의 사항

  • 상위 창(팝업창)으로 포커스 전환
    •  base_window = driver.window_handles[0] : 첫 번째 창(기본)의 인덱스는 0
    •  popup_window = driver.window_handles[1] : 새 창의 인덱스는 1 증가
    •  driver.switch_to.window( popup_window ) : 괄호 안의 창으로 포커스 전환
    •  driver.window_handles : 모든 창을 리스트로 반환
    •  driver.title : 현재 포커스가 있는 창 확인
  • 로그인 창에서 아이디와 비밀번호 입력 후 로그인
  • 정상적으로 로그인되어 팝업창이 없어지면 다시 원래 창으로 포커스 변경

4. 선택 팝업창 제거

🔍 유의 사항

  • 위치정보 수집 팝업 : 허용
  • 알림 전송 여부 : 비허용
  • 쿠키 수집 여부 : 동의

5. (dis)like 누르기

🔍 유의 사항

  • 웹에서는 스와이핑 대신 패스 버튼을 누를 수 있음
  • 다음 버튼을 누르기 전에 최소 1초 이상 지연시간을 넣어야 함

⌨️ main.py 최종

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
# 요소 지정 없이 키보드를 누르기 위해 임포트
from selenium.webdriver.common.action_chains import ActionChains

chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("detach", True)

driver = webdriver.Chrome(options=chrome_options)
driver.get("https://tinder.com/")

# 로그인 버튼 클릭
time.sleep(2)
login = driver.find_element(By.XPATH, '//*[@id="q1029118820"]/div/div[1]/div/main/div[1]/div/div/div/div/div/header/div/div[2]/div[2]/a/div[2]/div[2]')
login.click()

# 페이스북 로그인 버튼 클릭
time.sleep(2)
fb_login = driver.find_element(By.XPATH, '//*[@id="q-699262256"]/div/div/div/div[1]/div/div/div[2]/div[2]/span/div[2]/button/div[2]/div[2]')
fb_login.click()

# 로그인 팝업창으로 포커스 변경
time.sleep(2)
base_window = driver.window_handles[0]
fb_login_window = driver.window_handles[1]
driver.switch_to.window(fb_login_window)

# 페이스북 로그인하기
email = driver.find_element(By.XPATH, '//*[@id="email"]')
email.send_keys("이메일")
password = driver.find_element(By.XPATH, '//*[@id="pass"]')
password.send_keys("비밀번호")
password.send_keys(Keys.ENTER)
continue_button = driver.find_element(By.XPATH, '/html/body/div[1]/div/div/div/div/div/div/div[1]/div[3]/div/div/div/div/div/div/div[2]/div/div/div[1]/div/div/div/div[1]/div/div/div/div')
continue_button.click()

# 틴더 창으로 다시 포커스 변경
driver.switch_to.window(base_window)

# 팝업창 닫기
time.sleep(3)
allow_location_button = driver.find_element(By.XPATH, '/html/body/div[2]/div/div[1]/div/div/div[3]/button[1]')
allow_location_button.click()

time.sleep(3)
notifications_button = driver.find_element(By.XPATH, '/html/body/div[2]/div/div[1]/div/div/div[3]/button[2]')
notifications_button.click()

time.sleep(3)
cookies = driver.find_element(By.XPATH, '/html/body/div[1]/div/div[2]/div/div/div[1]/div[1]/button')
cookies.click()

# diskike 스와이핑하기
time.sleep(100)
actions = ActionChains(driver)
for n in range(10):
    time.sleep(1)
    try:
        # 틴더를 홈에 추가 팝업이 뜰 경우 닫기
        add_home = driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div[2]/button[2]')
        add_home.click()
    except:
        # ← 방향키로 dislike 스와이핑하기
        actions.send_keys(Keys.ARROW_LEFT).perform()

버튼을 누르는 방식으로 할 경우 첫 번째 스와이핑만 적용되는 현상이 생겨 키보드 ← 키로 변경
try로 팝업을 닫는 것을 시도하고 except로 스와이핑 진행
(클릭이 아니어서 중간에 틴더를 홈에 추가하라는 팝업이 떠도 에러가 발생하지 않기 때문)




▷ Angela Yu, [Python 부트캠프 : 100개의 프로젝트로 Python 개발 완전 정복], Udemy, https://www.udemy.com/course/best-100-days-python/?couponCode=ST3MT72524

0개의 댓글