인스타그램 사진 다운로드 파이썬 자동화 스크립트
Instaloader 기반 Python 스크립트 및 Windows 인코딩 오류 해결
인스타그램에서 사진을 일일이 수작업으로 인스타그램 사진 다운로드 하는 것은 반복적이고 비효율적입니다. 공식 API를 이용하려면 앱 등록과 토큰 발급 절차가 필요하고, 비공개 계정 접근 또한 제약이 많습니다.
이에, Instaloader 라이브러리를 활용한 간단한 파이썬 스크립트를 통해 공개·비공개 계정과 특정 게시물에서 원하는 이미지를 자동으로 다운로드하는 방법을 정리했습니다.
Instaloader 기반 Python 스크립트 환경 준비
- Python 3.7 이상 권장
- Instaloader 설치
pip install instaloader
- Windows 환경에서 터미널 인코딩 설정
- PowerShell 또는 CMD:
chcp 65001
- 또는 파이썬 실행 시
-X utf8
플래그 사용
- PowerShell 또는 CMD:
기본 스크립트 구현
다음은 Instaloader를 이용해 계정 전체 또는 특정 게시물만 다운로드할 수 있는 기본 구조입니다.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
instagram_downloader.py
Instaloader를 이용해 인스타그램 사진을 자동으로 다운로드하는 스크립트입니다.
"""
import os
import sys
import argparse
import instaloader
# Windows 콘솔 UTF-8 인코딩 재구성
try:
sys.stdout.reconfigure(encoding="utf-8", errors="replace")
sys.stderr.reconfigure(encoding="utf-8", errors="replace")
except AttributeError:
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding="utf-8", errors="replace")
def download_profile(loader, username, output_dir):
profile = instaloader.Profile.from_username(loader.context, username)
target_dir = os.path.join(output_dir, username)
os.makedirs(target_dir, exist_ok=True)
print(f"[+] '{username}' 프로필에서 게시물 가져오는 중...")
for post in profile.get_posts():
print(f" → {post.shortcode}", end=" ")
loader.download_post(post, target=target_dir)
print("완료")
def download_post(loader, post_url, output_dir):
shortcode = post_url.rstrip("/").split("/")[-1]
post = instaloader.Post.from_shortcode(loader.context, shortcode)
target_dir = os.path.join(output_dir, shortcode)
os.makedirs(target_dir, exist_ok=True)
print(f"[+] 게시물 {shortcode} 다운로드 중...")
loader.download_post(post, target=target_dir)
print("완료")
def main():
parser = argparse.ArgumentParser(description="Instaloader 기반 인스타그램 사진 다운로드 스크립트")
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument("--target", help="사용자 계정명 (username)")
group.add_argument("--post-url", help="다운로드할 게시물 URL")
parser.add_argument("--login", action="store_true", help="비공개 계정 다운로드를 위해 로그인")
parser.add_argument("--username", help="인스타그램 로그인 아이디")
parser.add_argument("--password", help="인스타그램 로그인 비밀번호")
parser.add_argument("--output-dir", default="downloads", help="저장 폴더 (기본: downloads)")
args = parser.parse_args()
loader = instaloader.Instaloader(
download_comments=False,
save_metadata=False,
post_metadata_txt_pattern="",
dirname_pattern="{target}"
)
if args.login:
if not (args.username and args.password):
parser.error("로그인을 사용하려면 --username 과 --password 를 모두 지정해야 합니다.")
print("[*] 로그인 시도 중...")
loader.login(args.username, args.password)
print("[+] 로그인 성공")
os.makedirs(args.output_dir, exist_ok=True)
os.chdir(args.output_dir)
if args.post_url:
download_post(loader, args.post_url, ".")
else:
download_profile(loader, args.target, ".")
if __name__ == "__main__":
main()
사용 방법
- Instaloader 설치
pip install instaloader
- 스크립트 실행 권한 부여 (Linux/Mac)
chmod +x instagram_downloader.py
- 공개 계정 전체 다운로드
python instagram_downloader.py --target instagram_username
- 비공개 계정 다운로드 (로그인 필요)
python instagram_downloader.py --target private_username \ --login --username your_id --password your_pw
- 특정 게시물 URL만 다운로드
python instagram_downloader.py --post-url https://www.instagram.com/p/게시물코드/
Windows cp949 인코딩 오류 원인
Windows 콘솔의 기본 인코딩(cp949)은 U+2024(․) 같은 유니코드 문자를 출력할 수 없어 UnicodeEncodeError: 'cp949' codec can't encode character
에러가 발생합니다. 특히 print()
나 Instaloader의 context.log()
호출 시 문제가 됩니다.
인코딩 오류 해결 방법
스크립트 상단에 sys.stdout
/sys.stderr
의 인코딩을 UTF-8로 재구성하는 코드를 추가하면 오류를 방지할 수 있습니다. 위 예제 코드에 포함된 해당 블록을 참고하세요.
+import sys
+### Windows 콘솔 UTF-8 인코딩 재구성 ###
+try:
+ sys.stdout.reconfigure(encoding="utf-8", errors="replace")
+ sys.stderr.reconfigure(encoding="utf-8", errors="replace")
+except AttributeError:
+ import io
+ sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
+ sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding="utf-8", errors="replace")
최종 완성된 전체 소스 코드
위 내용을 모두 반영한 최종 버전의 instagram_downloader.py
전체 소스는 다음과 같습니다.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
instagram_downloader.py
Instaloader를 이용해 인스타그램 사진을 자동으로 다운로드하는 스크립트입니다.
"""
import os
import sys
import argparse
import instaloader
# Windows 콘솔 UTF-8 인코딩 재구성
try:
sys.stdout.reconfigure(encoding="utf-8", errors="replace")
sys.stderr.reconfigure(encoding="utf-8", errors="replace")
except AttributeError:
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding="utf-8", errors="replace")
def download_profile(loader, username, output_dir):
profile = instaloader.Profile.from_username(loader.context, username)
target_dir = os.path.join(output_dir, username)
os.makedirs(target_dir, exist_ok=True)
print(f"[+] '{username}' 프로필에서 게시물 가져오는 중...")
for post in profile.get_posts():
print(f" → {post.shortcode}", end=" ")
loader.download_post(post, target=target_dir)
print("완료")
def download_post(loader, post_url, output_dir):
shortcode = post_url.rstrip("/").split("/")[-1]
post = instaloader.Post.from_shortcode(loader.context, shortcode)
target_dir = os.path.join(output_dir, shortcode)
os.makedirs(target_dir, exist_ok=True)
print(f"[+] 게시물 {shortcode} 다운로드 중...")
loader.download_post(post, target=target_dir)
print("완료")
def main():
parser = argparse.ArgumentParser(description="Instaloader 기반 인스타그램 사진 다운로드 스크립트")
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument("--target", help="사용자 계정명 (username)")
group.add_argument("--post-url", help="다운로드할 게시물 URL")
parser.add_argument("--login", action="store_true", help="비공개 계정 다운로드를 위해 로그인")
parser.add_argument("--username", help="인스타그램 로그인 아이디")
parser.add_argument("--password", help="인스타그램 로그인 비밀번호")
parser.add_argument("--output-dir", default="downloads", help="저장 폴더 (기본: downloads)")
args = parser.parse_args()
loader = instaloader.Instaloader(
download_comments=False,
save_metadata=False,
post_metadata_txt_pattern="",
dirname_pattern="{target}"
)
if args.login:
if not (args.username and args.password):
parser.error("로그인을 사용하려면 --username 과 --password 를 모두 지정해야 합니다.")
print("[*] 로그인 시도 중...")
loader.login(args.username, args.password)
print("[+] 로그인 성공")
os.makedirs(args.output_dir, exist_ok=True)
os.chdir(args.output_dir)
if args.post_url:
download_post(loader, args.post_url, ".")
else:
download_profile(loader, args.target, ".")
if __name__ == "__main__":
main()
결론
이 스크립트는 Instaloader의 강력한 기능을 활용하여 공개 계정과 비공개 계정, 특정 게시물의 이미지를 간편하게 다운로드할 수 있습니다. 특히 Windows 환경에서 종종 발생하는 인코딩 오류를 미리 방지하여 안정적으로 운영할 수 있다는 점이 큰 장점입니다. 필요에 따라 추가 옵션(스토리 다운로드, 동영상 포함 등)을 공식 문서를 참고하여 확장해 보시기 바랍니다.
'컴퓨터 인터넷 모바일 it' 카테고리의 다른 글
티스토리 블로그 오퍼월, 앵커 광고 금지 약관 위반과 로그인 제한, 그리고 저품질 제재 문제 심층 분석 (0) | 2025.05.21 |
---|---|
윈도우 단축키 모음 캡처·녹화·창 최대화·축소·이동·편집 (0) | 2025.04.21 |
엑셀 함수 정리 예제, 찾기, 수학, 통계 SUM SUMIF ROUND VLOOKUP HLOOKUP COUNTIF (0) | 2025.04.10 |
컴퓨터 암호 제거, 윈도우10 로그인 암호 없애기 (0) | 2025.04.06 |
엑셀 행 높이 늘리기, 엑셀 열너비 단축키 (0) | 2025.04.05 |