관리 메뉴

솜씨좋은장씨

[Python]인스타그램 크롤링을 통해 #흑당버블티 분석해보기! 본문

Programming/python

[Python]인스타그램 크롤링을 통해 #흑당버블티 분석해보기!

사용자 솜씨좋은장씨 2019. 10. 9. 22:35

요즘 들어서 대만카스테라, 벌집아이스크림 때처럼 흑당 버블티 가게가 우후 죽순 생겨나고 있습니다.

 

인스타그램 태그를 활용하면 흑당버블티에 대한 동향을 알 수 있을까라는 의문점이 들었고

 

셀레니움을 활용한 인스타그램 크롤링을 통해 흑당버블티에 대한 분석을 해보았습니다.

 

먼저 #흑당버블티 태그가 달려있는 게시물의 개수가 몇 개 인지 확인해보니

 

무려 76,291개나 되었습니다.

 

 

처음 목표는 이 76,291개 전체를 다 크롤링해와서 주마다 게시물 개수의 추이도 보고

 

# 흑당버블티 태그가 달려있는 글 들 속에서 각 회사별로 몇 번씩 언급이 되었는지 확인해보는 것이 목표였습니다.

 

그러나!!!!!

정말 앗, 이런! 하는 오류였습니다.

 

목표인 76,291개를 도달하기 전에 크롬드라이버가 다운이 되어버렸습니다.

 

제 추측으로는 메모리 부족으로 생각됩니다.

 

어디까지 크롤링이 되었는지 확인해보니 5,022개까지 크롤링 해 온 것을 볼 수 있었습니다.

5,022개의 글에서 태그를 크롤링해오면서 각각의 글이 작성된 날짜를 카운팅해보니 아래와 같은 결과가 나타났습니다.

 

원래 생각했던 것보다 너무 짧은 기간이었지만 하루에 1,500건 이상 씩 글이 올라온다는 것을 보니 요즘 인기가 많기는 한 것 같습니다.

 

인스타그램 게시물 수

브랜드 별 언급 횟수

 

5,000개 가량의 글 속에서 흑당버블티 브랜드명은 각각 몇 번씩 등장했는지 확인해보았습니다.

타이거 슈가 > 흑화당 > 공차 > 더앨리 > 이디야 > 쩐주단 > 타이완슈가 > 요거프레소 > 메가커피 > 팔공티 > 투썸플레이스 > 홍루이젠 >  카페그램 > 호이차 > 커피빈 > GS25 > 빽다방 > 더벤티 > 베스킨라빈스 > 놀숲 > 카페베네

순으로 많이 언급 된 것으로 보였습니다.

 

흑당버블티와 함께 태그된 단어들로 만든 워드 클라우드

 

크롤링에 사용한 코드

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

keyword = "흑당버블티"

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

instagram_tags = []
instagram_tag_dates = []

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(76086):
    time.sleep(1)
    try:
        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)
        
        date = driver.find_element_by_css_selector("time.FH9sR.Nzb55" ).text     # 날짜 선택

        if date.find('시간') != -1 or date.find('일') != -1 or date.find('분') != -1:
            instagram_tag_dates.append('0주')
        else:
            instagram_tag_dates.append(date)
        #print(instagram_tag_dates)
    except:
        instagram_tags.append("error")
        instagram_tag_dates.append('error')
    try:
        WebDriverWait(driver, 100).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'a.HBoOv.coreSpriteRightPaginationArrow')))
        driver.find_element_by_css_selector('a.HBoOv.coreSpriteRightPaginationArrow').click()
    except:
        driver.close()
    #     date = datum2.text
    #print(date)

    time.sleep(3)
driver.close()

 

5,022개의 게시물을 크롤링하는데 5시간 정도 걸렸던 것 같습니다.

 

학생, 직장인, 지역별로도 확인하고 싶었으나

 

워드클라우드를 만들다가... 커널이 재실행되는 바람에....

 

저장을 하지 않은 불찰로 인하여 데이터는 모두 사라졌습니다.

 

