ko
English
Español
中國人
Tiếng Việt
Deutsch
Українська
Português
Français
भारतीय
Türkçe
Italiano
Indonesia
Polski 다양한 봇 방지 메커니즘, 로그인 요구 사항 및 속도 제한으로 인해 Instagram 데이터에 액세스하는 것이 까다로울 수 있습니다. 하지만 올바른 도구와 기술을 사용하면 공개 프로필에서 유용한 정보를 추출할 수 있습니다. 이 가이드에서는 Instagram의 백엔드에 API 요청을 하고, 반환된 JSON 데이터에서 정보를 추출하여 JSON 파일에 저장하는 방법을 통해 Python을 사용하여 Instagram 사용자 데이터를 스크랩하는 방법을 안내합니다.
코드를 시작하기 전에 필요한 Python 라이브러리를 설치했는지 확인하세요.
pip install requests python-box
이해를 돕기 위해 코드를 여러 섹션으로 나누어 요청 전송, 데이터 가져오기 및 구문 분석, 탐지를 피하기 위한 프록시 사용, Box 라이브러리를 사용한 JSON 구문 분석 간소화 등을 살펴보겠습니다.
Instagram의 프론트엔드는 보안이 철저하지만 백엔드에서는 인증 없이 사용할 수 있는 API 엔드포인트를 제공합니다. 앞으로 이 중 하나를 사용하겠습니다.
이 API는 설명, 팔로워 수, 게시물 등 사용자 프로필에 대한 자세한 정보를 제공합니다. Python의 요청 라이브러리를 사용하여 데이터를 요청하는 방법을 살펴보겠습니다.
설명:
import requests
# 실제 브라우저 요청을 모방하는 헤더를 정의하세요.
headers = {
"x-ig-app-id": "936619743392459", # 요청을 인증하기 위한 인스타그램 앱 ID
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9,ru;q=0.8",
"Accept-Encoding": "gzip, deflate, br",
"Accept": "*/*",
}
# 이것을 스크랩하려는 사용자 이름으로 바꾸세요.
username = 'testtest'
# 프로필 데이터를 가져오기 위한 API 요청 보내기
response = requests.get(f'https://i.instagram.com/api/v1/users/web_profile_info/?username={username}', headers=headers)
response_json = response.json() # 응답을 JSON 객체로 파싱합니다.
인스타그램은 동일한 IP 주소로부터의 반복 요청을 제한하기 때문에 대규모 스크래핑을 위해서는 프록시를 사용하는 것이 필수적입니다. 프록시는 다른 IP 주소를 통해 요청을 라우팅하여 탐지를 피할 수 있도록 도와줍니다.
프록시 서버를 설정하려면 IP 주소, 포트 번호, 필요한 경우 인증을 위한 사용자 아이디와 비밀번호가 필요합니다.
proxies = {
'http': 'http://<proxy_username>:<proxy_password>@<proxy_ip>:<proxy_port>',
'https': 'https://<proxy_username>:<proxy_password>@<proxy_ip>:<proxy_port>',
}
response = requests.get(f'https://i.instagram.com/api/v1/users/web_profile_info/?username={username}', headers=headers, proxies=proxies)
Instagram의 API는 복잡한 중첩 JSON 구조를 반환하므로 기존의 사전 기반 액세스 방식으로는 탐색하기 어려울 수 있습니다. 구문 분석을 쉽게 하기 위해 사전 키 대신 점 표기법을 사용하여 JSON 데이터에 액세스할 수 있는 Box 라이브러리를 사용할 수 있습니다.
설명:
from box import Box
response_json = Box(response.json())
# 사용자 프로필 데이터 추출
user_data = {
'full name': response_json.data.user.full_name,
'id': response_json.data.user.id,
'biography': response_json.data.user.biography,
'business account': response_json.data.user.is_business_account,
'professional account': response_json.data.user.is_professional_account,
'category name': response_json.data.user.category_name,
'is verified': response_json.data.user.is_verified,
'profile pic url': response_json.data.user.profile_pic_url_hd,
'followers': response_json.data.user.edge_followed_by.count,
'following': response_json.data.user.edge_follow.count,
}
프로필 데이터가 추출되면 사용자의 동영상 타임라인과 일반 게시물에서 데이터를 스크랩할 수도 있습니다.
설명:
# 비디오 데이터 추출
profile_video_data = []
for element in response_json.data.user.edge_felix_video_timeline.edges:
video_data = {
'id': element.node.id,
'short code': element.node.shortcode,
'video url': element.node.video_url,
'view count': element.node.video_view_count,
'comment count': element.node.edge_media_to_comment.count,
'like count': element.node.edge_liked_by.count,
'duration': element.node.video_duration,
}
profile_video_data.append(video_data)
# 타임라인 미디어 데이터 추출(사진 및 동영상)
profile_timeline_media_data = []
for element in response_json.data.user.edge_owner_to_timeline_media.edges:
media_data = {
'id': element.node.id,
'short code': element.node.shortcode,
'media url': element.node.display_url,
'comment count': element.node.edge_media_to_comment.count,
'like count': element.node.edge_liked_by.count,
}
profile_timeline_media_data.append(media_data)
모든 데이터를 추출했으면 다음 단계는 추가 분석이나 저장을 위해 데이터를 JSON 파일에 저장하는 것입니다. 추출된 데이터를 JSON 파일에 쓰기 위해 Python의 json 모듈을 사용합니다. 각 파일은 indent=4 매개변수 덕분에 깔끔하게 포맷되어 데이터를 쉽게 읽고 처리할 수 있습니다.
import json
# 사용자 데이터를 JSON 파일에 저장
with open(f'{username}_profile_data.json', 'w') as file:
json.dump(user_data, file, indent=4)
# 동영상 데이터를 JSON 파일로 저장
with open(f'{username}_video_data.json', 'w') as file:
json.dump(profile_video_data, file, indent=4)
# 타임라인 미디어 데이터를 JSON 파일에 저장하기
with open(f'{username}_timeline_media_data.json', 'w') as file:
json.dump(profile_timeline_media_data, file, indent=4)
다음은 앞서 설명한 모든 섹션을 결합한 전체 Python 스크립트입니다. 이 코드는 Instagram에서 사용자 프로필 데이터, 동영상 데이터, 타임라인 미디어 데이터를 스크랩하고 필요한 헤더와 프록시를 처리한 후 추출된 정보를 JSON 파일에 저장합니다.
import requests
from box import Box
import json
# 인스타그램의 백엔드 API에 대한 실제 브라우저 요청을 모방하는 헤더
headers = {
"x-ig-app-id": "936619743392459",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9,ru;q=0.8",
"Accept-Encoding": "gzip, deflate, br",
"Accept": "*/*",
}
# 속도 제한 및 감지를 피하기 위해 프록시 설정(선택 사항)
proxies = {
'http': 'http://<proxy_username>:<proxy_password>@<proxy_ip>:<proxy_port>',
'https': 'https://<proxy_username>:<proxy_password>@<proxy_ip>:<proxy_port>',
}
# 스크랩할 인스타그램 사용자 아이디
username = 'testtest'
# 인스타그램의 백엔드 API에 요청을 보내 프로필 데이터를 가져옵니다.
response = requests.get(f'https://i.instagram.com/api/v1/users/web_profile_info/?username={username}',
headers=headers, proxies=proxies)
response_json = Box(response.json()) # 쉬운 탐색을 위해 응답을 상자 개체로 변환하기
# 사용자 프로필 데이터 추출
user_data = {
'full name': response_json.data.user.full_name,
'id': response_json.data.user.id,
'biography': response_json.data.user.biography,
'business account': response_json.data.user.is_business_account,
'professional account': response_json.data.user.is_professional_account,
'category name': response_json.data.user.category_name,
'is verified': response_json.data.user.is_verified,
'profile pic url': response_json.data.user.profile_pic_url_hd,
'followers': response_json.data.user.edge_followed_by.count,
'following': response_json.data.user.edge_follow.count,
}
# 사용자의 동영상 타임라인에서 동영상 데이터 추출하기
profile_video_data = []
for element in response_json.data.user.edge_felix_video_timeline.edges:
video_data = {
'id': element.node.id,
'short code': element.node.shortcode,
'video url': element.node.video_url,
'view count': element.node.video_view_count,
'comment count': element.node.edge_media_to_comment.count,
'like count': element.node.edge_liked_by.count,
'duration': element.node.video_duration,
}
profile_video_data.append(video_data)
# 타임라인 미디어 데이터 추출(사진 및 동영상)
profile_timeline_media_data = []
for element in response_json.data.user.edge_owner_to_timeline_media.edges:
media_data = {
'id': element.node.id,
'short code': element.node.shortcode,
'media url': element.node.display_url,
'comment count': element.node.edge_media_to_comment.count,
'like count': element.node.edge_liked_by.count,
}
profile_timeline_media_data.append(media_data)
# 사용자 프로필 데이터를 JSON 파일에 저장
with open(f'{username}_profile_data.json', 'w') as file:
json.dump(user_data, file, indent=4)
print(f'saved json: {username}_profile_data.json')
# 동영상 데이터를 JSON 파일로 저장
with open(f'{username}_video_data.json', 'w') as file:
json.dump(profile_video_data, file, indent=4)
print(f'saved json: {username}_video_data.json')
# 타임라인 미디어 데이터를 JSON 파일에 저장하기
with open(f'{username}_timeline_media_data.json', 'w') as file:
json.dump(profile_timeline_media_data, file, indent=4)
print(f'saved json: {username}_timeline_media_data.json')
Python으로 Instagram 데이터를 스크랩하는 것은 Instagram에서 제공하는 백엔드 API를 활용하여 수행할 수 있으며, 이를 통해 일부 프런트엔드 제한을 우회할 수 있습니다. 올바른 헤더를 사용하여 브라우저 동작을 모방하고 프록시를 사용하여 속도 제한을 피하는 것이 중요한 단계입니다. Box 라이브러리는 점 표기법을 통해 JSON 구문 분석을 더욱 직관적으로 만들어 프로세스를 더욱 간소화합니다. 대규모 Instagram 스크래핑을 시작하기 전에 인스타그램의 서비스 약관을 준수하고 스크래핑 작업이 인스타그램의 정책을 위반하지 않는지 확인해야 합니다.
댓글: 0