Accéder aux données d'Instagram peut s'avérer délicat en raison de divers mécanismes anti-bots, d'exigences de connexion et de limites de débit. Cependant, vous pouvez extraire des informations utiles des profils publics avec les bons outils et techniques. Cet article vous guidera dans la manière de récupérer les données des utilisateurs d'Instagram à l'aide de Python en effectuant des requêtes API au backend d'Instagram, en extrayant des informations à partir des données JSON renvoyées et en les enregistrant dans un fichier JSON.
Avant d'entrer dans le code, assurez-vous que vous avez installé les bibliothèques Python requises.
pip install requests python-box
Nous diviserons le code en différentes sections pour une meilleure compréhension, notamment l'envoi de la requête, l'obtention et l'analyse des données, l'utilisation de proxies pour éviter la détection et la simplification de l'analyse JSON à l'aide de la bibliothèque Box.
La partie frontale d'Instagram est fortement sécurisée, mais la partie dorsale propose des points d'accès à l'API qui peuvent être utilisés sans authentification. Nous utiliserons l'un de ces points à l'avenir.
Cette API fournit des informations détaillées sur le profil d'un utilisateur, notamment sa description, son nombre de followers et ses publications. Voyons comment demander des données à l'aide de la bibliothèque requests de Python.
Explanation:
import requests
# Définir des en-têtes pour imiter une requête réelle du navigateur
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": "*/*",
}
# Remplacez ceci par le nom d'utilisateur que vous souhaitez récupérer
username = 'testtest'
# Envoyer une demande d'API pour obtenir des données de profil
response = requests.get(f'https://i.instagram.com/api/v1/users/web_profile_info/?username={username}', headers=headers)
response_json = response.json() # Analyse la réponse en un objet JSON
Instagram limitant les demandes répétées provenant de la même adresse IP, l'utilisation de proxys est essentielle pour le scraping à grande échelle. Un proxy achemine vos demandes via différentes adresses IP, ce qui vous permet d'éviter d'être détecté.
Pour configurer un serveur proxy, vous aurez besoin de l'adresse IP, du numéro de port et, si nécessaire, d'un nom d'utilisateur et d'un mot de passe pour l'authentification.
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)
L'API d'Instagram renvoie une structure JSON imbriquée complexe, qui peut être difficile à parcourir à l'aide d'un accès traditionnel basé sur un dictionnaire. Pour faciliter l'analyse, nous pouvons utiliser la bibliothèque Box, qui permet d'accéder aux données JSON en utilisant la notation par points au lieu des clés de dictionnaire.
Explication :
from box import Box
response_json = Box(response.json())
# Extraire les données du profil de l'utilisateur
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,
}
Une fois les données de profil extraites, nous pouvons également extraire des données de la chronologie des vidéos de l'utilisateur et de ses publications régulières.
Explanation:
# Extraire des données vidéo
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)
# Extraire les données médiatiques de la chronologie (photos et vidéos)
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)
Une fois que vous avez extrait toutes les données, l'étape suivante consiste à les enregistrer dans un fichier JSON en vue d'une analyse ou d'un stockage ultérieur. Nous utilisons le module json de Python pour écrire les données extraites dans des fichiers JSON. Chaque fichier sera soigneusement formaté, grâce au paramètre indent=4, ce qui facilitera la lecture et le traitement des données.
import json
# Enregistrer les données de l'utilisateur dans un fichier JSON
with open(f'{username}_profile_data.json', 'w') as file:
json.dump(user_data, file, indent=4)
# Enregistrer les données vidéo dans un fichier JSON
with open(f'{username}_video_data.json', 'w') as file:
json.dump(profile_video_data, file, indent=4)
# Enregistrer les données médiatiques de la ligne de temps dans un fichier JSON
with open(f'{username}_timeline_media_data.json', 'w') as file:
json.dump(profile_timeline_media_data, file, indent=4)
Voici le script Python complet qui combine toutes les sections discutées précédemment. Ce code récupère les données du profil de l'utilisateur, les données vidéo et les données médiatiques de la chronologie d'Instagram, gère les en-têtes et les proxys nécessaires, et enregistre les informations extraites dans des fichiers JSON.
import requests
from box import Box
import json
# En-têtes pour imiter une requête réelle du navigateur à l'API backend d'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": "*/*",
}
# Définir un proxy pour éviter la limitation du débit et la détection (facultatif)
proxies = {
'http': 'http://<proxy_username>:<proxy_password>@<proxy_ip>:<proxy_port>',
'https': 'https://<proxy_username>:<proxy_password>@<proxy_ip>:<proxy_port>',
}
# Le nom d'utilisateur Instagram à récupérer
username = 'testtest'
# Envoyer une demande à l'API de backend d'Instagram pour obtenir des données de 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()) # Convertir la réponse en objet Box pour faciliter la navigation
# Extraire les données du profil de l'utilisateur
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,
}
# Extraire les données vidéo de la chronologie vidéo de l'utilisateur
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)
# Extraire les données de la timeline (photos et vidéos)
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)
# Enregistrer les données du profil de l'utilisateur dans un fichier 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')
# Enregistrer les données vidéo dans un fichier 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')
# Enregistrer les données médiatiques de la ligne de temps dans un fichier 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')
Il est possible de récupérer des données Instagram avec Python en exploitant l'API backend fournie par Instagram, ce qui permet de contourner certaines des restrictions frontales. L'utilisation des bons en-têtes pour imiter le comportement du navigateur et l'utilisation de proxies pour éviter la limitation de débit sont des étapes critiques. La bibliothèque Box simplifie encore le processus en rendant l'analyse JSON plus intuitive grâce à la notation par points. Avant de vous lancer dans le scraping d'Instagram à grande échelle, n'oubliez pas de respecter les conditions d'utilisation d'Instagram et assurez-vous que vos efforts de scraping n'enfreignent pas leurs politiques.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Commentaires: 0