파이썬

인스타그램 크롤링 파이썬으로 가능하지 2023 개정판

0
Please log in or register to do it.

가장 쉬운 방법. 라이브러리 활용하기 (비로그인 방문 OK)

instaloader라는 라이브러리를 활용해서 진행할 수 있습니다.

pip install instaloader


코드 설명 _확인 (23.7.04)

import instaloader

#인스타로더 사용 시작.
bot = instaloader.Instaloader()
#사용자 이름 정의 직접 기입해도 상관없습니다.
Username = input('Enter the Account Username: ')

#프로필을 정의합니다.
profile = instaloader.Profile.from_username(bot.context, Username)

print("Username: ", profile.username)
print("User ID: ", profile.userid)
print("Number of Posts: ", profile.mediacount)
print("Followers: ", profile.followers)
print("Followees: ", profile.followees)
print("Bio: ", profile.biography, profile.external_url)


출력 기대값

인스타그램 크롤링 2022 개정판 코드 수록. - undefined - undefined - 가장 쉬운 방법. 라이브러리 활용하기 (비로그인 방문 OK)

 

셀레늄 활용하기 (로그인) _ 코드 확인(23.7.04)

저는 일단 파이어폭스 브라우저를 활용했습니다. 구글 크롬 브라우저 버전을 일일이 확인하면서 진행하기가 귀찮기 때문에….

import random
import pandas as pd
from selenium import webdriver
import time

#인스타그램 계정 제어 공간입니다 아래 3곳 필드를 수정해서 사용해주세요.
id = '로그인 아이디'
password = '로그인 비밀번호'
name_list=['officialfromis_9','jiheonnibaek','k_a_z_u_h_a__']

print('browser loading..')
browser = webdriver.Firefox(executable_path='/Users/irix/PycharmProjects/a/geckodriver')
browser.delete_all_cookies()

time.sleep(5)

#인스타그램 로그인 필드
browser.get('https://www.instagram.com')
time.sleep(3.5)
username_input = browser.find_elements_by_css_selector('input._2hvTZ')[0]
username_input.send_keys(id)
time.sleep(2 + random.random() * 0.3)
password_input = browser.find_elements_by_css_selector('input._2hvTZ')[1]
password_input.send_keys(password)
time.sleep(1)
password_input.submit()
time.sleep(2)

print("login success")

#브라우저 로드까지 대기.
browser.implicitly_wait(4)
time.sleep(10)

#인스타그램 네임리스트를 통해 게시물 수, 팔로워 수, 팔로우 수를 추적합니다.
for namer in name_list:
    browser.get('https://www.instagram.com/'+namer+'/?hl=ko')
    time.sleep(1)
    #게시물 수
    mediacount = browser.find_element_by_xpath('/html/body/div[1]/div/div/div/div[1]/div/div/div/div[1]/div[1]/section/main/div/header/section/ul/li[1]').text
    #팔로워 수
    followers = browser.find_element_by_xpath('/html/body/div[1]/div/div/div/div[1]/div/div/div/div[1]/div[1]/section/main/div/header/section/ul/li[2]/a/div/span').text
    #팔로우 수
    followees = browser.find_element_by_xpath('/html/body/div[1]/div/div/div/div[1]/div/div/div/div[1]/div[1]/section/main/div/header/section/ul/li[3]/a/div/span').text
    print(mediacount)
    print(followers)
    print(followees)
인스타그램 크롤링 2022 개정판 코드 수록. - undefined - undefined - 셀레늄 활용하기 (로그인) _ 코드 확인(22.7.24)

수집 원리?

Full Xpath를 가져와서 표기하였습니다. 좀 더 복잡한 방법을 쓴다면, 인스타그램의 graphql에 접근해서 shorcod라는 친구를 만져야 하지만 간단한 크롤링을 하고 싶다면 기피되는 게 사실이죠~

아마 2020년~21년 초까지는 script 내의 shared data에서 쉽게 추려왔던 거 같은데 현재는 기존 방식으로는 크롤링이 되지 않습니다 🙂


만약 저 코드에서 사용자의 아이디도 가져오고 싶다면 어떻게 해야 할까요?
브라우저의 CSS 인스펙터 도구를 활용해서 Full Xpath를 가져오면 됩니다.

인스타그램 크롤링 2022 개정판 코드 수록. - undefined - undefined - 셀레늄 활용하기 (로그인) _ 코드 확인(22.7.24)

브라우저의 검사 기능을 활용해서 찾고자 하는 요소의 위치를 찾아내 준 뒤

인스타그램 크롤링 2022 개정판 코드 수록. - undefined - undefined - 셀레늄 활용하기 (로그인) _ 코드 확인(22.7.24)

다음과 같이 Full Xpath를 받아옵니다.
아이디의 경우에는 

/html/body/div[1]/div/div/div/div[1]/div/div/div/div[1]/div[1]/section/main/div/header/section/div[1]/h2

를 활용하면 되겠습니다.
사실 제대로 활용하기 위해서는 판다스 등을 활용해서 csv로 저장해주거나 저장 값을 스프레드시트 등 활용 가능한 툴에 넣어놓고 쓰는 게 가장 좋습니다.

코드블럭 예시 1.

from selenium import webdriver
import time

# 크롬 웹 드라이버 경로 설정
driver_path = '경로_입력'

# 인스타그램 프로필 URL
profile_url = '프로필_URL'

