관리 메뉴

솜씨좋은장씨

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

Programming/Python

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

솜씨좋은장씨 2021. 4. 25. 05:32
728x90
반응형

이번 글에서는 Python과 Selenium을 활용하여 인스타그램 게시물을 크롤링하는 방법에 대해서 적어보려 합니다.

해당 코드를 활용하여 발생하는 문제는 코드 사용자에게 있음을 알려드립니다.

 

% 현재 아래의 방법을 활용한다고 하여 게시물을 무한으로 크롤링 할 수 있지는 않습니다.

개인 PC사양, 네트워크 환경에 따라서 같은 코드여도 크롤링 할 수 있는 게시물의 개수가 달라짐을 알려드립니다.

제 환경 ( MacBook Pro 2017 13인치 - 4 Thunderbolt Ports 8GB + 500Mbps 인터넷 ) 에서는

약 10,000개 정도 까지 가능했습니다.

dmkym 님 댓글 남겨주셔서 감사합니다~👍

 

% 2021년 7월 기준

인스타그램 측에서 사람이 손으로 게시물을 클릭하여 접근하여도 일정 게시물 이상 (약 100~300개) 접근하게 되면 

위와 같이 페이지를 더이상 사용할 수 없다는 화면이 나오면서

더이상 크롤링이 불가합니다. 

 

추후 다른 방법을 찾게 되면 추가 업데이트를 진행하도록 하겠습니다.

감사합니다.

 

% 현재 페이스북 로그인 부분에서 문제가 있어 제대로 동작하지 않을 수 있습니다.

메일 주신 분들 답변이 늦어져 죄송합니다.

수정이 완료되면 메일 답변 및 포스팅 업데이트를 진행하려고 합니다.

감사합니다!

 

% 2021년 7월 12일 현재 로그인 불가 문제, 댓글을 크롤링 했을때 한글이 깨지는 문제 해결하였습니다.

+ 페이스북 로그인, 인스타그램 로그인 두 가지 방법 중에 선택한 방법으로 로그인이 가능하게 되었습니다.

업데이트 하여 올려둔 코드는 아래의 링크를 참고해주세요.

메일 주셨던 분들 한분 한분 차례대로 답변드리겠습니다!

기다려 주셔서 감사합니다.

 

% 2022년 2월 5일 현재 다음 게시물로 넘어가지 않는 문제를 해결하였습니다.

게시물에는 반영하지 않았지만 GitHub에 올려둔 코드는 반영하였습니다.

https://github.com/SOMJANG/Instagram_Crawler/issues/4

 

다음 게시물로 넘어가지 않는 문제 · Issue #4 · SOMJANG/Instagram_Crawler

2022년 2월 3일 메일 문의 다음 게시물로 넘어가지 않는다 100초를 기다려도 넘어가지 않고 종료된다

github.com

% 2022년 4월 28일 현재 다음 게시물로 넘어가지 않는 문제를 해결하였습니다.

게시물에는 반영하지 않았지만 GitHub에 올려둔 코드는 반영하였습니다.

https://github.com/SOMJANG/Instagram_Crawler/issues/6

 

인스타그램 태그 이외에 추출이 되지 않는 문제 · Issue #6 · SOMJANG/Instagram_Crawler

2022년 4월 26일 블로그 댓글 질문 nstagram_tag 내용은 잘 뽑히나, instagram_extract가 내용이 하나도 안 뽑히는 문제 출처: https://somjang.tistory.com/692#comment6422695 [솜씨좋은장씨]

github.com

 

 

SOMJANG/Instagram_Crawler

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

github.com

1. 필요 라이브러리 설치

먼저 Python과 Selenium을 설치해야 합니다.

설치가 되어있지 않은 분들은 아래의 링크를 참고하여 설치해주세요.

 

Python 설치 - Windows

 

[Windows] Windows에 Python 3.7.3 설치하기!

1. Python 3.7.3 설치파일 다운로드 Welcome to Python.org The official home of the Python Programming Language www.python.org 먼저 Python 홈페이지로 이동합니다. Download 메뉴를 클릭하여 Download 페..

somjang.tistory.com

Python 설치 - Ubuntu

 

[Python]Ubuntu에 Python 3.7 설치하기!

1. Python 설치 전 라이브러리 설치하기 Ubuntu(또는 Putty)에서 터미널을 열어 아래의 코드를 입력합니다. 설치 중간 중간에 [ y | n ] 중에 고르라고 나오면 y를 타이핑하고 엔터를 해주시면 됩니다! $ s

somjang.tistory.com

Selenium 설치

 

[Windows]Windows10에 Selenium설치하기(20.2.13 업데이트)

1. 구글 크롬 최신으로 업데이트하기 먼저 크롬의 맨 우측 상단의 세 개의 점을 클릭하여 크롬의 설정페이지로 들어갑니다. 왼쪽 메뉴에서 Chrome 정보를 클릭하여 업데이트를 실시합니다. 다시시

somjang.tistory.com

macOS에서 Selenium 사용 시 오류가 날 경우

 

