파이썬

인스타그램 좋아요 봇 만들기 3 : 오류 처리하기

fecu 2022. 4. 7.

좋아요 봇을 실행하다 보면 오류를 내면서 멈춰버리는 경우가 많다. 이럴 경우 오류를 예외처리하고 좋아요를 계속 누르도록 만들 수 있다. 이전 글을 보지 않았던 사람은 아래의 글들을 참고하기를 바란다.

 

 

인스타그램 좋아요 봇 만들기 1(2022.02.19. 업데이트)

인스타그램을 공개로 하다 보면 가끔씩 내 피드에 들어와 글과 전혀 상관없는 댓글을 남기거나, 내 피드에 전혀 모르는 사람이 들어와 좋아요만 여러개 남기고 사라지는 사람들이 있는 것을 볼

fecu.tistory.com

 

인스타그램 좋아요 봇 만들기 2 : 해시태그 지정

이번 글은 이전의 '인스타그램 좋아요 봇 만들기 1'에 이어지는 글이다. 이전의 글은 단순하게 하나의 태그만을 지정하여 좋아요를 누르는 방식이었다. 이번 글에서는 여러개의 태그를 돌아가면

fecu.tistory.com

1. 좋아요 봇이 오류를 발생시키는 경우

좋아요 봇을 실행하다 보면 오류가 자주 발생한다. 예를 들면 위와 같은 경우에는 likey(tag) 함수 내부의 36번째 줄에서 오류가 발생했다고 한다. 오류 내용은 새로운 피드의 element를 찾을수 없는 경우이다. 실제로 구동중이었던 크롬을 열어서 확인해보면, 아무리 둘러봐도 새로운 피드가 없다. 이럴 경우 파이썬이 오류를 내면서 멈춰버린다. 이것 이외에도 다양한 원인에서 오류가 발생한다.

  • 검색한 태그의 새로운 피드가 없을 경우
  • 좋아요를 누른 후, 다음 피드가 없어 버튼을 찾을 수 없는 경우
  • 인터넷이 잘 되지 않아 피드가 로딩되지 않는 경우
  • 크롬 드라이버 오류로 페이지 로딩이 되지않는 경우

이러한 모든 오류를 예외 처리하고 크롬을 새로고침 한 다음, 다른 태그로 이동해 계속 좋아요를 누르도록 만들어보자.

2. 모든 오류 예외 처리

파이썬에서 오류를 예외 처리하는 방법은 아래와 같다.

try :
	print("실행코드")
	#실행할 코드
except :
	print("오류 발생시 실행 코드")
	#try에서 실행한 코드가 오류가 났을 경우 실행할 코드

이것을 이전 포스팅의 코드에 적용해보자. 만약 tag를 검색하여 좋아요를 누르던 도중 어떤 오류가 발생하면 메세지를 내보내고 창을 새로고침 한 뒤 다음 태그로 넘어가는 코드를 아래처럼 구현해보았다.

login('자신의 아이디','자신의 비밀번호')
while True :
    tags = ['원하는', '태그를', '입력해', '주세요']
    random.shuffle(tags)
    for tag in tags:
        try : 
            print(f'작업 태그는 {tag} 입니다.')
            likey(tag)
            print(f'{tag} 태그 작업이 끝났습니다. 다음 태그로 넘어갑니다.')
        except Exception as e:
        	print(e)
            print('새로운 피드가 없거나, 다음 피드가 없습니다. 다음 태그로 넘어갑니다.')
            driver.refresh()

위와 같이 파이썬을 실행하면 오류가 발생하더라도 바로 멈추지 않고 오류와 설정한 문구를 프린터 한다. 그리고 창을 새로고침 한 뒤 새로운 태그로 이동하게 된다. 

3. 원하는 오류만 예외처리 하고자 할 때

원하는 오류에 대해서만 예외처리를 할 수도 있다. 이때는 except 옆에 발생 오류명을 적어주면 된다.

try :
	print("실행코드")
	#실행할 코드
except 발생오류 :
	print("오류 발생시 실행 코드")
	#try에서 실행한 코드가 오류가 났을 경우 실행할 코드

