일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- gs25
- 코로나19
- PYTHON
- Real or Not? NLP with Disaster Tweets
- 캐치카페
- 백준
- ChatGPT
- dacon
- 맥북
- hackerrank
- Docker
- Git
- 편스토랑 우승상품
- 금융문자분석경진대회
- programmers
- 파이썬
- 프로그래머스
- SW Expert Academy
- 편스토랑
- Kaggle
- github
- 프로그래머스 파이썬
- Baekjoon
- 데이콘
- 자연어처리
- AI 경진대회
- leetcode
- ubuntu
- 우분투
- 더현대서울 맛집
- Today
- Total
솜씨좋은장씨
[Python] 인스타그램 태그를 가져와 워드클라우드 만들기! 본문
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. 크롤링 코드!
'Programming > Python' 카테고리의 다른 글
[Python]Mac에서 Python을 활용하여 wav파일을 mp3파일로 변환하기! (0) | 2019.11.19 |
---|---|
[Python]인스타그램 크롤링을 통해 #흑당버블티 분석해보기! (43) | 2019.10.09 |
[Python]Mac에서 python으로 mp3파일을 wav로 변환하기(feat. homebrew) (0) | 2019.10.01 |
[Python]네이버 영화 데이터 크롤링하기 (3) | 2019.09.27 |
[Python]Jupyter notebook New 버튼의 반응이 없을때 (0) | 2019.09.24 |