파이썬

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

fecu 2021. 9. 26.

인스타그램을 공개로 하다 보면 가끔씩 내 피드에 들어와 글과 전혀 상관없는 댓글을 남기거나, 내 피드에 전혀 모르는 사람이 들어와 좋아요만 여러개 남기고 사라지는 사람들이 있는 것을 볼 수 있다. 이런 사람들의 대부분은 봇일 경우가 많다. 파이썬 프로그램 중 하나인 셀레니움과 크롬 드라이버를 이용하면 이를 쉽게 제작해 볼 수 있다.


참고로 이 포스트는 visual studio code를 기반으로 설명하고 있다. 혹시나 visual studio를 활용한 python 구현 환경이 이루어 지지 않았다면, 먼저 아래 글을 보고 오길 바란다.
https://fecu.tistory.com/205

 

파이썬(Python) 개발환경 구축하기

오늘 글은 비쥬얼 스튜디오 코드(Visual Studio Code)를 활용하여 파이썬(Python) 실행 환경을 구축하는 방법에 대한 글을 써보려고 한다. 1. 파이썬(Python) 다운받기 먼저 파이썬을 이용할 것이니 파이썬

fecu.tistory.com


2022.02.19. ~ 2022. 06.11. 업데이트
계속되는 인스타그램의 xpath의 변경에 절대경로를 계속적으로 바꾸었다. 이후 모든 xpath를 상대경로로 변환하였다. 상대경로에 대한 글은 아래의 글을 참고바람.

 

인스타그램 좋아요 봇 만들기 5 : XPath 상대경로

파이썬 셀레니움으로 인스타그램의 좋아요 버튼을 계속 누르고 있었는데, 인스타그램이 업데이트 될 때 마다 경로를 계속 변경해주어야 한다는 번거로움이 있었다. 그래서 이를 해소하기 위해

fecu.tistory.com


2022.07.17. ~ 2023.01.18. 업데이트
1) find_element 구문을 selenium 홈페이지에 있는 정규식으로 변환
2) random.randrange 함수를 random.uniform 함수로 변경

3) 셀레니움에 크롬에 적용했던 모든 옵션을 제거했다. 제거하니까 오히려 더 잘 돌아가는 것 같다.


2023.11.10. 업데이트

셀레니움 구동에 더 이상 드라이버 다운이 필요없게 되었다.


1. 셀레니움 설치

먼저 셀레니움을 설치하자. 터미널에 아래와 같은 명령어를 이용해 설치할 수 있다.

pip install selenium

 

2. 크롬 드라이버 다운

자신의 크롬 제일 오른쪽 위의 점 3개를 눌러 크롬의 버젼을 확인해 본다. 

그리고 구글에서 크롬 드라이버를 치면 나오는 사이트에서 자신의 빌드에 맞는 크롬 드라이버를 다운받아 주면 된다. 혹시 주소를 찾지 못할 까봐 그림 아래 링크를 달아 둔다.

인스타 좋아요 봇 만들기1

 

ChromeDriver - WebDriver for Chrome - Downloads

Current Releases If you are using Chrome version 95, please download ChromeDriver 95.0.4638.10 If you are using Chrome version 94, please download ChromeDriver 94.0.4606.41 If you are using Chrome version 93, please download ChromeDriver 93.0.4577.63 If yo

chromedriver.chromium.org

3. 인스타 좋아요 봇 만들기

1) 모듈 가져오기

먼저 필요한 모듈을 import 해준다. 난 아래와 같이 6가지 정도를 import 했다. 각각을 설명하면 아래와 같다.

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

from selenium import webdriver → 크롬 웹드라이버 구동
from selenium.webdriver.common.keys import Keys → 엔터, 컨트롤 등 키 입력
from selenium.webdriver.common.by import By → 웹 요소를 찾을 때 기준이 되는 요소를 호출
from selenium.common.exceptions import NoSuchElementException → 오류 정의 및 호출
import time → 웹페이지가 로딩되는 동안 기다리는 시간을 설정
import random → 로봇으로 인식되는 것을 방지하기 위해 시간을 램던으로 눌러줄 예정
 