[MAC OSX] 개발자를 확인할 수 없기 때문에 'chromedriver'을(를) 열 수 없습니다. 해결 방법

인스타 그램 크롤링을 진행하기 위하여 오랜만에 Selenium으로 작성하여 사용하였던 코드를 가져와 크롤링을 시작하려고 하니 --------------------------------------------------------------------------- Web..

somjang.tistory.com

2. 코드 작성

2-1. 필요 라이브러리 import

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 json
import pandas as pd

 

크롤링을 위해 필요한 selenium

크롤링 중간 중간 시간 지연을 두기 위한 time

크롤링한 내용 중 정규식으로 전처리 하기 위한 re

댓글, 대댓글을 저장할때 json 화 시키기 위한 json

데이터를 최종적으로 csv로 저장하기 위한 pandas 

이렇게 필요한 라이브러리를 import 해줍니다.

2-2. 인스타그램 로그인 코드 ( 2021.07.12 수정 )

user_id="id", user_passwd="passwd",
login_option="facebook", # facebook or instagram
driver_path="~/chromedriver",
instagram_id_name="username", instagram_pw_name="password",
instagram_login_btn=".sqdOP.L3NKy.y3zKF     ",
facebook_login_page_css=".sqdOP.L3NKy.y3zKF     ",
facebook_login_page_css2=".sqdOP.yWX7d.y3zKF     ", 
facebook_id_form_name="email",
facebook_pw_form_name="pass",
facebook_login_btn_name="login",

인스타그램 크롤링을 하기위해서는 먼저 로그인을 해야합니다.

이번에 코드를 수정하면서 페이스북 계정 로그인, 인스타그램 계정 로그인

두 가지 방식 중 선택하는 방식으로 로그인이 가능하도록 하였습니다.

 

위의 내용은 로그인에 필요한 정보입니다. 자세한 내용은 아래의 표를 참고하세요.

구분 내용 비고
user_id 인스타그램 or 페이스북 아이디  
user_passwd 인스타그램 or 페이스북 비밀번호  
login_option 로그인 옵션 facebook or instagram
driver_path selenium chrome driver 경로  
instagram_id_name 인스타그램 아이디 입력 form 의 name  
instagram_pw_name 인스타그램 비밀번호 입력 form 의 name  
instagram_login_btn 인스타그램 로그인 버튼의 class 명  
facebook_login_page_css 페이스북 로그인 진입 버튼 class 명 1  
facebook_login_page_css2 페이스북 로그인 진입 버튼 class 명 2 때에 따라 다른 화면에 대응하기 위해 2개
facebook_id_form_name 페이스북 아이디 입력 form 의 name  
facebook_pw_form_name 페이스북 비밀번호 입력 form 의 name  
facebook_login_btn_name 페이스북 로그인 버튼의 name  

또 기존에 특정 해쉬태그의 게시물이 있는 페이지로 이동한 다음에 로그인 버튼을 눌러 로그인 화면으로 진입하던 방식에서

먼저 url을 통해 로그인 화면으로 바로 이동한 뒤 로그인을 진행하도록 하였습니다.

print(f"login start - option {login_option}")

login_url = "https://www.instagram.com/accounts/login/"
driver.get(login_url)
time.sleep(10)

가. 인스타그램 계정 로그인

if login_option == "instagram":
	try:
    	instagram_id_form = driver.find_element_by_name(instagram_id_name)
        instagram_id_form.send_keys(user_id)
        time.sleep(5)

        instagram_pw_form = driver.find_element_by_name(instagram_pw_name)
        instagram_pw_form.send_keys(user_passwd)
        time.sleep(7)
          
        login_ok_button = driver.find_element_by_css_selector(instagram_login_btn)
        login_ok_button.click()
        is_login_success = True
    except:
        print("instagram login fail")
    	is_login_success = False

인스타그램 계정 로그인은 이동한 로그인 페이지에서

바로 input_form을 찾아 아이디와 비밀번호를 입력한 뒤 로그인 버튼을 찾아 클릭하면 되어 

form을 찾는 것은 find_element_by_name을 활용하여 찾았고

버튼은 find_element_by_css_selector를 활용하여 버튼의 class명으로 찾았습니다.

 

나. 페이스북 계정 로그인

elif login_option == "facebook":
	is_facebook_btn_click = False
    try:
    	print("try click facebook login button 1")
        facebook_login_btn = driver.find_element_by_css_selector(facebook_login_page_css)
        time.sleep(5)
        facebook_login_btn.click()
        is_facebook_btn_click = True
        is_login_success = True
    except:
    	print("click facebook login button 1 fail")
        is_facebook_btn_click = False
        is_login_success = False
        
    time.sleep(10)
        
    if not is_facebook_btn_click:
    	print("try click facebook login button 2")
        try:
        	facebook_login_btn = driver.find_element_by_css_selector(facebook_login_page_css2)
            time.sleep(5)
            facebook_login_btn.click()
            is_facebook_btn_click = True
            is_login_success = True
        except:
        	print("click facebook login button 2 fail")
            is_login_success = False
                
    time.sleep(10)

 

