본문 바로가기
개발 & IT & 데이터분석

파이썬 웹크롤링 : 인스타 해시태그 수집/분석하기 - 수집편

by 라이프리 2020. 12. 7.

개요

안녕하세요! 라이프리입니다. 인스타그램 게시물에는 많은 해시태그가 달려있는데요. 해당 키워드에 관련된 해시태그를 수집하여 분석해보면 재미있을것 같아 구글링을 하다가 솜씨좋은장씨 님의 블로그를 발견하게 되었습니다. 파이썬은 기본정도만 아는 저이지만, 블로그를 따라해보니 자동 크롤링이 구동되어서 정말 신기했습니다. 그러나, 마냥 똑같이 따라하지는 않았는데요. 저의 개발환경에서는 작동하지 않는 코드도 있어서 조금 바꿔 구현한 부분이 있어 제 블로그에도 정리하여 공유해보고자 합니다. 

- 우선, 해당 코드는 솜씨좋은장씨 블로그의 인스타그램 속 흑당버블티 분석해보기 글을 베이스로한 점을 밝힙니다.

 

이번 크롤링의 개요는 다음과 같습니다.

- 최근에 재택근무가 뜨면서, 의자에 관심이 생겨 "시디즈"라는 브랜드의 태그를 수집하겠습니다.

- 인스타그램 태그검색에 "시디즈"를 검색하여 게시물을 차례대로 클릭하고, 해시태그, 작성일자, 작성ID 데이터를 리스트에 저장합니다.

- 수집된 데이터를 Tableau를 활용한 WordCloud 형태로 시각화합니다.

 

크롬드라이버 설치

크롬드라이버는 파이썬 코드에따라 Chrome 브라우저를 자동으로 조작할 수 있도록 해주는 프로그램입니다. 이 크롬드라이버를 설치해주시고, 설치 경로를 꼭 기억해야합니다. 자신의 환경에 맞는 크롬드라이버를 설치해주세요.

- 크롬드라이버 설치 사이트로 바로가기

 

 

소스코드

- 주피터노트북에 다음 코드를 복사해서 붙여 넣으시고 실행하시면 됩니다.

- driver = wd.Chrome("-----path-----") 부분의 path만 개인별로 지정하시면 됩니다.

- 동작 순서는 ① 인스타그램 로그인 진행 -> 인스타그램 키워드검색 창 open ->  "시디즈" 입력, 검색 -> 왼쪽 위 게시물부터 클릭, 정보수집, 저장 -> 오른쪽 화살표를 클릭하여 다음 게시물로 넘어감 -> ⑥  ④~반복 -> ⑦ loop 순환 후 종료

 

 

먼저 셀레니움을 설치해주고, 필요한 것들을 모두 임포트해줍니다. 

 

# 셀레니움 설치
!pip install selenium 

# 필요 모듈 임포트
import requests
from bs4 import BeautifulSoup
from selenium import webdriver as wd
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import re
import pandas as pd
import numpy as np

 

그 다음, 동작하는 액션 하나하나에 해당하는 코드를 입력해서 실행해보시기 바랍니다. 아래 코드는 9400개의 게시물을 탐색하도록 코딩되어 있습니다!

 

# 해시태그 검색어
keyword = "시디즈"

# 사전 정보 정의
username = '본인의 인스타그램 아이디 입력'
userpw = '본인의 인스타그램 비밀번호 입력'
time.sleep(3)

# 해시태그 url 값
url = "https://www.instagram.com/explore/tags/{}/".format(keyword)

# dataframe 만들기(tags 컬럼(t1은 최대 20개까지로...))
insta_df = pd.DataFrame("", index=np.arange(1,9400), columns=["account","date", "t1", "t2", "t3", "t4", "t5", "t6", "t7", "t8", "t9", "t10"
                                                             , "t11", "t12", "t13", "t14", "t15", "t16", "t17", "t18", "t19", "t20"])