2) 로그인

크롬 드라이버를 호출하고 인스타 그램 주소로 접속한다. 참고로 webdriver.Chrome 뒤의 괄호안에는 chromedriver.exe의 절대주소가 들어가야한다. 만약 python 프로그램과 드라이버가 같은 폴더에 있다면, 따로 주소를 입력하지 않아도 된다.

driver = webdriver.Chrome()
driver.get('https://instagram.com')
driver.implicitly_wait(15)
print('로그인 진행중...')

위의 코드에 따라 인스타그램을 접속하면 처음 만나는 화면은 아래와 같다. 이때 위의 방법과 같이 아이디 칸에서 ctrl+shift+c 를 눌러 입력칸의 속성을 확인해보면 aria-label 속의 내용을 볼 수 있다. 비밀번호도 aria-label의 속서을 이용하여 이를 찾고, 클릭해준 뒤 비밀번호를 입력하도록 하였다.

인스타 좋아요 봇 만들기2

inputbox = driver.find_element(By.XPATH, '//input[@aria-label="전화번호, 사용자 이름 또는 이메일"]')
inputbox.click()
inputbox.send_keys('아이디 입력')

inputbox = driver.find_element(By.XPATH, '//input[@aria-label="비밀번호"]')
inputbox.click()
inputbox.send_keys('비밀번호 입력')

이제 로그인 버튼을 누르면 로그인이 가능하다. 하지만 보통 우리는 로그인 할 때 엔터를 치지 않는가? 그냥 비밀번호 칸에서 엔터를 입력하면 된다. 엔터 입력 후 로그인이 진행될 때 까지 4초를 쉬어준다.

inputbox.send_keys(Keys.ENTER)
time.sleep(4)

 

3) 원하는 태그로 이동하기

이제 원하는 태그로 이동할 차례다. 인스타그램에서 원하는 태그를 검색해서 들어가 보면 주소가 아래 그림과 같다는 것을 알 수 있다. 그렇다면 이제 원하는 태그와 좋아요를 몇개 누를 것인지를 설정하고, 태그가 있는 주소로 이동해 볼 차례다. 피드로 이동 한 후 너무 빠르게 요소를 찾으면 로딩이 끝나지 않아 오류가 날 수 있으므로 10초를 잠깐 쉬도록 했다. 참고로 좋아요 수는 100개로 설정해 보았다. 원하는 태그를 여러개 설정하여 누르는 것은 다음 시간에 해보자.

인스타 좋아요 봇 만들기3

insta_tag = "원하는 태그 입력"
like_cnt = 100
driver.get('https://www.instagram.com/explore/tags/{}/'.format(insta_tag))
time.sleep(10)

 

4) 새로운 피드를 찾고 누르기

당신이 인스타 좋아요 봇을 누르는 목적은 인스타 팔로워를 늘리기 위한 것이다. 인기 게시물을 누르는 것 보다는 새로운 피드를 누르는 것이 더 전략적일 것. 새로운 피드를 찾아보면 스크롤을 내렸을 때 10번째 피드부터 시작한다는 것을 알 수 있다. 찾아보니 클레스 네임이 eLAPa인 div가 클릭을 받아줄 수 있다. 클레스 네임이 eLAPa 인 것들 중, 10번째를 찾아 클릭하도록 코드를 구현했다.

인스타 좋아요 봇 만들기4

new_feed = driver.find_elements(By.XPATH, '//article//img //ancestor :: div[2]')[9]
new_feed.click()

 

5) 좋아요 누르기

이제 좋아요를 눌러보자. 그런데 고려할 점은 좋아요를 누를 때, 이미 좋아요를 누른 상태라면 좋아요를 누르면 안된다. 좋아요 버튼의 구조를 보면 span 태그 아래에 버튼과 좋아요 상태가 함께 들어가 있는 것을 알 수 있다. 상위 태그를 먼저 찾아주고, 이 안에서 좋아요 버튼과 좋아요 상태를 찾아보는 것을 코드로 구현해보자. 

