관리 메뉴

솜씨좋은장씨

[Python] 인스타그램 태그를 가져와 워드클라우드 만들기! 본문

Programming/Python

[Python] 인스타그램 태그를 가져와 워드클라우드 만들기!

솜씨좋은장씨 2019. 10. 3. 13:25
728x90
반응형

1. 주제를 선택한 계기

특정 프랜차이즈에 관련된 최근 키워드를 알려주려면 어떤 것을 참고하면 좋을까 생각하다가

 

인스타그램에 걸려있는 특정 주제에 대한 여러 태그들을 크롤링하여 그 태그들을 빈도수로 정렬하여 보여주면 어떨까 생각해보았고

 

보여줄때 그냥 글자, 빈도수 이렇게 보여주면 재미 없으니 워드클라우드로 그려서 보여주면 어떨까 생각하여

 

일단 한번 해서 확인해보자라는 생각으로 해보게 되었습니다.

 

2. 태그 크롤링 하기

 

군 생활을 하면서 부대 근처에 있어 자주 갔던 커피베이 태그를 검색해서 그 글 속에 있는 태그들을 크롤링 해보기로 했습니다.

 

크롬 개발자 도구를 활용하여 태그를 검색하고 나오는 그 페이지의 코드를 확인해보니 클릭하지 않는 이상

 

각각의 게시글에 있는 태그를 가져올 수 없었습니다.

 

Selenium을 활용하여 클릭 이벤트를 주고 find_elements_by_css_selector로 태그를 가져와야겠다 생각했습니다.

driver.find_element_by_css_selector('div.v1Nh3.kIKUG._bz0w').click()

다음 글의 태그를 가져오기 위해서 화살표를 클릭해야겠다 생각했습니다.

driver.find_element_by_css_selector('a.HBoOv.coreSpriteRightPaginationArrow').click()

태그는 div태그 중 C7I1f X7jCj 클래스를 가지고있는 태그 안의 내용을 다 가져와서

정규식으로 태그만 추출하고 #을 ' '으로 변경한 뒤 

split() 함수를 사용하여 태그를 ' '를 기준으로 분리한 뒤

하나의 리스트로 계속 모으는 방법을 택했습니다.


instagram_tags = []
data = driver.find_element_by_css_selector('.C7I1f.X7jCj') # C7I1f X7jCj
tag_raw = data.text
tags = re.findall('#[A-Za-z0-9가-힣]+', tag_raw) 
tag = ''.join(tags).replace("#"," ") # "#" 제거
    
tag_data = tag.split()
    
for tag_one in tag_data:
    instagram_tags.append(tag_one)
print(instagram_tags)

 

아래는 태그를 크롤링해오는 전체 코드입니다.

import requests
from selenium import webdriver as wd
import time
import re

keyword = "커피베이"

url = "https://www.instagram.com/explore/tags/{}/".format(keyword)

instagram_tags = []

driver = wd.Chrome("./chromedriver")
driver.get(url)
time.sleep(3)

driver.find_element_by_css_selector('div.v1Nh3.kIKUG._bz0w').click()
for i in range(300):
    time.sleep(1)
    data = driver.find_element_by_css_selector('.C7I1f.X7jCj') # C7I1f X7jCj
    tag_raw = data.text
    tags = re.findall('#[A-Za-z0-9가-힣]+', tag_raw) 
    tag = ''.join(tags).replace("#"," ") # "#" 제거
    
    tag_data = tag.split()
    
    for tag_one in tag_data:
        instagram_tags.append(tag_one)
    print(instagram_tags)
    driver.find_element_by_css_selector('a.HBoOv.coreSpriteRightPaginationArrow').click()

    time.sleep(3)
driver.close()

 

3. 크롤링한 태그를 워드클라우드로 그리기

먼저 단어들 중에서 coffee, coffeebay와 같이 의미가 크게 없는 단어들을 불용어 처리해 줍니다.

stop_words = ['맞팔' , 'coffeebay', 'COFFEEBAY', 'cafe', 'coffee']
instagram_tags = [word for word in instagram_tags if word not in stop_words]

 

그 다음 태그가 담겨있는 리스트를 collections의 Counter를 이용하여 각 단어들을 빈도 수로 정렬했습니다.

정렬하고 나서는 가장 많은 빈도수를 가진 단어 200개를 선정하였습니다.

from collections import Counter
count = Counter(instagram_tags)
common_tag_200 = count.most_common(200)

 

이 빈도수 상위 200개의 단어를 가지고 워드클라우드를 그려보았습니다.

구름 사진 하나를 다운로드 받아서 그 사진을 마스크로 사용했습니다.

from PIL import Image

import matplotlib.pyplot as plt
from wordcloud import WordCloud
import numpy as np
from PIL import Image
import matplotlib
matplotlib.rcParams['font.family'] = "Maulgun Gothic"
font_path="C:/Windows/Fonts/NanumGothic.ttf"

denne_mask = np.array(Image.open('cloud.png'))

wc = WordCloud(font_path=font_path, background_color="white", width=800, height=600, mask = denne_mask)
cloud = wc.generate_from_frequencies(dict(common_tag_200))
plt.figure(figsize = (20, 16))
plt.axis('off')
plt.imshow(cloud)

 

4. 앞으로의 계획

실제 프로젝트에 적용할 방법에 대해 고민해보고 발전시켜보고자 합니다.

 

5. 크롤링 코드!

 

[Python] Selenium을 활용하여 인스타그램 크롤링 하기!

이번 글에서는 Python과 Selenium을 활용하여 인스타그램 게시물을 크롤링하는 방법에 대해서 적어보려 합니다. 해당 코드를 활용하여 발생하는 문제는 코드 사용자에게 있음을 알려드립니다. 1. 필

somjang.tistory.com

 

SOMJANG/Instagram_Crawler

인스타그램 크롤러 (Python, Selenium). Contribute to SOMJANG/Instagram_Crawler development by creating an account on GitHub.

github.com

Comments