먼저 Facebook으로 로그인 버튼을 클릭하여 Facebook로그인 화면으로 이동합니다.

종종 다른 화면이 등장하기도 하여 두가지 방법으로 시도하도록 하였습니다.

진입한 이후에는 아이디와 비밀번호를 input form에 입력하고 로그인을 실시합니다.

2-2. 인스타 그램 로그인 코드 ( 수정 전 )

먼저 로그인을 해야만 게시물에 접근이 가능하기 때문에 인스타그램 로그인하는 코드를 작성해야합니다.

로그인은 Facebook id를 통해 했습니다.

추후 업데이트를 통해 인스타그램 아이디로 로그인하는 것도 구현할 예정입니다.

user_id="facebook_id"
user_passwd="facebook_pw"

driver_path="./chromedriver", keyword="피프틴"
url = "https://www.instagram.com/explore/tags/{}/".format(keyword)
facebook_login_page_css=".sqdOP.yWX7d.y3zKF     "
facebook_id_form_id="email"
facebook_pw_form_id="pass"
facebook_login_btn_css="loginbutton"

먼저 크롤링에 필요한 값들을 변수로 설정합니다.

driver_pathselenium chromedriver의 경로

user_id, user_passwd 는 로그인을 위한 페이스북 아이디, 비밀번호
url크롤링을 희망하는 키워드의 게시물 주소

facebook_login_page_css페이스북 로그인 페이지로 이동하는 버튼 태그의 class명

facebook_id_form_id와 facebook_pw_form_id아이디와 비밀번호를 입력할 form의 id

facebook_login_btn_css로그인 버튼의 id 입니다.

driver = wd.Chrome(driver_path)
driver.get(url)
time.sleep(10)

selenium webdriver로 url을 열고 10초를 기다립니다.

그럼 위의 화면에서 10초를 기다렸다가

Facebook의 아이디와 비밀번호를 활용하여 로그인 하기 위해서 Facebook으로 로그인 버튼을 클릭합니다.

print("login start")

facebook_login_btn = driver.find_element_by_css_selector(facebook_login_page_css)

facebook_login_btn.click()

time.sleep(10)

그럼 위와 같은 화면이 나옵니다.

id_input_form = driver.find_element_by_id(facebook_id_form_id)

pw_input_form = driver.find_element_by_id(facebook_pw_form_id)

id_input_form.send_keys(user_id)
pw_input_form.send_keys(user_passwd)

time.sleep(10)

login_btn = driver.find_element_by_id(facebook_login_btn_css)

login_btn.click()

아이디 form에 아이디를 입력하고 비밀번호 form에 비밀번호를 입력한 뒤에 로그인 버튼을 클릭합니다.

그럼 위와 같이 로그인이 완료됩니다.

time.sleep(10)

driver.get(url)

time.sleep(10)

2-3. 인스타그램 게시물 크롤링 코드

앞 뒤로 10초씩 지연시간을 두고 다시 키워드에 대한 게시물이 있는 주소로 이동합니다.

 

# 첫번째 게시물
first_img_css="div.v1Nh3.kIKUG._bz0w"
driver.find_element_by_css_selector(first_img_css).click()

그 다음 첫번째 게시물을 클릭하도록 합니다.

# data lists
location_infos = []
location_hrefs = []

upload_ids = []

date_texts = []
date_times = []
date_titles = []

main_texts = []

instagram_tags = []

comments = []

check_arrow = True

count_extract = 0

wish_num = 10

instagram_tags = []
instagram_tag_dates = []

이제 크롤링 한 데이터를 저장할 변수들을 선언합니다.

몇 가지만 설명 드리면

check_arrow다음 게시물 버튼이 있는 지 없는 지 여부를 체크하는 bool 변수

count_extract현재 몇 개의 게시물을 추출했는지 체크하는 int 변수

wish_num최종적으로 몇 개의 게시물을 추출할 것인지에 대한 변수 입니다.

location_object_css="div.o-MQd.z8cbW > div.M30cS > div.JF9hh > a.O4GlU"
upload_id_object_css="div.e1e1d > span.Jv7Aj.MqpiF  > a.sqdOP.yWX7d._8A5w5.ZIAjV "
date_object_css="div.k_Q0X.NnvRN > a.c-Yi7 > time._1o9PC.Nzb55"
main_text_object_css="div.C7I1f.X7jCj > div.C4VMK > span"
tag_css=".C7I1f.X7jCj"
comment_more_btn="button.dCJp8.afkep"
comment_ids_objects_css="ul.Mr508 > div.ZyFrc > li.gElp9.rUo9f > div.P9YgZ > div.C7I1f > div.C4VMK > h3"
comment_texts_objects_css="ul.Mr508 > div.ZyFrc > li.gElp9.rUo9f > div.P9YgZ > div.C7I1f > div.C4VMK > span"
print_flag=False
next_arrow_btn_css1="._65Bje.coreSpriteRightPaginationArrow"
next_arrow_btn_css2="._65Bje.coreSpriteRightPaginationArrow"

