Instagram verilerine erişmek, çeşitli anti-bot mekanizmaları, oturum açma gereksinimleri ve oran sınırları nedeniyle zor olabilir. Ancak doğru araç ve tekniklerle herkese açık profillerden faydalı bilgiler elde edebilirsiniz. Bu makale, Instagram'ın arka ucuna API istekleri yaparak, döndürülen JSON verilerinden bilgi çıkararak ve bunları bir JSON dosyasına kaydederek Python kullanarak Instagram kullanıcı verilerini nasıl kazıyacağınız konusunda size rehberlik edecektir.
Koda girmeden önce, gerekli Python kütüphanelerini yüklediğinizden emin olun.
pip install requests python-box
Daha iyi anlaşılması için kodu farklı bölümlere ayıracağız; istek gönderme, verileri alma ve ayrıştırma, tespit edilmekten kaçınmak için proxy kullanma ve Box kütüphanesi ile JSON ayrıştırmayı basitleştirme.
Instagram'ın ön ucu son derece güvenlidir, ancak arka uç kimlik doğrulaması olmadan kullanılabilecek API uç noktaları sunar. İleride bu noktalardan birini kullanacağız.
Bu API, bir kullanıcının açıklaması, takipçi sayısı ve gönderileri dahil olmak üzere profili hakkında ayrıntılı bilgi sağlar. Python'da requests kütüphanesini kullanarak nasıl veri talep edileceğini keşfedelim.
Açıklama:
import requests
# Gerçek bir tarayıcı isteğini taklit etmek için başlıkları tanımlayın
headers = {
"x-ig-app-id": "936619743392459", # Instagram app ID to authenticate the request
"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": "*/*",
}
# Bunu kazımak istediğiniz kullanıcı adı ile değiştirin
username = 'testtest'
# Profil verilerini almak için bir API isteği gönderin
response = requests.get(f'https://i.instagram.com/api/v1/users/web_profile_info/?username={username}', headers=headers)
response_json = response.json() # Yanıtı bir JSON nesnesine ayrıştırın
Instagram aynı IP adresinden tekrarlanan istekleri kısıtladığından, proxy kullanmak büyük ölçekli kazıma için çok önemlidir. Bir proxy, isteklerinizi farklı IP adresleri üzerinden yönlendirerek tespit edilmekten kaçınmanıza yardımcı olur.
Bir proxy sunucusu kurmak için IP adresine, bağlantı noktası numarasına ve gerekirse kimlik doğrulama için bir kullanıcı adı ve parolaya ihtiyacınız olacaktır.
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'ın API'si, geleneksel sözlük tabanlı erişimi kullanarak gezinmesi zor olabilen karmaşık bir iç içe JSON yapısı döndürür. Ayrıştırmayı kolaylaştırmak için, sözlük anahtarları yerine nokta gösterimini kullanarak JSON verilerine erişmeyi sağlayan Box kütüphanesini kullanabiliriz.
Açıklama:
from box import Box
response_json = Box(response.json())
# Kullanıcı profili verilerini ayıklayın
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,
}
Profil verileri çıkarıldıktan sonra, kullanıcının video zaman çizelgesinden ve normal gönderilerinden de veri kazıyabiliriz.
Açıklama:
# Video verilerini ayıklayın
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)
# Zaman çizelgesi medya verilerini (fotoğraflar ve videolar) ayıklayın
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)
Tüm verileri çıkardıktan sonra, bir sonraki adım daha fazla analiz veya depolama için bir JSON dosyasına kaydetmektir. Çıkarılan verileri JSON dosyalarına yazmak için Python'un json modülünü kullanıyoruz. Verilerin okunmasını ve işlenmesini kolaylaştıran indent=4 parametresi sayesinde her dosya düzgün bir şekilde biçimlendirilecektir.
import json
# Kullanıcı verilerini bir JSON dosyasına kaydetme
with open(f'{username}_profile_data.json', 'w') as file:
json.dump(user_data, file, indent=4)
# Video verilerini bir JSON dosyasına kaydetme
with open(f'{username}_video_data.json', 'w') as file:
json.dump(profile_video_data, file, indent=4)
# Zaman çizelgesi medya verilerini bir JSON dosyasına kaydetme
with open(f'{username}_timeline_media_data.json', 'w') as file:
json.dump(profile_timeline_media_data, file, indent=4)
İşte daha önce tartışılan tüm bölümleri birleştiren eksiksiz Python betiği. Bu kod, Instagram'dan kullanıcı profili verilerini, video verilerini ve zaman çizelgesi medya verilerini kazır, gerekli başlıkları ve proxy'leri işler ve çıkarılan bilgileri JSON dosyalarına kaydeder.
import requests
from box import Box
import json
# Instagram'ın arka uç API'sine yönelik gerçek bir tarayıcı isteğini taklit eden başlıklar
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": "*/*",
}
# Hız sınırlamasını ve algılamayı önlemek için bir proxy ayarlayın (isteğe bağlı)
proxies = {
'http': 'http://<proxy_username>:<proxy_password>@<proxy_ip>:<proxy_port>',
'https': 'https://<proxy_username>:<proxy_password>@<proxy_ip>:<proxy_port>',
}
# Kazınacak Instagram kullanıcı adı
username = 'testtest'
# Profil verilerini almak için Instagram'ın arka uç API'sine bir istek gönderin
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()) # Kolay gezinme için yanıtı Box nesnesine dönüştürün
# Kullanıcı profili verilerini ayıklayın
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,
}
# Kullanıcının video zaman çizelgesinden video verilerini ayıklayın
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)
# Zaman çizelgesi medya verilerini (fotoğraflar ve videolar) ayıklayın
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)
# Kullanıcı profili verilerini bir JSON dosyasına kaydetme
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')
# Video verilerini bir JSON dosyasına kaydetme
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')
# Zaman çizelgesi medya verilerini bir JSON dosyasına kaydetme
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')
Instagram verilerini Python ile kazımak, Instagram tarafından sağlanan ve bazı ön uç kısıtlamalarını atlamaya yardımcı olan arka uç API'sinden yararlanılarak yapılabilir. Tarayıcı davranışını taklit etmek için doğru başlıkları kullanmak ve hız sınırlamasını önlemek için proxy kullanmak kritik adımlardır. Box kütüphanesi, JSON ayrıştırmasını nokta gösterimiyle daha sezgisel hale getirerek süreci daha da basitleştirir. Instagram'ı geniş ölçekte kazımaya başlamadan önce Instagram'ın hizmet şartlarına uymayı unutmayın ve kazıma çalışmalarınızın politikalarını ihlal etmediğinden emin olun.
Yorumlar: 0