파이썬

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

fecu 2022. 4. 8.

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

 

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

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

fecu.tistory.com

1. 이미 좋아요를 누른 피드가 많은 경우

while True를 이용해서 좋아요를 계속 누르다 보면, 어떤 해시태그에서는 좋아요를 누른 게시물이 너무 많아서 특정 게시물을 지나친 후에는 좋아요를 누를수 없는 경우가 많다. 혹은, 사람이 실제로 좋아요를 미리 눌러 놓아서 셀레니움이 누르지 못하는 경우도 있다. 이럴 경우에도 파이썬은 코드 그대로 '이미 작업한 피드입니다'를 계속 반복하며 다음 게시물로 넘어간다. 이미 '좋아요'를 누른 게시물이 4개 이상 반복된다면, 다음 태그로 넘어가는 것을 코드로 구현해보자.

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

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

    numoflike = 0
    stop_num = 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,70))
        else :
            print('이미 작업한 피드입니다.')               
            time.sleep(random.randrange(5))
            stop_num += 1
            if stop_num > 3:
                print(f'좋아요 누른 태그가 {stop_num}개 중복됩니다.') 
                break      

        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))

위의 코드는 지난 코드 중 함수 likey이다. 자세히 보면 중간에 stop_num이 추가되어 있는 것을 볼 수 있다. 그리고 중간의 else 구문에서 이미 작업한 피드일 경우 stop_num에 1을 더해서 돌려준다. 그리고 stop_num이 3개를 초과하면, 함수를 break하고 빠져나온다.

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

이와 같이 함수를 수정하면, 좋아요를 누른 피드가 4개가 반복될 때 likey 함수는 태그 작업을 끝내버리고 다음 태그로 넘어간다. 쓸데없이 피드를 넘기는 시간을 줄일 수 있고, 더 다양한 태그에서 좋아요를 누를 수 있다.

2. 전체 코드

다음 셀레니움 관련 게시물은 이번에 쓴 글들의 조회수가 조금 나온다면 쓰게 될 것 같다. 유용하게 쓰길 바란다.

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(20,30)
    driver.get('https://www.instagram.com/explore/tags/{}/'.format(insta_tag))
    time.sleep(random.randrange(5,15))

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

    numoflike = 0
    stop_num = 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,70))
        else :
            print('이미 작업한 피드입니다.')               
            time.sleep(random.randrange(5))
            stop_num += 1
            if stop_num > 3:
                print(f'좋아요 누른 태그가 {stop_num}개 중복됩니다.') 
                break      

        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 :
            print('새로운 피드가 없거나, 다음 피드가 없습니다. 다음 태그로 넘어갑니다.')
            driver.refresh()

 

댓글

💲 추천 글