while True:
    if count_extract > wish_num:
        break
    time.sleep(5.0)
    # 위치정보

    if check_arrow == False:
        break

    try:
        location_object = driver.find_element_by_css_selector(location_object_css)
        location_info = location_object.text
        location_href = location_object.get_attribute("href")
    except:
        location_info = None
        location_href = None

    # 올린사람 ID
    try:
        upload_id_object = driver.find_element_by_css_selector(upload_id_object_css)
        upload_id = upload_id_object.text
    except:
        upload_id = None


    # 날짜
    try:
        date_object = driver.find_element_by_css_selector(date_object_css)
        date_text = date_object.text
        date_time = date_object.get_attribute("datetime")
        date_title = date_object.get_attribute("title")
    except:
        date_text = None
        date_time = None
        date_title = None


    # 본문
    try:
        main_text_object = driver.find_element_by_css_selector(main_text_object_css)
        main_text = main_text_object.text
    except:
        main_text = None


    ## 본문 속 태그
    try:
        data = driver.find_element_by_css_selector(tag_css) # 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)
    except:
        continue


    # 댓글
    ## 더보기 버튼 클릭
    try:
        while True:
            try:
                more_btn = driver.find_element_by_css_selector(comment_more_btn)
                more_btn.click()
            except:
                break
    except:
        print("----------------------fail to click more btn----------------------------------")
        continue

    ## 댓글 데이터
    try:
        comment_data = {}

        comment_ids_objects = driver.find_elements_by_css_selector(comment_ids_objects_css)

        comment_texts_objects = driver.find_elements_by_css_selector(comment_texts_objects_css)



        try:
            for i in range(len(comment_ids_objects)):
                comment_data[str((i+1))] = {"comment_id":comment_ids_objects[i].text, "comment_text":comment_texts_objects[i].text} 
        except:
            print("fail")



    except:
        comment_id = None
        comment_text = None
        comment_data = {}


    try:
        if comment_data != {}:
            keys = list(comment_data.keys())

            for key in keys:
                if comment_data[key]['comment_id'] == upload_id:
                    tags = re.findall('#[A-Za-z0-9가-힣]+', comment_data[key]['comment_text']) 
                    tag = ''.join(tags).replace("#"," ") # "#" 제거

                    tag_data = tag.split()

                    for tag_one in tag_data:
                        instagram_tags.append(tag_one)
    except:
        continue



    location_infos.append(location_info)
    location_hrefs.append(location_href)

    upload_ids.append(upload_id)

    date_texts.append(date_text)
    date_times.append(date_time)
    date_titles.append(date_title)

    main_texts.append(main_text)

    comment_json = json.dumps(comment_data)

    comments.append(comment_json)

    if print_flag:
        print("location_info : ", location_info)
        print("location_href : ", location_href)
        print("upload id : ", upload_id)
        print("date : {} {} {}".format(date_text, date_time, date_title))
        print("main : ", main_text)
        print("comment : ", comment_data)

        print("insta tags : ", instagram_tags)

    try:
        WebDriverWait(driver, 100).until(EC.presence_of_element_located((By.CSS_SELECTOR, next_arrow_btn_css1)))
        driver.find_element_by_css_selector(next_arrow_btn_css2).click()
    except:
        check_arrow = False

    count_extract += 1

위치정보, 게시한 사람 ID, 날짜, 본문, 본문 속 태그, 댓글 정보를 추출합니다.

print_flag를 True로 주면 추출하는 정보를 실시간으로 출력합니다.

게시물 하나 추출할 때마다 count_extract를 1씩 증가시키고

wish_num 보다 커질 경우 추출을 멈춥니다.

2-4. 추출한 정보 저장

save_file_name="instagram_extract"
save_file_name_tag="instagram_tag"

try:
    insta_info_df = pd.DataFrame({"location_info":location_infos, "location_href":location_hrefs, "upload_id":upload_ids, "date_text":date_texts, "date_time":date_times, "date_title":date_titles, "main_text":main_texts, "comment":comments})
    insta_info_df.to_csv("{}.csv".format(save_file_name), index=False)
except:
    print("fail to save data")


try:
    insta_tag_df = pd.DataFrame({"tag":instagram_tags})
    insta_tag_df.to_csv("{}.csv".format(save_file_name_tag), index=False)
except:
    print("fail to save tag data")

driver.close()
driver.quit()

추출이 끝나면 지금까지 추출한 정보를 저장하고 Selenium Webdriver를 종료합니다.

 

저장한 정보는 위와 같이 저장됩니다.

 

3. 추출 데이터 활용

 

"피프틴" 태그가 포함된 인스타그램 게시물 개수 추이와 실제 사용량 비교해보기

1. 필요한 라이브러리 import 하기 import pandas as pd from konlpy.tag import Mecab import matplotlib.pyplot as plt import matplotlib from tqdm import tqdm from collections import Counter from PIL im..

ideans.tistory.com

 

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

1. 주제를 선택한 계기 특정 프랜차이즈에 관련된 최근 키워드를 알려주려면 어떤 것을 참고하면 좋을까 생각하다가 인스타그램에 걸려있는 특정 주제에 대한 여러 태그들을 크롤링하여 그 태