좋아요 봇에서는 요소를 찾을 수 없을 때 오류가 자주 발생한다. 셀레니움에서 nosuchelementexception이라는 오류명을 import 해주고 이에 대한 except 구문을 만들어보았다.

from selenium.common.exceptions import NoSuchElementException

login('자신의 아이디','자신의 비밀번호')
while True :
    tags = ['원하는', '태그를', '입력해', '주세요']
    random.shuffle(tags)
    for tag in tags:
        try : 
            print(f'작업 태그는 {tag} 입니다.')
            likey(tag)
            print(f'{tag} 태그 작업이 끝났습니다. 다음 태그로 넘어갑니다.')
        except NoSuchElementException :
            print('새로운 피드가 없거나, 다음 피드가 없습니다. 다음 태그로 넘어갑니다.')
            driver.refresh()

4. 전체 코드

어차피 오류가 나면 멈추는건 모두 같기 때문에, 차라리 모든 오류를 에외처리하는게 더 좋을것 같다. 전체 코드는 아래와 같다. 다음 피드에서는 하나의 태그에서 이미 좋아요를 누른 피드가 4개 이상일 때, 다음 태그로 이동하는 것을 구현해보고자 한다.

 

인스타그램 좋아요 봇 만들기 4 : 이미 좋아요 누른 피드가 많을때

지난 포스팅에서는 좋아요 봇의 오류를 처리하는 방법에 대해서 알아보았다. 이번에는 하나의 태그에서 이미 좋아요 누른 피드가 많아서 좋아요를 누르지 못하는 경우, 이를 처리하는 방법에

fecu.tistory.com

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
import time
import random

options = webdriver.ChromeOptions()

options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument("--user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25")
options.add_argument("--start-maximized")

driver = webdriver.Chrome('chromedriver.exe', options=options)
driver.get('https://instagram.com')
time.sleep(10)
print('로그인 진행중...')

def login(yourid, password):
    btn= driver.find_elements_by_tag_name('button')[1]
    btn.click()
    inputbox = driver.find_elements_by_tag_name('input')[0]
    inputbox.click()
    inputbox.send_keys(yourid)
    inputbox = driver.find_elements_by_tag_name('input')[1]
    inputbox.click()
    inputbox.send_keys(password)
    inputbox.send_keys(Keys.ENTER)
    time.sleep(4)

def likey(insta_tag) :
    like_cnt = random.randrange(10,20)
    driver.get('https://www.instagram.com/explore/tags/{}/'.format(insta_tag))
    time.sleep(10)

    new_feed=driver.find_elements_by_class_name('eLAPa')[9] 
    new_feed.click()

    numoflike = 0
    for i in range(like_cnt): 
        time.sleep(3)
        span = driver.find_element_by_xpath('//*[@aria-label="좋아요" or @aria-label="좋아요 취소"]//ancestor :: span[2]')  
        like_btn = span.find_element_by_tag_name('button')
        btn_svg = like_btn.find_element_by_tag_name('svg') 
        svg = btn_svg.get_attribute('aria-label') 
        
        if svg == '좋아요' : 
            like_btn.click() 
            numoflike += 1
            print('좋아요를 {}번째 눌렀습니다.'.format(numoflike))
            time.sleep(random.randrange(50,60))
        else :
            print('이미 작업한 피드입니다.')               
            time.sleep(random.randrange(5))        

        if i < like_cnt-1 : 
            next_feed_xpath = driver.find_element_by_xpath('//*[@aria-label="다음" and @height="16"]//ancestor :: div[2]')
            next_feed = next_feed_xpath.find_element_by_tag_name('button') 
            next_feed.click() 
            time.sleep(random.randrange(5))

login('자신의 아이디','자신의 비밀번호')
while True :
    tags = ['원하는', '태그를', '리스트 형태로', '넣어주세요']
    random.shuffle(tags)
    for tag in tags:
        try : 
            print(f'작업 태그는 {tag} 입니다.')
            likey(tag)
            print(f'{tag} 태그 작업이 끝났습니다. 다음 태그로 넘어갑니다.')
        except Exception as e:
        	print(e)
            print('새로운 피드가 없거나, 다음 피드가 없습니다. 다음 태그로 넘어갑니다.')
            driver.refresh()

댓글

💲 추천 글