David의 개발 이야기!

인스타그램 이미지 크롤링 프로그램 만들기! 본문

크롤링 공부

인스타그램 이미지 크롤링 프로그램 만들기!

david.kim2028 2023. 6. 12. 21:07
반응형

인스타그램을 통한 데이터수집을 위한 크롤러를 만들어보려고 한다.

 

머신러닝과목들을 수강하면서, 캐글이나, 데이터허브 같은 곳의 데이터가 아닌, 직접 데이터를 수집해서, 가공하는 경우가 가끔 있다. 최근에 진행한 중고차 예측 프로젝트 또한, 그렇게 "보배드림"이라는 사이트에서 일일히 사진과 관련 정보를 수집해서 학습을 시키고 예측하는 모델을 만들었는데, 이번에는, 인스타에서 이미지를 수집해서 향후 CNN이나, 이미지 분류 등의 모델학습때 요긴하게 사용해보고자 한다. 

 

우선 로직은 다음과 같다.

 

1. 웹에서 인스타그램 자동로그인

2. #{태그명} 검색페이지 이동 

3. 첫 사진 클릭

4. 이미지 저장 

5. 다음 버튼으로 누르기

6. 4,5번 반복 

 

해당 포스트에서는 간단한 베이스라인만을 작성해 공개하며,

본 베이스라인 코드를 통해서, GUI 를 만들어서 입혀 필요한 검색태그를 조금 더 유저친화적이게 만든다거나, 이미지 뿐만 아니라, 댓글 같은 것도 수집하는 것으로 변형할 수 있다.

 

M1 맥북을 사용하고 있어서, window 를 사용하는 환경과는 조금 다를 수 있다.

 

1. 원하는 페이지(인스타그램)로 이동하기 

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import urllib.request
import ssl

ssl._create_default_https_context = ssl._create_unverified_context
import time

# 크롬 드라이버 자동 업데이트
from webdriver_manager.chrome import ChromeDriverManager

# 브라우저 꺼짐 방지
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)

# 불필요한 에러 메시지 없애기
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])
service = Service(executable_path=ChromeDriverManager().install())

driver = webdriver.Chrome(options=chrome_options)

# 웹페이지 해당 주소 이동
driver.get("https://instagram.com")

처음에 배웠을때는, chromeDriver 를 직접 설치해서, 같은 경로에 두고 이를 불러와서 사용하는 것으로 배웠는데, 기술이 좋아진것인지, 나름대로의 검색능력이 향상된 것인지, 이를 자동으로 해주는 방법을 찾을 수 있었다.

 

"ChromeDriverManager"를 import 하면, 굳이 크롬 버전정보를 확인하고, 이를 설치하는 번거로움을 줄일 수 있었다.

다만, 이 라이브러리를 쓸 경우, 화면이 바로 꺼지는 문제가 있어, Options 를 따로 불러와 처리해주었고, 에러메세지 또한 Service 를 불러와 꺼두었다. 

 

세부적인 코드는 주석처리를 해두었으니, 읽어보면 이해할 수 있다.

 

 

 

2. 인스타그램 자동로그인하기 

#인스타그램 자동로그인
driver.implicitly_wait(10)  #나타날때까지 최대 10초동안 기다려
login_id = driver.find_element(By.CSS_SELECTOR, 'input[name="username"]')
login_id.send_keys('아이디입력') # 아이디 입력
login_pwd = driver.find_element(By.CSS_SELECTOR, 'input[name="password"]')
login_pwd.send_keys('비밀번호 입력')
driver.implicitly_wait(10)
login_id.send_keys(Keys.ENTER) #enter 키를 쳐주세요

해당 코드에서 알고 넘어가야할 부분은 아래와 같다.

 

driver.implicitly_wait 

driver.find_element

send_keys

 

driver.implicitly_wait 은 time.sleep() 과 기능적으로 유사하며, 차이점은, time.sleep()은 괄호안에 들어간 시간만큼 무조건 기다렸다가 넘어가나, implicilty_wait 은 html,css 정보가 불러와지면 시간과 무관하게 넘어가진다. 단, () 안에 입력한 숫자 시간을 초과할 경우, 에러가 발생한다.

 

driver.find_element 은 CSS, html 에서, 태그명, 아이디명을 통해 찾아불러오는 함수이다. 예전에는, find_element_by_css 이런걸로 제공되었는데, 어느순간부터 해당 함수는 지원되지 않고, find_element, find_elements 로 통일되었다. 태그명이나, 아이디명으로 불러오고 싶다면, 속성으로 By.CSS_SELECTOR 를 주어야한다. 

 

send_keys 는 내용을 입력하거나, ENTER 같은 동작을 처리할 수 있다.

 

추가로 이런 에러가 뜬다면, html, css 같은 프론트엔드를 불러오기전에, 크롤링을 시도해서 생기는 오류이니, time.sleep 이나, driver.implicitly_wait을 사용하면된다!

 

3. 인스타그램 태그를 검색해 사진 저장하기

driver.get('원하는 태그를 검색하고, 링크를 여기에 붙이면 됌')

driver.implicitly_wait(15)
#첫번째 사진 누름
first_img = driver.find_element(By.CSS_SELECTOR, '._aagw').click() #만약에 두번째 있는 사진부터 하고 싶다면, find_elements 쓰고, 인덱싱 하면 됨

driver.implicitly_wait(15)

for i in range(50):
    try:
        #사진 저장
        img_element = driver.find_element(By.CSS_SELECTOR, '._aatk .x5yr21d.xu96u03.x10l6tqk.x13vifvy.x87ps6o.xh8yej3')
        img_src = img_element.get_attribute('src')
        urllib.request.urlretrieve(img_src, f'{i}.jpg')

        #다음 버튼 클릭하기
        driver.find_element(By.CSS_SELECTOR, '._aaqg ._abl-').click()
    except:
        # 다음 버튼 클릭하기
        driver.find_element(By.CSS_SELECTOR, '._aaqg ._abl-').click()

 

혹시, 버튼 클릭이 안될경우, 

강제로 누르게끔 하는 위와같은 방법도 있으니 참고하자. 

 

로직은, 로그인을 하고, 태그를 검색한 후의 링크로 재접속해, 사진을 클릭하고, 옆으로 넘기며 저장하는 방식이다.

사진을 넘기다보면, 동영상이 있는데, 동영상은, try, except문으로 넘어가게끔 처리하였다.

 

이 베이스라인 코드를 통해 조금 더 발전된 인스타그램 자동화를 할 수 있을 것이다.

예를 들어, 요즘들어 chatgpt랑 연결해서 자동으로 맥락에 맞는 댓글을 달게끔 한다던가, 태그링크를 직접 붙이는 대신, gui에 입력하면 자동으로 변환해 넣어준다던가 등등 필요에 따라 변형해 사용할 수 있다.

 

다음 포스팅은 자동좋아요 이다. 살짝 변형된 버전이다!

2023.06.12 - [크롤링 공부] - 인스타그램 자동좋아요 프로그램 만들기!

 

인스타그램 자동좋아요 프로그램 만들기!

 

david-kim2028.tistory.com

 

 

반응형
Comments