Data Science

Selenium으로 인스타그램 크롤링하기

최근 크롤링에 대해 공부를 진행하면서 selenium이라는 엄청난 친구를 만나게 되었다.

 

selenium이란?

- 웹 페이지 테스트 자동화용 모듈

- 개발/테스트용 드라이버(웹브라우저)를 사용해 실제 사용자가 사용하는 것처럼 동작

 

selenium을 시작하기 전에

- selenium 모듈 설치

- 크롬 드라이버 다운로드 (자기가 사용하는 크롬 버전 확인 필수!!!)

 

selenium 모듈 설치하기

아나콘다 네비게이터의 Environments에 들어간다.

 

selenium을 치고 오른쪽 하단의 apply 버튼을 눌러 설치를 진행하면 된다!

설치한 후에는 재시작해야함

 

크롬 드라이버 설치하기

아래 링크로 들어가 가지고 있는 크롬 버전에 맞는 드라이버를 설치해준다!

설치 경로가 필요하므로 아는 곳에 설치해준다!

 

크롬 드라이버 다운로드

 

 

인스타그램 로그인 하기

이제 본격적으로 인스타그램 크롤링을 시작해보자!

import requests
from bs4 import BeautifulSoup
import time

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

필요한 라이브러리들을 import 한 뒤

 

driver = webdriver.Chrome('설치한 크롬 드라이버의 위치')
driver.get('https://www.instagram.com/')

위 코드를 실행하면 크롬 창이 뜨면서 인스타그램 페이지로 이동한다.

아이디와 비밀번호를 입력해준 뒤 로그인 버튼을 클릭해야하는데 F12를 눌러 각 창의 속성을 확인해보자!

 

위 사진과 같이 각 속성을 확인하며 알맞은 driver의 메서드를 이용해 값을 넣어준다.

(이것저것 하면서 직접 찾아보는 것 추천)

 

# 로그인
id_='본인 인스타그램 아이디'
password_ = '본인 인스타그램 비밀번호'

ID = driver.find_elements_by_css_selector("input")[0]
ID.send_keys(id_)

PW = driver.find_elements_by_css_selector("input")[1]
PW.send_keys(password_)

PW.submit()

 

로그인을 진행하면 위와 같은 팝업창이 뜨는데 '나중에 하기'를 눌러주자

이 부분도 F12를 눌러 어떤 속성을 가지고 있는지 파악한 후 알맞은 코드를 넣어주면 된다.

# 로그인 정보를 저장하시겠어요? 팝업창에서 나중에 하기 누르기
driver.find_element_by_css_selector("#react-root > section > main > div > div > div > div > button").click()

 

얘도 위와 똑같은 방식으로 팝업창을 없애주자

# 알림 설정 팝업에서 나중에 하기 누르기
driver.find_element_by_css_selector("body > div.RnEpo.Yx5HN > div > div > div > div.mt3GC > button.aOOlW.HoLwm").click()

 

인스타그램 로그인 완료!

 

인스타그램 게시글 가져오기

지금 하고 있는 동아리 bitamin의 게시글을 가져와보려고 한다.

 

먼저 검색창에 bitamin_official를 쳐서 계정으로 들어가보자!

검색창의 속성을 확인한 뒤 속성을 가져오자!

copy selector을 이용해서 복사해도 된다.

# 검색창에 비타민 검색
search = driver.find_element_by_css_selector("#react-root > section > nav > div._8MQSO.Cx7Bp > div > div > div.LWmhU._0aCwM > input")
search.send_keys("bitamin_official")

 

driver.find_element_by_class_name("-qQT3").click()

 

그 뒤 첫 번째 게시글을 클릭하고 화살표를 누르면서 게시글 내용을 가져오는 코드를 동일한 방식으로 속성을 확인하면서 코드를 짜면 된다!

# 첫 번째 게시글 클릭하기
driver.find_element_by_class_name("_9AhH0").click()

# 최근 6개 게시글 내용 가져오기
contents = []

for i in range(6):
    time.sleep(2)
    
    html = driver.page_source
    soup = BeautifulSoup(html, 'html.parser')
    
    content = soup.select('div.C4VMK > span')[0].text
    contents.append(content)
    
    # 다음 게시판으로 넘어가기
    driver.find_element_by_css_selector('body > div._2dDPU.CkGkG > div.EfHg9 > div > div > a._65Bje.coreSpriteRightPaginationArrow').click()

끝!