앞으로 크롤링을 하거나 뭔가 큰 데이터를 처리하고 나서는 DB건 csv건 저장을 미리미리 해야겠다는 교훈을 얻었습니다.

 

20 Comments
  • 프로필사진 yong 2020.06.08 01:18 안녕하세요

    크롬창을 띄우고 흑당버블티를 검색하는 순간

    로그인 창이 뜨면서 진전이 안되는데

    여기서는 어떻게 해야 하나요 ㅠㅠ
  • 프로필사진 BlogIcon 사용자 솜씨좋은장씨 2020.06.08 09:02 신고 정확히 어떤 건지는 모르겠지만 send_keys()명령어를 통해서 id / pw 입력해주거나 사람이 직접 입력해주시면 될 것 같습니다. 자세한 질문은 메일로 보내주세요!
  • 프로필사진 같은문제 2020.07.28 17:34 저도...하... 6만개 정도 있는데, 16000개에서 다운되어 버리네요.. 저말 메모리 문제인가바요..
  • 프로필사진 BlogIcon 사용자 솜씨좋은장씨 2020.07.28 17:46 신고 다른분이 하신거 중에 크롬드라이버에 headless걸어서 하신분이 좀 많이 하신것 같았는데 한번 찾아보셔도 좋을 것 같아요!
  • 프로필사진 hi 2020.08.24 13:14 안녕하세요~
    저는 인스타 크롤링해서 태그를 db에 저장하는 것까지 했는데
    저장한 db를 어떻게 그래프화 하셨나요?
  • 프로필사진 BlogIcon 사용자 솜씨좋은장씨 2020.08.27 10:20 신고 안녕하세요! 답변이 늦었습니다. 워드클라우드를 만드시는 것이라면 https://bit.ly/2FW4pTb 요기를 참고 부탁드립니다. 추가적으로 궁금하신 사항이 있으시다면 somjang@kakao.com으로 문의 바랍니다~
  • 프로필사진 2020.08.26 07:56 비밀댓글입니다
  • 프로필사진 BlogIcon 사용자 솜씨좋은장씨 2020.08.27 10:15 신고 유료 서비스는 제공하고 있지 않습니다! 돈을 받고 과제를 다해서 드리기보다는 직접 만들어 보시면서 궁금한 점을 질문해주시면 답변을 해드릴 수는 있을 것 같습니다. 인스타 그램 크롤링 코드는 블로그 포스팅 이외에 개인적으로 공모전에서 데이터를 사용할 목적으로 만든 코드도 있으니 궁금한 점 있으시다면 somjang@kakao.com으로 문의 바랍니다~
  • 프로필사진 2020.08.26 14:51 비밀댓글입니다
  • 프로필사진 BlogIcon 사용자 솜씨좋은장씨 2020.08.27 10:18 신고 insta_tag_df = pd.DataFrame({"tags":instagram_tags})

    insta_tag_df.to_csv("원하는이름.csv", index=False)

    위와 같은 방법으로 저장해주시면 됩니다! 다만 현재 올라와 있는 코드는 단지 날짜와 태그정보만 추출하여 각각 리스트 하나씩 만을 저장하여 날짜-태그-본문 등등 데이터를 한번에 저장하고 싶으시다면 어느정도 코드 수정이 필요합니다~
  • 프로필사진 갤럭시로~ 2020.08.27 15:59 좋은 글 잘 읽었습니다! 코드를 런 한 후, 인스타그램이 다 돌아가게되면 크롬드라이버가 자동으로 닫히지 않습니다. 강제종료하면 에러가 발생하고요.. ㅠㅠ 해결방안이 있을까요?
  • 프로필사진 BlogIcon 사용자 솜씨좋은장씨 2020.08.27 16:29 신고 driver.close() 다음에
    driver.quit() 을 추가해주시면 될 것 같습니다!

    혹시 이렇게 해도 해결되지 않는다면

    somjang@kakao.com으로 문의 바랍니다~
  • 프로필사진 BlogIcon 사용자 솜씨좋은장씨 2020.09.11 09:35 신고 아 그리고 아마도 WebdriverWait(100) 설정해둔 것이

    다음게시물로 이동하는 마지막 화살표가 없을 경우 화살표를 찾을떄까지 100초를 기다리도록 해둔 것이어서 조금 기다려보면 될겁니다~
  • 프로필사진 주니9988 2020.09.16 22:15 유튜브 댓글을 같은 방식으로 해 보려면 어떻게 하면 되나요?
  • 프로필사진 BlogIcon 사용자 솜씨좋은장씨 2020.09.16 22:16 신고 크롤링 부분인가요 아니면 워드클라우드인가요?
  • 프로필사진 크롤링맨 2020.10.22 18:34 감사합니다. 덕분에 크롤링 성공했습니다.
    혹시 크롤링 하셨을때 ban 혹은 reject 당한적은 없을까요? 있다면 어느정도 양을 했을 때 그런지 말씀해주시면 감사하겠습니다.
  • 프로필사진 BlogIcon 사용자 솜씨좋은장씨 2020.10.22 19:45 신고 안녕하세요.
    ban이나 reject을 당하지 않으려면 크롤링 중간중간에 딜레이를 랜덤으로 주시면 좋습니다.
    빨리 많은 내용을 크롤링을 하기위해 딜레이 시간을 주지 않고 몇번 실행하다보면 해당 사이트에서 크롤러를 탐지하는 코드들이 크롤링을 하는 것으로 간주하여 해당 ip에서 사이트의 접속을 차단합니다.

    인스타 크롤링 코드의 경우 최근 수정한 코드 기준으로 최대 대략 10,000건 가까이 크롤링을 해보았습니다.

    이는 마지막 게시물에서 다음 사진으로 가는 버튼이 더이상 등장하지 않아 종료했을때 결과입니다.

    아마 현재 올라가있는 코드는 사용하시는 컴퓨터 또는 서버의 메모리 용량에 따라서도 최대 크롤링 개수가 달라질 수 있으므로 다양한 이유를 고민해보시는 것을 추천드립니다.
  • 프로필사진 크롤링맨 2020.10.23 13:36 답변 감사합니다.

    한 가지만 더 문의드릴게요!
    공유해주신 코드에서 해당 부분이 -1이 출력되어 다음과 같은 조건을 걸어주신 것 같은데,
    if date.find('시간') != -1 or date.find('일') != -1 or date.find('분') != -1
    왜 -1이 출력되는지 이유를 알 수 있을까요?

    원하는 건 게시물의 최종 업로드 날짜를 날짜형식으로 가져오고 싶은데, 어떤식으로 끌고와도 -1로 출력이되네요ㅠㅠ
  • 프로필사진 BlogIcon 사용자 솜씨좋은장씨 2020.10.25 17:17 신고 date.find('시간') != -1 로 코드를 작성한 이유는 date 문자열 안에 시간, 일 또는 분이라는 문자열이 존재하지 않는 경우 -1로 return되는 find method의 특징을 활용하였기 때문입니다!

    date_object = driver.find_element_by_css_selector("div.k_Q0X.NnvRN > a.c-Yi7 > time._1o9PC.Nzb55")
    date_text = date_object.text
    date_time = date_object.get_attribute("datetime")
    date_title = date_object.get_attribute("title")


    위의 코드를 활용해보셔도 좋을 것 같습니다.
  • 프로필사진 BlogIcon 호저미 2020.11.27 04:31 신고 안녕하세요! 공유해주신 코드로 열심히 공부 중입니다!

    그런데 저는
    WebDriverWait(driver, 100).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'a.HBoOv.coreSpriteRightPaginationArrow')))
    이 코드에서 자꾸 Message: invalid session id 라는 오류가 뜹니다 ㅠㅠ

    인터넷을 찾아봐도 해결하지 못하고 있네용.. 조언 부탁드려도 될까요?
댓글쓰기 폼