관리 메뉴

솜씨좋은장씨

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

Programming/Python

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

솜씨좋은장씨 2019. 10. 9. 22:35
728x90
반응형

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

 

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

 

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

 

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

 

무려 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건 저장을 미리미리 해야겠다는 교훈을 얻었습니다.

 

크롤링에 사용한 코드는 아래의 링크를 참조해주세요.

 

SOMJANG/Instagram_Crawler

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

github.com

 

728x90
반응형
43 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 라는 오류가 뜹니다 ㅠㅠ

    인터넷을 찾아봐도 해결하지 못하고 있네용.. 조언 부탁드려도 될까요?
  • 프로필사진 BlogIcon 구구구루 2021.01.25 13:27 저도 위 오류가 뜨네요.. try문에서 .C7I1f.X7jCj 해당 변수를 찾지 못하여 except로 넘어가는 걸까요 ㅠㅠ?
  • 프로필사진 BlogIcon 솜씨좋은장씨 2021.01.25 13:32 신고 아마 저도 다시 해봐야 알겠지만 한 한달 전에 새로 코드를 작성하여 실행해보았을때 인스타 그램 측에서 무언가 크롤링 방지 작업을 해두었는지 일정 개수, 일정 시간이 지나면 다음 게시물로 가는 버튼이 존재함에도 클릭하지 못하고 사람이 클릭해주어야 넘어가는 경우가 있었던 것 같습니다. 아마 그것 때문에 그렇지 않을까 싶은데 자세한건 직접 다시 실행해봐야 알 것 같습니다. 뭔가 100초 이상 기다렸다가 없다고 판명되었을때 다시 화살표를 찾아보는 방법을 사용해보는 것도 좋을 것 같습니다. 더 자세한 답변은 메일주시면 확인해보고 이번주 안에 답변 드리겠습니다!
  • 프로필사진 BlogIcon 구구구루 2021.01.25 14:14 오른쪽으로 넘기는a.HBoOv.coreSpriteRightPaginationArrow
    저 css가 지금 확인해보니 바뀌어서
    a._65Bje.coreSpriteRightPaginationArrow
    < 이걸로 바꿔줬더니 실행이 되네요!
  • 프로필사진 BlogIcon 솜씨좋은장씨 2021.01.25 14:15 신고 아하 해결 방법 남겨주셔서 감사합니다~~~
  • 프로필사진 BlogIcon 호저미 2021.01.25 17:07 신고 코멘트 달아주셔서 감사합니다! 두달이 지나서 정확히 기억나진 않지만 저도 같은 방법으로 해결했던 것 같습니다 ㅎㅎ 포스팅 넘 감사합니다!!!
  • 프로필사진 Juju 2020.12.06 17:07 정말 감사하다는 말씀 드리고 싶어서 댓글답니다 ㅠㅠㅠ 이 글 없었으면 저는 아마 인스타그램 크롤링을 못했을 거예요... 정말 정말 감사합니다 ㅠㅠ 복받으십쇼....
  • 프로필사진 BlogIcon 솜씨좋은장씨 2020.12.26 16:29 신고 감사합니다~ 연휴 잘보내세요~
  • 프로필사진 열공이 2020.12.25 02:44 안녕하세요. 며칠동안 여러 자료를 보고 크롤링에 성공한 것같은데요.
    문제가 발생해서 도움좀 부탁드립니다.
    먼저는 크롤링한 데이터를 [태그, 시간]으로 프린트를 하면
    (4회 페이지 넘겼을 경우) [[태그1,태그2,태그3,태그4],[1주,4주,0주,3주]
    이렇게 출력되는게 4번 반복해서 나옵니다. 해결할 방법이 있을까요?

    위 문제는 판다스에서 칼럼을 태그따로, 시간따로 불러서 수작업으로 엑셀에서 합치려고 하는데요.

    더 크나큰 문제가 ㅠ ㅠ
    연습한다고 며칠을 계속 같은 검색어를 입력했더니, 게시물은 2만건이 넘는데, 20건정도만 나오고 next버튼이 안나오더라구요.
    다른 컴퓨터에서 검색해서 스크롤을 내려보니 게시물이 로딩이 되지 않습니다.
    차단된것으로 생각되는데요.
    이거는 혹시 다른 아이디를 만들거나 다른 와이파이를 잡아서 하면 풀릴까요?
    꼭 그게시물을 찾아서 해야하는데 큰일입니다 ㅠ
    os는 맥으로 사용하고 있습니다.
    혹시 아시면 꼭좀 답변주세요.!!
  • 프로필사진 BlogIcon 솜씨좋은장씨 2020.12.26 16:33 신고 조금 더 구체적으로 코드와 함께 질문해주시면 답변하는데 도움이 될 것 같습니다! somjang@kakao.com으로 보내주시면 보고 답변 드리겠습니다.

    그리고 20건 정도만 나오고 next버튼이 로딩되지 않는 문제는 다른 장소(ip)에서 테스트했을때도 그런지 확인해보시면 ip차단을 당한 것인지 알 수 있을 것 같습니다.

    그럼 메일 기다리고 있겠습니다! 즐거운 연휴 보내세요~
  • 프로필사진 화이팅 2021.01.29 10:47 안녕하세요. 공모전 준비중에 크롤링 하신 코드 보고 많은 도움이 되고있습니다.
    그런데 인스타그램 크롤링 하는데 까지는 성공을 했는데요..
    만약 키워드가 게시글 처럼 흑당버블티라고 했을때 크롤링한 데이터로 흑당버블티 인스타그램 주별 게시물 수는 어떻게 그래프를 그릴수 있나요?ㅠ
  • 프로필사진 BlogIcon 솜씨좋은장씨 2021.01.29 13:45 신고 안녕하세요.
    먼저 그래프를 그리는데에는 matplotlib라이브러리를 활용하였습니다.

    데이터에 대해서는 크롤링 시 인스타그램의 특성을 활용하여

    특정 html태그 속 시간이나 날짜로 되어있는 게시물은 0주로

    나머지 게시물은 자동으로 1주 2주 3주 이렇게 되어있어 해당 내용을 리스트에 append하고 카운팅하여 그렸었습니다.

    만약 날짜로만 가져왔다 하면 datetime을 활용하여 주별로 나누고 각각 카운팅해서 그릴수도 있을 것 같습니다
  • 프로필사진 동진카우 2021.03.11 00:18 여러 인스타 크롤러 소스코드를 비교해 가며 공부하고 있는데 거의 공통되는 문제점인데 왜 항상 처음 사이트가 열리는게 태그검색 사이트가 아닌 로그인 사이트가 열리는 것일까요?
  • 프로필사진 BlogIcon 솜씨좋은장씨 2021.03.11 11:12 신고 안녕하세요! 확실한건 아니고 제 생각을 말씀드리면 인스타그램 측에서 크롤링에 대한 대비책으로 했을 수도 있고 개인정보 관련하여 보호해야하기 때문에 로그인을 해야지만 게시물을 확인할 수 있게 한게 아닌가 싶습니다.
  • 프로필사진 뇨무뇨무 2021.04.04 10:25 항상 게시물 잘 보고 있습니다.
    올려주신 코드를 사용해보려고 하는데, 오류가 생겨 그와 관련한 문의메일 보냈습니다 바쁘실텐데 죄송하고,, 한번만 확인 부탁드립니다 죄송합니다 ㅠㅠ!!
  • 프로필사진 BlogIcon 솜씨좋은장씨 2021.04.04 21:20 신고 넵! 확인해보고 답변드리겠습니다~
  • 프로필사진 익명 2021.04.04 21:37 비밀댓글입니다
  • 프로필사진 뇨무뇨무 2021.04.05 17:44 안녕하세요, 어제에 이어 다시한번 질문 드리게 되었습니다.
    데이터 수집은 무사히 진행되는 듯한데, 이번에는 데이터 저장 과정에서 문제가 생긴 듯하옵니다.
    자세한 내용은 이메일로 문의 드렸습니다 ㅠ
    Traceback (most recent call last):
    File "C:/Users/82105/Desktop/Mi.py", line 85, in <module>
    insta_df.iloc[i,0] = account_text
    File "C:\Python\Python36\lib\site-packages\pandas\core\indexing.py", line 667, in __setitem__
    self._has_valid_setitem_indexer(key)
    File "C:\Python\Python36\lib\site-packages\pandas\core\indexing.py", line 1394, in _has_valid_setitem_indexer
    raise IndexError("iloc cannot enlarge its target object")
    IndexError: iloc cannot enlarge its target object
  • 프로필사진 BlogIcon 솜씨좋은장씨 2021.04.09 11:20 신고 내일까지는 답변 드리겠습니다!
  • 프로필사진 크롤링 2021.06.05 20:05 안녕하세요. 좋은 정보 감사합니다.
    저는 구글의 colab에서 이 코드를 실행하려고 합니다. 그런데 코드 실행 중에 아래 부분에서 에러가 나는데 이유를 잘 모르겠습니다..분명히 Div랑 class는 존재하고 스펠링 미스도 없는데, 존재하지 않는다고 나오네요..
    <에러 부분>
    driver.find_element_by_css_selector('div.v1Nh3.kIKUG._bz0w').click()
    <에러 내용>
    NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"div.v1Nh3.kIKUG._bz0w"}
    (Session info: headless chrome=91.0.4472.77)
  • 프로필사진 BlogIcon 솜씨좋은장씨 2021.06.05 20:09 신고 안녕하세요. 댓글 남겨주셔서 감사합니다.
    아마 포스팅이 된 이후로 해당 부분의
    class명이 바뀌어서 Selenium이 제가 올려둔
    class명을 활용하여 찾으려고 하여
    찾지 못하는 문제인 것 같습니다.

    직접 원하는 부분의 class명이 무엇인지
    크롬에서 F12를 눌러 나오는 크롬 개발자 도구를
    활용하여 찾아 반영하면 제대로 동작할 것 같습니다.

    혹시 해보았는데도 되지않는다면
    https://bit.ly/3wYUCRM
    위의 링크를 참고해보시면 좋을것 같아요!

    감사합니다.
  • 프로필사진 BlogIcon 크롤링 2021.06.05 21:26 빠른 답변 정말 감사합니다.
    Class명은 저도 여러번 확인 했습니다만, 바뀌지 않은 것 같아요.
    이유를 모르겠네요..
    혹시 로그인 문제인가 싶어서
    로그인 코드도 추가 했는데,
    이번에는 또 driver.find_element_by_name("username").send_keys(username) 에서 하기 에러가 나네요.
    NoSuchElementException

    이유는 잘 모르겠지만 driver.find자체가 작동 안하는 것 같네요.
    답변 감사합니다.
  • 프로필사진 개발 2022.05.19 12:34 안녕하세요. 인스타 크롤링하면서 어려움이 있었는데 많은 도움이 되었습니다! 혹시 피드 이미지는 어떻게 가져올 수 있을지 여쭤봐도 될까요? 아래와 같이 find_element를 썼더니 첫번째 이미지만 계속 가져오고 있습니다. 처음에는 selector로 했다가 오류가 나서 tag_name을 썼더니 이미지 자체는 잘 긁어오는데 같은 이미지만 가져오네요. 정말 감사합니다.
    try:
    images = driver.find_element(By.TAG_NAME, 'img')
    images_src = images.get_attribute("src")
    except:
    images_src = None
  • 프로필사진 BlogIcon 솜씨좋은장씨 2022.05.27 16:50 신고 안녕하세요! 댓글남겨주셔서 감사합니다.
    해당 부분은 저도 예전에 구현을 시도하였을때 비슷한 경험이 있었는데 저는 딱히 필요한 기능이 아니었어서 더 구현을 하지는 않았었습니다.

    조만간 한번 시도해보고 되면 공유드릴게요!

    감사합니다.
댓글쓰기 폼