# 크롬 웹 드라이버 실행
driver = webdriver.Chrome(driver_path)
driver.get(profile_url)

# 로그인 확인
login_button = driver.find_element_by_xpath("//button[contains(text(), '로그인')]")
if login_button:
    login_button.click()
    time.sleep(2)
    username_input = driver.find_element_by_xpath("//input[@name='username']")
    username_input.send_keys('사용자명')
    password_input = driver.find_element_by_xpath("//input[@name='password']")
    password_input.send_keys('비밀번호')
    login_button = driver.find_element_by_xpath("//button[@type='submit']")
    login_button.click()
    time.sleep(5)

# 게시물 개수 확인
post_count = driver.find_element_by_xpath("//span[@class='g47SY ']").text
print("게시물 개수:", post_count)

# 게시물 크롤링
posts = driver.find_elements_by_xpath("//a[@class='v1Nh3 kIKUG  _bz0w']")[:10]  # 상위 10개의 게시물만 크롤링
for post in posts:
    post.click()
    time.sleep(2)
    
    # 게시물 내용 크롤링
    content = driver.find_element_by_xpath("//div[@class='C4VMK']/span").text
    print("게시물 내용:", content)
    
    # 댓글 크롤링
    comments = driver.find_elements_by_xpath("//div[@class='C4VMK']//span")
    for comment in comments:
        print("댓글:", comment.text)
    
    close_button = driver.find_element_by_xpath("//button[@class='ckWGn']")
    close_button.click()
    time.sleep(2)

# 크롬 웹 드라이버 종료
driver.quit()

인스타그램 특정 게시물 접근 + 이미지 다운로드 받기

마찬가지로 셀레니움으로 스타트하고 로그인 후 접근합니다. 로그인하지 않는 경우 쿠키값을 사용하셔야 합니다.

from selenium import webdriver
import time

# 크롬 웹 드라이버 경로 설정
driver_path = '경로_입력'

# 인스타그램 프로필 URL
profile_url = '프로필_URL'

# 크롬 웹 드라이버 실행
driver = webdriver.Chrome(driver_path)
driver.get(profile_url)

# 로그인 확인
login_button = driver.find_element_by_xpath("//button[contains(text(), '로그인')]")
if login_button:
    login_button.click()
    time.sleep(2)
    username_input = driver.find_element_by_xpath("//input[@name='username']")
    username_input.send_keys('사용자명')
    password_input = driver.find_element_by_xpath("//input[@name='password']")
    password_input.send_keys('비밀번호')
    login_button = driver.find_element_by_xpath("//button[@type='submit']")
    login_button.click()
    time.sleep(5)

# 게시물 개수 확인
post_count = driver.find_element_by_xpath("//span[@class='g47SY ']").text
print("게시물 개수:", post_count)

# 게시물 크롤링
posts = driver.find_elements_by_xpath("//a[@class='v1Nh3 kIKUG  _bz0w']")[:10]  # 상위 10개의 게시물만 크롤링
for post in posts:
    post.click()
    time.sleep(2)
    
    # 게시물 내용 크롤링
    content = driver.find_element_by_xpath("//div[@class='C4VMK']/span").text
    print("게시물 내용:", content)
    
    # 댓글 크롤링
    comments = driver.find_elements_by_xpath("//div[@class='C4VMK']//span")
    for comment in comments:
        print("댓글:", comment.text)
    
    close_button = driver.find_element_by_xpath("//button[@class='ckWGn']")
    close_button.click()
    time.sleep(2)

# 크롬 웹 드라이버 종료
driver.quit()

인스타그램 데이터 가져오기 셀레니움.

인스타그램 데이터를 가져오고 csv 파일로 최종 저장하는 코드입니다.

import csv
from selenium import webdriver
import time

# 크롬 웹 드라이버 경로 설정
driver_path = '경로_입력'

# 인스타그램 프로필 URL
profile_url = '프로필_URL'

# 크롬 웹 드라이버 실행
driver = webdriver.Chrome(driver_path)
driver.get(profile_url)
time.sleep(2)

# 로그인 확인
login_button = driver.find_element_by_xpath("//button[contains(text(), '로그인')]")
if login_button:
    login_button.click()
    time.sleep(2)
    username_input = driver.find_element_by_xpath("//input[@name='username']")
    username_input.send_keys('사용자명')
    password_input = driver.find_element_by_xpath("//input[@name='password']")
    password_input.send_keys('비밀번호')
    login_button = driver.find_element_by_xpath("//button[@type='submit']")
    login_button.click()
    time.sleep(5)

# 팔로워, 팔로잉, 미디어 수 가져오기
follower_count_element = driver.find_element_by_xpath("//a[contains(@href, 'followers')]/span")
follower_count = follower_count_element.get_attribute('title')
following_count_element = driver.find_element_by_xpath("//a[contains(@href, 'following')]/span")
following_count = following_count_element.get_attribute('title')
media_count_element = driver.find_element_by_xpath("//span[@class='g47SY ']")
media_count = media_count_element.text

# CSV 파일로 저장
data = [['팔로워', '팔로잉', '미디어 수'],
        [follower_count, following_count, media_count]]

filename = '인스타그램_프로필.csv'
with open(filename, 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerows(data)

# 크롬 웹 드라이버 종료
driver.quit()
파이썬으로 문자 발송 자동화,알림톡 발송
네이버 블로그 방문자 카운터 확인하기 (무료 템플릿)

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다