Mendapatkan akses ke data Instagram bisa jadi rumit karena berbagai mekanisme anti-bot, persyaratan login, dan batas nilai. Namun, Anda dapat mengekstrak informasi yang berguna dari profil publik dengan alat dan teknik yang tepat. Artikel ini akan memandu Anda tentang cara mengikis data pengguna Instagram menggunakan Python dengan membuat permintaan API ke backend Instagram, mengekstrak informasi dari data JSON yang dikembalikan, dan menyimpannya ke dalam file JSON.
Sebelum masuk ke dalam kode, pastikan Anda telah menginstal pustaka Python yang diperlukan.
pip install requests python-box
Kita akan memecah kode menjadi beberapa bagian untuk pemahaman yang lebih baik, termasuk mengirimkan permintaan, mendapatkan dan mengurai data, menggunakan proksi untuk menghindari deteksi, dan menyederhanakan penguraian JSON dengan pustaka Box.
Bagian depan Instagram sangat aman, tetapi bagian belakangnya menawarkan titik akhir API yang dapat digunakan tanpa autentikasi. Kami akan menggunakan salah satu dari titik-titik ini di masa mendatang.
API ini menyediakan informasi terperinci tentang profil pengguna, termasuk deskripsi, jumlah pengikut, dan kiriman. Mari kita jelajahi cara meminta data menggunakan pustaka permintaan di Python.
Explanation:
import requests
# Tentukan tajuk untuk meniru permintaan browser yang sebenarnya
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": "*/*",
}
# Ganti dengan nama pengguna yang ingin Anda kikis
username = 'testtest'
# Kirim permintaan API untuk mendapatkan data profil
response = requests.get(f'https://i.instagram.com/api/v1/users/web_profile_info/?username={username}', headers=headers)
response_json = response.json() # Mengurai respons menjadi objek JSON
Karena Instagram membatasi permintaan berulang dari alamat IP yang sama, menggunakan proxy sangat penting untuk scraping skala besar. Proksi merutekan permintaan Anda melalui alamat IP yang berbeda, sehingga membantu Anda menghindari deteksi.
Untuk menyiapkan server proxy, Anda memerlukan alamat IP, nomor port, dan, jika diperlukan, nama pengguna dan kata sandi untuk autentikasi.
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)
API Instagram mengembalikan struktur JSON bersarang yang kompleks, yang mungkin sulit untuk dinavigasi menggunakan akses berbasis kamus tradisional. Untuk mempermudah penguraian, kita dapat menggunakan pustaka Box, yang memungkinkan mengakses data JSON menggunakan notasi titik, bukan kunci kamus.
Penjelasan:
from box import Box
response_json = Box(response.json())
# Mengekstrak data profil pengguna
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,
}
Setelah data profil diekstraksi, kami juga dapat mengikis data dari linimasa video pengguna dan postingan reguler.
Penjelasan:
# Mengekstrak data video
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)
# Mengekstrak data media garis waktu (foto dan video)
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)
Setelah Anda mengekstrak semua data, langkah selanjutnya adalah menyimpannya ke file JSON untuk analisis atau penyimpanan lebih lanjut. Kami menggunakan modul json Python untuk menulis data yang diekstrak ke file JSON. Setiap file akan diformat dengan rapi, berkat parameter indent=4, yang membuatnya mudah untuk dibaca dan diproses.
import json
# Menyimpan data pengguna ke file JSON
with open(f'{username}_profile_data.json', 'w') as file:
json.dump(user_data, file, indent=4)
# Menyimpan data video ke file JSON
with open(f'{username}_video_data.json', 'w') as file:
json.dump(profile_video_data, file, indent=4)
# Menyimpan data media garis waktu ke file JSON
with open(f'{username}_timeline_media_data.json', 'w') as file:
json.dump(profile_timeline_media_data, file, indent=4)
Berikut ini adalah skrip Python lengkap yang menggabungkan semua bagian yang telah dibahas sebelumnya. Kode ini mengambil data profil pengguna, data video, dan data media linimasa dari Instagram, menangani header dan proksi yang diperlukan, dan menyimpan informasi yang diekstrak ke file JSON.
import requests
from box import Box
import json
# Header untuk meniru permintaan browser yang sebenarnya ke API backend Instagram
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": "*/*",
}
# Mengatur proxy untuk menghindari pembatasan laju dan deteksi (opsional)
proxies = {
'http': 'http://<proxy_username>:<proxy_password>@<proxy_ip>:<proxy_port>',
'https': 'https://<proxy_username>:<proxy_password>@<proxy_ip>:<proxy_port>',
}
# Nama pengguna Instagram yang akan dikikis
username = 'testtest'
# Kirim permintaan ke API backend Instagram untuk mendapatkan data profil
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()) # Mengonversi respons ke objek Kotak untuk memudahkan navigasi
# Mengekstrak data profil pengguna
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,
}
# Mengekstrak data video dari timeline video pengguna
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)
# Mengekstrak data media garis waktu (foto dan video)
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)
# Menyimpan data profil pengguna ke file 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')
# Menyimpan data video ke file 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')
# Menyimpan data media garis waktu ke file 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')
Mengikis data Instagram dengan Python dapat dilakukan dengan memanfaatkan API backend yang disediakan oleh Instagram, yang membantu mem-bypass beberapa batasan front-end. Menggunakan header yang tepat untuk meniru perilaku peramban dan menggunakan proksi untuk menghindari pembatasan kecepatan adalah langkah penting. Pustaka Box semakin menyederhanakan prosesnya dengan membuat penguraian JSON menjadi lebih intuitif dengan notasi titik. Sebelum Anda mulai mengikis Instagram dalam skala besar, ingatlah untuk mematuhi persyaratan layanan Instagram, dan pastikan upaya pengikisan Anda tidak melanggar kebijakan mereka.
Komentar: 0