somjang.tistory.com

 

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

요즘 들어서 대만카스테라, 벌집아이스크림 때처럼 흑당 버블티 가게가 우후 죽순 생겨나고 있습니다. 인스타그램 태그를 활용하면 흑당버블티에 대한 동향을 알 수 있을까라는 의문점이 들었

somjang.tistory.com

4. 전체 코드

 

SOMJANG/Instagram_Crawler

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

github.com

 

5. 참고사항 및 주의사항

주의할 사항은 지연시간을 너무 짧게 하거나 너무 자주하게 되면 id또는 ip가 인스타그램 측에서

크롤링 코드 또는 디도스 공격 같은 것으로 인식하여 차단을 당하므로!

주의해서 활용하기 바랍니다.

 

또한 개인정보를 수집할 수 있게 되므로 수집한 데이터는 배포시에 비식별화 하여 활용 부탁드리고

이로인하여 발생한 문제는 책임지지 않습니다.

 

10만개 20만개 추출되지는 않지만 저는 이 코드로 1만개~2만개 사이까지 추출 할 수 있었습니다.

더 많이 추출할 수 있는 방법이 있다면! 댓글로 알려주세요!

읽어주셔서 감사합니다.

728x90
반응형
73 Comments
  • 이전 댓글 더보기
  • 프로필사진 12323 2021.07.20 17:24 크롤링결과 댓글이 한 게시물당 24개밖에 되지않습니다 어떻게 해결할수있을까요?
  • 프로필사진 BlogIcon 솜씨좋은장씨 2021.07.21 11:38 신고 퇴근 후에 확인해보고 말씀드리겠습니다~
  • 프로필사진 BlogIcon 민랑이 2021.07.24 23:48 신고 안녕하세요? 페이스북에서 특정단어가 들어간 게시글을 크롤링하고싶은데 페이스북관련 코드도 혹시있으신가요? 생각보다 어려워서 도와주시면 감사하겠습니다. ㅠㅠ
  • 프로필사진 BlogIcon 솜씨좋은장씨 2021.08.15 18:12 신고 안녕하세요. 답변이 늦어 죄송합니다.
    페이스북 크롤링 코드는 현재 작업해 둔 코드가 없어 추후 작업하게 되면 블로그와 github을 통하여 공유해드리겠습니다.

    감사합니다.
  • 프로필사진 둘기 2021.07.27 13:09 안녕하세요! 질문이 있습니다
    print(f"login start - option {login_option}")

    login_url = "https://www.instagram.com/accounts/login/"
    driver.get(login_url)
    time.sleep(10) 했을때

    login start - option instagram
    ---------------------------------------------------------------------------
    NameError Traceback (most recent call last)
    <ipython-input-29-c26f6dce27b8> in <module>
    2
    3 login_url = "https://www.instagram.com/accounts/login/"
    ----> 4 driver.get(login_url)
    5 time.sleep(10)

    NameError: name 'driver' is not defined ->이렇게 결과가 나오면 뭐가 문제인지 알 수 있을까요?ㅠㅜ
  • 프로필사진 BlogIcon 솜씨좋은장씨 2021.08.15 18:11 신고 안녕하세요. 답변이 늦어 죄송합니다.
    위에서 크롬드라이버를 만드는 코드인
    driver = wd.Chrome(driver_path) driver.get(url)
    time.sleep(10)

    이 부분이 제대로 실행 되었는지 먼저 확인해봐주세요!

    혹시 그래도 안된다면 자세한 내용을
    somjang@kakao.com으로 보내주세요!

    감사합니다.
  • 프로필사진 초보_미도 2021.08.09 10:54 인스타 정책에 의한 수량제한의 경우 100~300개 라고 하셨는데요
    만약 100~300개 /1시간 이라면 1개 포스팅마다 1분씩 대기하게 하면
    해당 정책에 걸리지 않고 스크랩 가능한건지 궁금합니다.
  • 프로필사진 BlogIcon 솜씨좋은장씨 2021.08.15 18:10 신고 안녕하세요. 이렇게 1분에 1개씩 대기 하면서 테스트는 해보지 않아서 잘 모르겠습니다. 된다고 해도 1시간에 60개의 게시물만을 크롤링이 가능하여 좀 비효율적인 것 같습니다.

    인스타그램 측에서 계속 일정하게 요청이 오면 해당 계정의 게시물 접근 제한이 되는 것 같습니다.

    1분에 1개씩 할 수 있는 여건이 되면 한번 해보고 결과를 말씀드리겠습니다!

    감사합니다.
  • 프로필사진 레도 2021.08.19 08:55 안녕하세요. 크롤링 코드 잘 이용하고 있습니다.
    한 가지 문제점이 있는데요.
    크롤링 진행 중에 인스타그램 게시물에 글이 없고 사진만 올라가 있는 경우 다음 페이지로 넘어가지 않는 현상이 나타납니다.
    이 경우 예외 처리를 어떻게 하면 좋을지 궁금합니다.
  • 프로필사진 BlogIcon 솜씨좋은장씨 2021.08.19 09:44 신고 안녕하세요! 댓글 남겨주셔서 감사합니다.
    제 추측으로는 다음 게시물로 넘어가는 버튼을 찾지 못하여서 Webdriver 측에서 해당 항목을 찾을때 까지 대기를 하고 있는 것으로 보입니다.

    보다 정확한 답변을 위해서는 추가적인 정보가 필요합니다.

    크롤링을 하려고했던 인스타그램 태그(검색어)는 어떤 것이 었는지

    넘어가지않을때 기다리고나면 오류가 발생했는지 아니면 그냥 파일을 저장하고 종료하였는지

    somjang@kakao.com 메일 또는 댓글 남겨주시면 확인 해보고 최대한 빠른 시일 내에 답변 드리겠습니다!

    감사합니다.
  • 프로필사진 라핫 2021.08.19 20:17 안녕하세요! 덕분에 크롤링은 성공했는데... 크롤링한 텍스트는 뭔가 인코딩이 다른 것 같습니다ㅠ
    직접 타이핑하면 정상 동작하는데 크롤링한 텍스트를 복사해서 가져오면 count() 함수가 동작이 안되네요.

    디코딩 -> 인코딩도 해보고 여러 방법을 시도했으나 방법을 찾지 못해 조언을 구합니다.
    아래에서 코드 한번만 확인 부탁드립니다 ^^

    https://github.com/KimJeonghun91/py_count/blob/master/str_encoding2.ipynb
  • 프로필사진 BlogIcon 솜씨좋은장씨 2021.08.19 20:25 신고 안녕하세요!

    from unicodedata import normalize

    normalize_txt = normalize('NFC', test_str)
    normalize_txt.count('아')

    요렇게 해보시면 될겁니다!

    https://bit.ly/3D2AUbC
    요기 위의 링크도 참고해보세요~!

    감사합니다.
  • 프로필사진 BlogIcon 라핫 2021.08.19 22:19 감사합니다! 정말 도움이 많이 됐습니다 :)
  • 프로필사진 BlogIcon 솜씨좋은장씨 2021.08.19 22:27 신고 감사합니다~
  • 프로필사진 초보_미도 2021.08.20 17:30 코딩 하셨던 부분중에 스크랩후 랜덤하게 기다리는 부분에서 30초 이상으로 해주었더니
    8000개 정도 까지는 가능한데 그 이상은 메모리 문제인지? 아니면 다른 문제인지는 모르겠지만
    스크랩이 불가능 하네요. ( 메모리 문제라면 중간중간 한 1000개 포스팅 마다 다른 파일로 저장하고 메모리 리프레쉬 한다면...)
    저도 좀더 실험해 보고 돌아오겠습니다.
    #delay_until_next_step(start=5, end=7) #origin
    delay_until_next_step(start=30, end=39)

    <결론>
    시간당 스크랩 갯수는 비효율적 일 수 있으나 200~300개 보다는 많이 스크랩 할 수 있었음.
  • 프로필사진 BlogIcon 솜씨좋은장씨 2021.08.20 17:34 신고 안녕하세요. 직접 테스트 해보시고 댓글 남겨주셔서 감사합니다.
    기존에도 8,000개 정도를 넘어가면 더이상 크롤링이 불가능한 문제가 있었습니다.

    이에 제가 생각했던 아이디어는
    크롤링한 값들을 리스트에 계속 담아두는 것이 아니라
    대기하는 중간 30초 시간 동안
    MongoDB건 MySQL이건 하나 정해서
    크롤링한 값들을 계속 해당 디비에 저장해서 계속 진행하는 것을 생각해봤었습니다.

    한번 그렇게 해보셔도 좋을 것 같습니다. 해당 방법은 시간나면 저도 한번 해보겠습니다!

    감사합니다!!
  • 프로필사진 코딩초보 2021.09.30 12:57 안녕하세요! 코드 이용해서 크롤링을 해보려고 하는 초보입니다 ㅠㅠ 실행했을때 No module named 'instagram_crawler' 메시지가 뜨는데 해결 방법이 무엇일까요?
  • 프로필사진 BlogIcon 솜씨좋은장씨 2021.09.30 13:15 신고 자세한 내용을 somjang@kakao.com으로 보내주세요!
  • 프로필사진 코린이 2021.10.01 10:44 800~900개 정도하고나면 인스타 피드가 하얀화면으로 되고 멈춰버립니다 어떻게해야할까요 ? 시간은 5초,19초,22초 등 다양하게 늘려도 똑같아서 고통스럽슴다 ㅠㅠ 혹시 scrapy로 하면 훨씬 좋아질까요 ??
  • 프로필사진 BlogIcon 솜씨좋은장씨 2021.10.02 09:57 신고 안녕하세요! 아쉽게도 예전에는 크롤링 코드로 7000개 8000개 게시물에 접근이 가능했으나 최근에는 사람이 직접 게시물을 300개 이상 접근해도 인스타그램측에서 크롤링해가는 로봇으로 판단하고 차단을 하더라구요 아직 scrapy로는 해본적이없어 잘되는지는 모르겠습니다 게시물 간의 간격을 1분 ~ 2분 정도로 하면 1000개정도까지는 된다고 하신 분이 계셨는데 그 이후로 다른 분들 테스트에서도 그이상 접근이 불가한것을 보면 인스타그램 측에서 크롤링을 방어하는 작업을 진행한 것 같습니다 인스타그램 측에서는 불필요한 트래픽이 계속 쌓이는 것이라 아마 앞으로 점점 크롤링하기 어려워지지않을까 싶습니다
  • 프로필사진 아피 2021.10.26 18:12 안녕하세요! 덕분에 인스타 크롤링해서 과제에 잘 이용했습니다 감사합니다!
    코드 돌려보니까 궁금했던게 date나 피드 내용, 코멘트같은것들은 크롤링이 되는데, 좋아요 수에 대한 크롤링은 따로 없네요
    피드의 좋아요 수에 대한 크롤링을 하는 코드를 알려주실 수 있을까요?
    다시한번 감사합니다!
  • 프로필사진 누구 2021.11.28 12:57 안녕하세요, 완전 초보입니다 ㅠ.ㅠ
    설명해주신대로 selenium 설치를 진행했고, 네이버 로그인 까지는 확인했는데 여기서 막히네요...
    도움 주실 수 있으신가요 ㅠ.ㅠ

    ---------------------------------------------------------------------------
    ModuleNotFoundError Traceback (most recent call last)
    ~\AppData\Local\Temp/ipykernel_15320/953256016.py in <module>
    6 import re
    7 import json
    ----> 8 import pandas as pd

    ModuleNotFoundError: No module named 'pandas'
  • 프로필사진 BlogIcon 솜씨좋은장씨 2021.11.28 13:06 신고 pip install pandas 하시고 진행하시면 될것 같아요!
  • 프로필사진 heyhey 2021.11.30 16:49 안녕하세요. 코드 감사히 잘 공부했습니다. 다만 인스타 로그인 페이지에서 아무것도 작동하지 않아서 ㅜ 여전히 유효한지 저만 그런 건지 궁금합니다.
  • 프로필사진 BlogIcon 솜씨좋은장씨 2021.11.30 18:11 신고 아 최근에 테스트해본적은 없어서 아마 인스타그램측에서 뭔가 사이트에서 변경했다면 안될 수 도 있습니다. 시간날때 한번 테스트 해보고 업데이트해보겠습니다~! 감사합니다.
  • 프로필사진 BlogIcon heyhey 2021.11.30 18:16 이유는 모르겠지만...selector로 바꿔서 했더니 되네요 감사합니다 ㅠㅠ
  • 프로필사진 BlogIcon 솜씨좋은장씨 2021.12.06 13:15 신고 아하 어느 부분인지 알려주시면 저도 추후에 반영하겠습니다~ 감사합니다!
  • 프로필사진 강용 2021.12.04 10:05 안녕하세요. 코드 공유해주셔서 감사합니다. 크롤링 공부하는데 도움 많이 될것 같습니다.
  • 프로필사진 BlogIcon 솜씨좋은장씨 2021.12.06 13:15 신고 감사합니다~
  • 프로필사진 코딩공부 2022.01.31 10:02 안녕하세요. 코드 공유해주신 파일로 공부중입니다.
    해당 코드를 수정하지 않은 상황에서도 다음 게시글로 넘어가지 않는 것 같은데 확인부탁드릴 수 있을까요?
  • 프로필사진 BlogIcon 솜씨좋은장씨 2022.01.31 10:04 신고 안녕하세요. 제가 다음 버튼을 찾지못하면 100초동안 기다리라고 해둔 부분이있는데 그만큼 기다려보셨는지 궁금합니다.

    만약 그래도 이상하다고하면 현재 증상을 캡쳐나 영상으로 찍어서 somjang@kakao.com 으로 보내주세요! 감사합니다
  • 프로필사진 BlogIcon 코딩공부 2022.01.31 17:55 네 100초 넘게 기다려도 다음 게시글로 넘어가지 않고 크롬 다운됩니다.
  • 프로필사진 크롤링공부 2022.03.25 14:54 Traceback (most recent call last):
    File "/Users/jaehalee/Downloads/Instagram_Crawler/Instagram_Crawler/main.py", line 67, in <module>
    instagram_main()
    File "/Users/jaehalee/Downloads/Instagram_Crawler/Instagram_Crawler/main.py", line 57, in instagram_main
    is_file_save, is_tag_file_save = crawling_instagram(args=args)
    File "/Users/jaehalee/Downloads/Instagram_Crawler/Instagram_Crawler/instagram_crawler/extract_data.py", line 190, in crawling_instagram
    return is_save_file_success, is_save_tag_file_success
    UnboundLocalError: local variable 'is_save_file_success' referenced before assignment

    주인장님 혹시 이런 오류가 나는건 어떻게 해결해야 할까요? ㅠㅜ 코드엔 이상이 없는거 같은데ㅠㅠ
  • 프로필사진 BlogIcon 솜씨좋은장씨 2022.03.26 17:34 신고 안녕하세요. 에러 메세지를 보니 is_save_file_success 라는 변수를 참조할 수 없는 부분에서 참조하려고 해서 발생한 문제인 것 같습니다. 코드 확인해보고 다시 답변 드리겠습니다. 감사합니다.
  • 프로필사진 BlogIcon 솜씨좋은장씨 2022.03.26 18:32 신고 안녕하세요!
    문제가 되는 부분 수정해서 업데이트 해두었습니다~
    알려주셔서 감사합니다!
    https://github.com/SOMJANG/Instagram_Crawler/issues/5

  • 프로필사진 익명 2022.04.26 15:18 비밀댓글입니다
  • 프로필사진 BlogIcon 솜씨좋은장씨 2022.04.26 15:55 신고 안녕하세요!
    아마 말씀해주신 것 처럼 사이트의 구조가 변경되어 기존에 적어두었던 각 객체의 위치 값이 달라져 동작하지 않는 것 같습니다.

    https://somjang.tistory.com/entry/Python-%EC%9D%B8%EC%8A%A4%ED%83%80-%EA%B7%B8%EB%9E%A8-%ED%83%9C%EA%B7%B8%EB%A5%BC-%ED%81%AC%EB%A1%A4%EB%A7%81%ED%95%98%EC%97%AC-%EC%9B%8C%EB%93%9C%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%A7%8C%EB%93%A4%EA%B8%B0

    위의 링크로 들어가 보시면 제가 어떠한 방식으로 보실 수 있을겁니다.

    만약 구조가 바뀐것 이라면 저도 이번주 내에 업데이트 해보려합니다.

    감사합니다.
  • 프로필사진 익명 2022.04.27 14:39 비밀댓글입니다
  • 프로필사진 BlogIcon 솜씨좋은장씨 2022.04.27 23:23 신고 감사합니다~!
  • 프로필사진 BlogIcon 솜씨좋은장씨 2022.04.28 03:01 신고 저도 다시 정보가 크롤링 될 수 있도록 수정해서 깃헙에 업데이트 해두었습니다~ 알려주셔서 감사합니다~!
  • 프로필사진 익명 2022.04.28 20:43 비밀댓글입니다
  • 프로필사진 BlogIcon 솜씨좋은장씨 2022.04.28 20:48 신고 안녕하세요! 제가 구현은 해보지는 않았는데 아이디어를 가지고 있는 것 중에 하나를 말씀 드리겠습니다.

    지금 제가 하는 방식은
    게시물 열기 -> 게시물에서 데이터 추출
    -> 다음 게시물 이동 인데

    생각한 방식 1
    게시물 열기 -> 현재 게시물 주소만 크롤링
    -> 다음 게시물 이동

    게시물 주소 리스트에서 하나씩 꺼내서 게시물로 이동
    -> 추출

    생각한 방식 2
    특정 해쉬태그에 대한 검색 결과
    -> 무한 스크롤링 하여 최대한 많이 로딩
    -> 더이상 스크롤이 되지 않을때
    -> 각 게시물 주소 크롤링

    게시물 주소 리스트에서 하나씩 꺼내서 게시물로 이동
    -> 추출

    이렇게 생각은 해봤는데
    구현은 해보지 못했습니다.
  • 프로필사진 익명 2022.04.29 18:21 비밀댓글입니다
  • 프로필사진 익명 2022.04.28 17:00 비밀댓글입니다
  • 프로필사진 BlogIcon 솜씨좋은장씨 2022.04.28 18:48 신고 안녕하세요. 이미 깃헙에 올라가 있습니다!
    https://github.com/SOMJANG/Instagram_Crawler/tree/main/jupyter%20notebook%20files
    마침 어제 업데이트해서 동작은 잘 될겁니다.
    감사합니다.
  • 프로필사진 김씨 2022.05.17 09:41 글 잘봤습니다. 본문에 적어두신 것처럼 어느 정도 돌리다보면 차단되는 증상은 여전한거죠?
  • 프로필사진 BlogIcon 솜씨좋은장씨 2022.05.17 16:03 신고 안녕하세요! 최근에는 10개 미만의 게시물로만 테스트해보았어서 다시 테스트를 해보야 정확하게 알 수 있지만 아마 차단 되는 증상이 있을 것 같습니다! 혹시 차단 되지 않는 방법을 찾으신다면! 공유 부탁드립니다! 감사합니다.
  • 프로필사진 ㅇㅇ 2022.05.18 20:04 비밀댓글입니다
  • 프로필사진 BlogIcon 솜씨좋은장씨 2022.05.18 21:19 신고 안녕하세요! 비밀댓글입니다 로 나와서 어떤 내용인지 확인이 불가합니다!
  • 프로필사진 HH 2022.06.08 14:11 비주얼 스튜디오 코드를 이용하여 작업중입니다.
    파이썬을 실행하면 아래와 같은 메시지만 뜨고 실행이 안되는데 이유가 뭘까요?
    (insta) D:\startcoding>d:/startcoding/insta/Scripts/python.exe d:/startcoding/insta/in_cr.py
    (insta) D:\startcoding>
댓글쓰기 폼