Comment récupérer des données Instagram à l'aide de Python

Commentaires: 0

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.

Mise en place des bibliothèques nécessaires

Avant d'entrer dans le code, assurez-vous que vous avez installé les bibliothèques Python requises.


pip install requests python-box

  • requêtes: Pour effectuer des requêtes HTTP.
  • python-box: Simplifie l'accès aux données en transformant les dictionnaires en objets permettant l'accès à la notation point.

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.

Étape 1. Faire la demande d'API

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:

  1. En-têtes : Instagram bloque la plupart des requêtes de robots en analysant les en-têtes de requête. Le x-ig-app-id est essentiel car il imite une demande provenant de l'application Instagram elle-même.
  2. La chaîne User-Agent représente le navigateur à l'origine de la demande, faisant croire à Instagram qu'il s'agit d'un véritable utilisateur.
  3. Demande d'API de backend : L'URL https://i.instagram.com/api/v1/users/web_profile_info/?username={username} fait partie de l'API de backend d'Instagram. Elle fournit des informations détaillées sur un profil public.
  4. Traitement de la réponse JSON : Nous utilisons response.json() pour convertir la réponse de l'API en un objet JSON que nous pouvons facilement analyser et dont nous pouvons extraire des informations.

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

Étape 2. Manipuler les proxys pour contourner la limitation de débit

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)

Étape 3. Simplifier l'analyse JSON avec Box

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 :

  1. Boîte: Cette bibliothèque convertit un dictionnaire JSON en objet, ce qui nous permet d'accéder à des champs profondément imbriqués en utilisant la notation par points. Par exemple, au lieu d'écrire response_json['data']['user']['full_name'], nous pouvons simplement écrire response_json.data.user.full_name.
  2. Extraction des données: Nous extrayons des informations de profil utiles telles que le nom complet de l'utilisateur, son identifiant, sa biographie, s'il s'agit d'un compte professionnel ou d'entreprise, son statut de vérification et le nombre d'adeptes.

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,
}

Étape 4. Extraction des données vidéo et chronologiques

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:

  1. Données vidéo: Cette section extrait des données sur les vidéos Instagram de l'utilisateur, notamment l'URL de la vidéo, le nombre de vues, le nombre de commentaires et la durée de la vidéo.
  2. Médias de la chronologie: De la même manière, cette section extrait des données de la chronologie de l'utilisateur, en capturant l'URL du média du message, les mentions "J'aime" et les commentaires.

# 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)

Étape 5. Enregistrement des données dans des fichiers JSON

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)

Code complet

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.

Commentaires:

0 Commentaires