인스타 좋아요 봇 만들기5

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

만약 버튼이 이미 눌러져 있으면 좋아요를 누르면 안된다. 만약 svg 가 '좋아요'라면 좋아요 버튼을 클릭해준 뒤 '좋아요를 눌렀습니다.'를 출력하고, 아니라면 '이미 작업한 피드입니다.'를 출력하고 아무것도 하지 않도록 해준다.

if svg == '좋아요' : 
    like_btn.click() 
    print('좋아요를 눌렀습니다.') 
    time.sleep(5)
else :
    print('이미 작업한 피드입니다.')               
    time.sleep(5)

이제 좋아요를 누르고 다음 피드로 이동해야 한다. 다음 피드는 찾아보니 링크 이름이 "다음"인 것. 위와 똑같이 링크 텍스트를 찾아 클릭해준 뒤 5초를 쉬어준다.

6

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() 
driver.implicitly_wait(15)

 
그런데 이제 문제는 이러한 행동을 100번 반복해야 한다는 것. for 구문을 이용해 이 행동을 반복해보자.
 

6) 반복하기

위의 좋아요를 누르고 다음 피드로 넘어가는 것을 100개 까지 반복한다. 아까 like_cnt를 100으로 설정 했으니, 0~99까지의 숫자를 돌면서 좋아요를 계속 클릭할 것이다. 중간중간에 time.sleep과 random.randrage를 활용하여 주어진 변수 안에서의 램던한 값만큼 쉬어준다. 마치 사람이 하는 것 처럼.... 그리고 좋아요를 모두 눌렀다면 프로그램을 종료한다.

numoflike = 0
for i in range(like_cnt): 
    time.sleep(random.uniform(3.0, 5.0))
    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.uniform(50.0, 70.0))
    else :
        print('이미 작업한 피드입니다.')               
        time.sleep(random.uniform(3.0, 5.0))
        
    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.uniform(3.0, 5.0))

print("좋아요 작업이 끝났습니다. 프로그램을 종료합니다.")
driver.quit()
728x90

4. 전체 코드

전체 코드는 아래와 같다. 다음 시간에는 설정해둔 태그를 돌아가면서 좋아요를 누르도록 구현해보자.

 

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

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

fecu.tistory.com

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

driver = webdriver.Chrome()

driver.get('https://instagram.com')
driver.implicitly_wait(15)
print('로그인 진행중...')

inputbox = driver.find_element(By.XPATH, '//input[@aria-label="전화번호, 사용자 이름 또는 이메일"]')
inputbox.click()
inputbox.send_keys('당신의 아이디')

inputbox = driver.find_element(By.XPATH, '//input[@aria-label="비밀번호"]')
inputbox.click()
inputbox.send_keys('당신의 비밀번호')

inputbox.send_keys(Keys.ENTER)
time.sleep(random.uniform(4.0, 6.0))

# 원하는 태그 입력 및 누르고 싶은 좋아요의 수 입력
insta_tag = "원하는 태그 입력"
like_cnt = 100

driver.get('https://www.instagram.com/explore/tags/{}/'.format(insta_tag))
time.sleep(random.uniform(4.0, 8.0))

new_feed = driver.find_elements(By.XPATH, '//article//img //ancestor :: div[2]')[9]
new_feed.click()

numoflike = 0
for i in range(like_cnt): 
    time.sleep(random.uniform(4.0, 6.0))
    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.uniform(50.0, 70.0))
    else :
        print('이미 작업한 피드입니다.')               
        time.sleep(random.uniform(4.0, 6.0))      

    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.uniform(4.0, 6.0))
        driver.implicitly_wait(15)

print("좋아요 작업이 끝났습니다. 프로그램을 종료합니다.")
driver.quit()

댓글

💲 추천 글