instagram_account =[]
instagram_tags = []
instagram_tag_dates = []

# 인스타 로그인 URL
loginUrl = 'https://www.instagram.com/accounts/login/'

# Chrome drvier 실행
driver = wd.Chrome("C://///////Users////////song///////Desktop//////chromedriver")
driver.get(loginUrl)
time.sleep(5)

# login
driver.find_element_by_name('username').send_keys(username)
driver.find_element_by_name('password').send_keys(userpw)
time.sleep(2)
driver.find_element_by_css_selector('button.sqdOP.L3NKy.y3zKF').click()
time.sleep(3)
# 정보 나중에 저장하기 클릭하고 넘어가기
driver.find_element_by_css_selector('button.sqdOP.yWX7d.y3zKF').click()     
time.sleep(3)
# 설정 나중에하기 클릭하고 넘어가기
driver.find_element_by_css_selector('button.aOOlW.HoLwm').click()   
time.sleep(3)

# 해시태그 검색 창에 "시디즈" 검색
driver.get(url)
time.sleep(3)

# 맨 왼쪽 상단 첫 게시물 클릭
driver.find_element_by_css_selector('div.v1Nh3.kIKUG._bz0w').click()
time.sleep(3)


# 데이터 기록, 다음 게시물로 클릭
for i in range(9400):
    try:
        # account 데이터 기록
        account_data = driver.find_element_by_css_selector('a.sqdOP.yWX7d._8A5w5.ZIAjV')
        account_text = account_data.text
                             
        # 날짜 기록
        date = driver.find_element_by_css_selector("time.FH9sR.Nzb55").text # 날짜 선택
        
        # 날짜 데이터가 시간, 일, 분 단위이면 0주로 변환
        if date.find('시간') != -1 or date.find('일') != -1 or date.find('분') != -1:
            date_text = '0주'
        else:
            date_text = date
        
        # 해쉬태그 데이터 기록
        data = driver.find_element_by_css_selector('.C7I1f.X7jCj')
        tag_raw = data.text
        tag = re.findall('#[A-Za-z0-9가-힣]+', tag_raw)
        tag = ''.join(tag).replace("#"," ") # "#" 제거
        tag_data = tag.split()
        
    except:
        tag_data = "error"
        date_text = "error"        
    try:
        # 최대 50초까지 기다렸다가, > 모양 클릭하여 다음 게시물로 넘어가기
        WebDriverWait(driver,50).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'a._65Bje.coreSpriteRightPaginationArrow')))
        driver.find_element_by_css_selector('a._65Bje.coreSpriteRightPaginationArrow').click()
    except:
        driver.close()
    time.sleep(5)
    if (i+1)%50 == 0 : print('{}, {}번째 게시물 탐색 완료'.format(time.strftime('%c', time.localtime(time.time())), i+1))
        
    # dataframe 저장
    insta_df.iloc[i, 0] = account_text
    insta_df.iloc[i, 1] = date_text
    for j in range(17):
        try:
            insta_df.iloc[i,j+2] = tag_data[j]
        except : break

# 결과값 저장
insta_df.to_excel("C:///Users///song///Desktop/////results.xlsx")

# 크롬드라이버 종료
driver.close()

 

이런 에러가 뜬다면...?

위와 같은 에러는 크롬 버젼과 크롬드라이버의 버젼이 맞지 않아서 발생하는 문제입니다. 이 문제는 크롬을 업데이트하시거나 크롬드라이버를 크롬버젼과 동일한 버젼으로 다운받으시면 됩니다. 저는 크롬드라이버를 87버젼으로 다시 다운받았습니다.

 

 

실행 화면

아래와 같이 동작한다면 잘 따라오셨습니다! 결과물 시트를 활용한 시각화분석은 이어서 하도록 하겠습니다!

www.youtube.com/watch?v=XsbhUREJzjM

 

 

 

 

 

댓글