Python을 사용하여 Instagram 데이터를 다운로드하는 방법

Statista 자료에 따르면, 2021년 기준 인스타그램은 약 12억 1천만 명의 사용자를 확보하며 전 세계적으로 손꼽히는 소셜 미디어 네트워크 중 하나입니다. 이는 인터넷 사용자의 약 28%에 해당하는 수치입니다.

이 글에서는 Python을 사용하여 인스타그램 프로필에서 데이터를 프로그래밍 방식으로 내려받는 두 가지 방법을 소개합니다. 첫 번째 방법은 Instaloader를 활용하여 미디어를 다운로드하는 것이며, 두 번째 방법은 프로필에 대한 JSON 데이터를 가져오는 간단한 Python 스크립트를 직접 작성하는 것입니다.

데이터 스크래핑은 인스타그램 서비스 약관에 위배될 수 있으므로, 본인 계정에서만 데이터를 다운로드하는 것을 권장합니다.

Instaloader 활용법

Instaloader는 Python 패키지로, 인스타그램 미디어를 다운로드하는 데 특화되어 있습니다. 사용법이 매우 간단하며, 데이터를 빠르고 쉽게 추출하고 내려받을 수 있다는 장점이 있습니다. Instaloader를 사용하기 위해서는 먼저 pip를 통해 설치해야 합니다.

pip install instaloader

설치가 완료되면, 명령줄 인터페이스를 통해 사용하거나 Python 스크립트 내에서 패키지로 활용할 수 있습니다.

명령줄에서 사용하려면 `instaloader` 명령을 사용합니다. 예를 들어, 도움말 정보를 확인하려면 터미널에 다음 명령어를 입력하면 됩니다.

instaloader --help

특정 사용자의 프로필 사진을 다운로드하려면, 사용자 이름과 함께 `–profile` 태그를 사용하여 명령을 입력합니다. 아래와 같이 작성합니다.

instaloader --profile <프로필 사용자 이름>

하지만 이 명령이 정상적으로 작동하려면 먼저 로그인을 해야 합니다. 로그인 정보를 전달하려면 다음과 같이 `–login` 옵션을 추가합니다.

instaloader --login <본인 사용자 이름> --profile <프로필 사용자 이름>

다운로드 가능한 항목

Instaloader를 사용하면 다양한 종류의 미디어를 다운로드할 수 있습니다. 매뉴얼 페이지에서 발췌한 내용을 보면, 다운로드 가능한 항목을 모두 확인할 수 있습니다.

  profile               프로필 다운로드. 이미 다운로드된 프로필의 이름이 변경된 경우, Instaloader는 고유 ID를 통해 해당 프로필을 자동으로 찾아 폴더 이름을 변경합니다.
  @profile              프로필이 팔로우하는 모든 사용자 다운로드. --login 필요. @yourself보다는 :feed 사용을 고려하십시오.
  "#hashtag"            #해시태그 다운로드.
  %location_id          %위치 ID 다운로드. --login 필요.
  :feed                 본인 피드 게시물 다운로드. --login 필요.
  :stories              본인이 팔로우하는 사용자들의 스토리 다운로드. --login 필요.
  :saved                저장한 게시물 다운로드. --login 필요.
  -- -shortcode         주어진 쇼트코드의 게시물 다운로드
  filename.json[.xz]    주어진 객체 재다운로드
  +args.txt             주어진 텍스트 파일에서 대상 (및 옵션) 읽기

특정 사용자의 게시물을 다운로드하려면 다음 명령어를 입력합니다.

instaloader --login <본인 사용자 이름> <대상 사용자 이름>

여기서 ‘본인 사용자 이름’은 인증된 인스타그램 계정의 사용자 이름이며, ‘대상 사용자 이름’은 다운로드하고자 하는 게시물의 프로필입니다.

프로필 팔로워들의 게시물을 다운로드하려면 다음 명령어를 입력합니다.

instaloader --login <본인 사용자 이름> @<대상 사용자 이름>

이전 명령어와의 차이점은 대상 사용자 이름 앞에 `@` 기호가 붙는다는 것입니다.

Instaloader 명령줄 인터페이스를 사용하는 대신 Python 패키지로 사용하는 방법도 있습니다. 패키지 사용에 대한 자세한 설명은 여기에서 확인할 수 있습니다.

Instaloader를 통해 다양한 미디어 파일을 다운로드할 수 있지만, 사용자 소개 페이지와 같은 메타데이터를 추출하는 데는 한계가 있습니다. 이 경우, 다음 방법으로 Python 스크립트를 작성하여 사용자 프로필 데이터를 추출할 수 있습니다.

인스타그램 데이터 다운로드를 위한 Python 스크립트 작성

개요

이 방법에서는 Python을 사용하여 인스타그램 데이터를 다운로드하는 간단한 스크립트를 작성합니다. 이 방법은 공개 프로필에서 데이터를 추출하기 위해 인스타그램의 잘 알려지지 않은 JSON API를 활용합니다.

이 API는 프로필 URL 끝에 `?__a=1&__d=1` 쿼리를 추가하면 인스타그램이 해당 프로필에 대한 JSON 데이터를 반환하는 방식으로 작동합니다.

예를 들어, 제 사용자 이름이 `0xanesu`라면, `https://instagram.com/0xanesu/?__a=1&__d=1`에 요청을 보내면 제 프로필에 대한 JSON 데이터를 응답으로 받을 수 있습니다.

스크립트 작성

Python에서 HTTP 요청을 보내기 위해 `requests` 모듈을 사용할 것입니다. 물론 `pycURL`, `urllib` 또는 선호하는 다른 HTTP 요청 클라이언트 라이브러리를 사용해도 됩니다. 먼저 pip를 사용하여 `requests` 모듈을 설치합니다.

pip install requests

설치가 완료되면 파일을 열어 스크립트를 작성하고, `requests` 모듈에서 `get` 함수를 가져옵니다. 또한, JSON 응답을 구문 분석하기 위해 `json` 모듈에서 `loads` 함수를 가져옵니다.

from requests import get
from json import loads

데이터를 가져온 후, 인스타그램 프로필 URL을 저장할 변수를 만듭니다.

url="https://instagram.com/<사용자 이름>"

앞서 언급했듯이, 프로필에서 인스타그램 데이터를 추출하려면 `?__a=1` 및 `&__d=1` 쿼리 매개변수를 추가해야 합니다. 이를 위해 매개변수를 사용하여 사전 객체를 생성합니다.

params = { '__a': 1, '__d': 1 }

요청을 승인하려면 인스타그램에서 세션 ID가 필요합니다. 나중에 세션 ID를 얻는 방법을 알려드리겠습니다. 지금은 자리 표시자 값을 임시로 입력해 둡니다.

cookies = { 'sessionid': '<세션 ID>' }

다음으로, 요청이 성공했을 때 실행할 함수를 정의합니다.

def on_success(response):
    profile_data_json = response.text
    parsed_data = loads(profile_data_json)

    print('사용자 전체 이름:', parsed_data['graphql']['user']['full_name'])
    print('사용자 소개:', parsed_data['graphql']['user']['biography'])

정의한 함수는 응답 객체를 가져와, 응답 본문에서 JSON을 추출한 다음 JSON을 객체로 구문 분석합니다. 이후, 프로필의 전체 이름과 소개만 추출하여 출력합니다.

다음으로, 오류 발생 시 실행할 함수를 정의합니다.

def on_error(response):
    # 오류 발생 시 오류 메시지 출력
    print('오류가 발생했습니다.')
    print('오류 코드:', response.status_code)
    print('오류 원인:', response.reason)

그런 다음 `get` 함수를 호출하여 URL, 매개변수 및 쿠키를 인수로 전달하여 요청을 생성합니다.

response = get(url, params, cookies=cookies)

마지막으로, 오류 상태 코드를 확인합니다. 상태 코드가 200이면 `on_success` 함수를 호출하고, 그렇지 않으면 `on_error` 함수를 호출합니다.

if response.status_code == 200:
    on_success(response)
else:
    on_error(response)

이로써 코드 작성이 완료되었습니다. 이제 남은 것은 세션 ID를 얻는 것입니다. 세션 ID를 얻으려면 Google Chrome을 열고 웹에서 인스타그램을 엽니다. 로그인이 되어 있는지 확인한 다음, `Ctrl + Shift + I` (Windows) 또는 `Cmd + Shift + I` (macOS)를 눌러 개발자 도구를 엽니다.

개발자 도구가 열린 상태에서 ‘Application’ 탭을 클릭합니다.

그런 다음 ‘Cookies’ 하위 메뉴를 클릭하여 인스타그램에서 사용되는 쿠키를 확인합니다.

개발자 도구 패널에 나열된 쿠키 목록에서 `sessionid` 쿠키 값을 복사합니다.

세션 ID를 복사한 후 스크립트에 붙여넣고 스크립트를 실행합니다. 제 경우에는 `https://instgram.com/instagram?__a=1&__d=1` URL을 사용하여 인스타그램의 사용자 이름을 사용했습니다. 아래는 실행 결과입니다.

이와 같은 방식으로 프로필 데이터를 동적으로 다운로드할 수 있습니다. JSON API에서 반환되는 더 많은 데이터가 있으며, 이를 모두 출력했을 때의 결과는 다음과 같습니다.

이것이 인스타그램 프로필에서 데이터와 게시물을 추출하는 방법입니다.

마지막으로

이 글에서는 Instaloader를 사용하여 게시물과 미디어를 다운로드하는 방법과, 미디어 콘텐츠보다 더 많은 정보를 포함하는 프로필 JSON 데이터를 추출하는 맞춤형 스크립트를 작성하는 방법을 살펴보았습니다. 이 프로젝트가 마음에 드셨다면, Python 코드 실행 시간을 측정하는 Python Timeit to Time Your Code 관련 게시물을 확인해 보세요.

인스타그램 경험을 최대한 활용하는 데 관심이 있다면, Qoob Stories의 인스타그램 다운로더에 대한 자세한 리뷰 게시물을 확인해 보세요.