Savoir son nombre de followers instagram

Résolu

Bonjour,

Je cherche à m'inspirer d'un script python pour connaitre son nombre de followers sur Instagram. Merci des exemples.


“Impose ta chance, serre ton bonheur et va vers ton risque. À te regarder, ils s’habitueront.”  René Char 

5 réponses

Résumé de la discussion

L'objectif est d'obtenir le nombre de followers sur Instagram à partir d'un script Python, afin d'automatiser la récupération sans passer par l'interface web manuelle quotidienne. Des solutions fiables passent par l'API officielle Graph d'Instagram via un compte Creator ou Business et un token d'accès, ou par des bibliothèques comme Instaloader qui lisent les informations des profils après authentification. En revanche, le scraping direct de pages est fragile et peut être contraire aux conditions d'utilisation, et certaines approches nécessitent une gestion d'authentification comme le login, la 2FA ou des tokens d'application. D'autres éléments à considérer incluent la lecture de la documentation API et la vérification de la disponibilité des métriques dans les réponses JSON, ainsi que les limitations liées à l'accès.

Bobot (l’IA à votre service)
  1. Bonjour,

    En premier lieu, le compte Instagram doit être "Creator" ou "Business" pour disposer d'une clé API.

    Ensuite, avant de rédiger le script, il convient de s'imprégner de la documentation API :-)

    Cette doc en main, il suffit de rédiger un script Python tapant une requête GET sur l'API Instagram avec les bons paramètres puis lire le contenu du JSON renvoyé.

    import requests
    TOKEN_API = "TOKEN_API"
    USER = "ID_USER_INSTAGRAM"
    URL_API = f"https://graph.facebook.com/v21.0/{USER}/insights"
    parametres_requete = {
        "metric": "follower_count",
        "period": "lifetime",
        "access_token": TOKEN_API
    }
    reponse = requests.get(URL_API, params=parametres_requete)
    if reponse.status_code == 200:
        try:
            body = reponse.json()
            if "data" in body and body["data"]:
                nb_followers = body["data"][0].get("values", [{}])[0].get("value", "Non disponible")
                print(f"Nombre de followers : {nb_followers}")
            else:
                print("Soit aucune donnée n'est disponible, soit le compte a moins de 100 followers.")
        except ValueError as exception:
            print(f"Impossible de lire le contenu du JSON, erreur : {exception}")
    else:
        print(f"Erreur {reponse.status_code} rencontrée.")

    Tenez au jus !


    1
    1. import instaloader
      
      # Créer une instance d'Instaloader
      L = instaloader.Instaloader()
      
      # Remplacez 'votre_nom_utilisateur' par le nom d'utilisateur du compte Instagram
      username = 'plume_quentique_du_mascaret'
      
      # Charger le profil
      profile = instaloader.Profile.from_username(L.context, username)
      
      # Afficher le nombre de followers
      print(f"Le compte {username} a {profile.followers} followers.")

      Avec ce script ça fonctionne, tant mieux, merci pour ton aide !


      1
      1. Tant mieux si ça convient, marque le sujet en résolu

        Si tu trouves comment régler l'erreur du message 43, reviens poster ici pour les suivants

        0
      2. @luckydu43

        J'ai remarqué que ce script, fonctionnel, est stocké en :

        C :\Users\quent\onedrive\desktop\Python

        Les autres codes sont :

        C:\Users\quent\PycharmProjects\pythonProject

        Je ne sais pas si cela à un lien de cause à effet ?

        0
      3. @quentin2121

        Intéressant.
        Python est exécuté où il est installé mais les chemins relatifs sont liés au répertoire courant.
        Quand tu fais pydevp.py --file, ton script est chargé en mémoire mais Python utilise toujours le répertoire courant pour accéder aux fichiers.
        Ces deux répertoires n'ont peut-être pas les mêmes droits d'accès.

        Pour vérifier si tu te le sens, ajoute ça en haut du script :

        import os
        import sys
        
        print("Interpréteur Python : ", sys.executable)
        print("Répertoire courant où le script est exécuté : ", os.getcwd())
        print("Droits d'accès et écriture dans le répertoire courant : ", os.access(os.getcwd(), os.W_OK))  
        print("Liste des fichiers présents dans le répertoire courant : ", os.listdir(os.getcwd()))
        0
      4. @luckydu43

        One drive est apparemment comme un dossier sur C. J'ai stoppé la sauvegarde automatique vers One drive, mon quota gratuit est rempli. Peut-être ai-je fait une fausse manipulation en créant ce script ? Quand je retourne sur le répertoire de PyCharm, que je crée un nouveau script, il est bien enregistré dans son répertoire avec lequel est installé PyCharm. Je ne teste pas plus.

        0
    2. Mon compte insta n'est pas professionnel ou creator. Je me connecte par un navigateur a partir du pc, comme sur smartphone. 

      Est que ce code sur le lien suivant ferait l'affaire :

      https://openclassrooms.com/forum/sujet/compteur-dabonne-sur-insta


      0
      1. C'est du scraping de site Web. Il suffit que la page change pour devoir mettre à jour le script, en plus d'être une pratique non forcément acceptée. Quid des dérives sur un forum public. Je n'apporterai aucune aide sur cette piste ¯\_(ツ)_/¯

        0
      2. @luckydu43
        from bs4 import BeautifulSoup
        import requests
        import time
        
        
        while(True):
            URL = "https://www.instagram.com/systorm.os_off/"
            def parse_data(s):
                data = {}
                s = s.split("-")[0]
                s = s.split(" ")
                data['Followers'] = s[0]
                #data['Following'] = s[2]
                #data['Posts'] = s[4]
                return data
        
            def scrape_data(username):
                try:
                    r = requests.get(URL.format(username))
                    s = BeautifulSoup(r.text, "html.parser")
                    meta = s.find("meta", property ="og:description")
                    return parse_data(meta.attrs['content'])
                except AttributeError :
                    pass
        
            if __name__=="__main__":
                username = "Systorm-OS Officiel"
                data = scrape_data(username)
                print(data)
            time.sleep(50)
        
        
        

        j'ai comme réponse "none", où est le problème ?

        0
      3. @quentin2121

        A la limite

        • si y avait un seul truc à corriger,
        • vu que c'est déjà posté,

        j'aurais mis mais là y a vraiment trop à faire. 

        Le script présent sur le topic de forum où tu l'as récupéré date de bien avant mai 2022 et la 4ème réponse était déjà bien explicite :

        "C'est généralement une très mauvaise idée de faire des requêtes de ce genre à des sites tels que Google/Facebook/etc. Tu peux essayer de regarder leur API. Eventuellement, tu peux aussi passer par 

        https://www.instagram.com/###USER_NAME###/?__a=1

        qui permet d'obtenir un JSON avec les informations que tu souhaites mais pas sûr que tu ne te fasses pas blacklister en l'utilisant trop souvent"

        Aparté, sur Powershell la commande 

        Invoke-WebRequest -Uri "https://www.instagram.com/blitzstream_officiel/?__a=1" -Method Get

        ne renvoie plus le nombre d'abonnés mais elle répond. Tu peux déjà te faire la main sur ce genre de commandes.

        Voici le site d'origine d'où provient le script que tu as récupéré. En bas, il mentionne être une traduction de ce site où le post date du 21 juillet 2021. Tente avec cette version, on peut être surpris. Autrement, je te laisse voir les liens présents au post #1 pour une approche plus pérenne et formatrice.

        Crois-bien qu'au premier refactor de la page Instagram tu vas abandonner le projet. Une MAJ du script suite à évolution d'API c'est 30min en lisant la doc.

        0
      4. @quentin2121

        Tiens au jus mais tu te bases là sur le lien de "Voici le site d'origine" où le scraping se base sur la page Instagram en 2021. Le Web scraping est régulièrement combattu à juste titre par les grands sites pour éviter des requêtes automatisées en masse ou du vol de contenu, entre autres.

        C'est une des raisons pourquoi je ne peux pas aider sur cette piste sur un forum public : ton script lancera peut-être une requête par jour quand un lecteur du forum, 3 ans après, lancera une requête chaque milliseconde.

        Je ne sais pas quel était le besoin mais si c'est pour ton compte dans un usage pro/semi-pro, monter de version offre d'autres possibilités qu'un accès API :-)

        Et à titre perso tu apprendras plus avec une API où cette connaissance est réplicable.

        0
    3. Modérateur

      Bonjour,

      J'omets tous les aspects liés aux clés et sur le scraping car luckydu43 a selon moi déjà dit tout ce qu'il y avait dire.

      As-tu regardé le paquet instaloader et plus particulièrement la fonction get_followers ?

      from instaloader import Instaloader
      
      USER = "ton_login_instagram"
      L = Instaloader()
      # Optionally, login or load session
      # L.login(USER, PASSWORD)        # (login)
      L.interactive_login(USER)      # (ask password on terminal)
      # L.load_session_from_file(USER) # (load session created w/
      #                               #  `instaloader -l USERNAME`)
      
      profile = Profile.from_username(L.context, USER)
      followers = profile.get_followers()
      print(followers)
      print(f"{len(followers)} followers")

      Bonne chance

      0
      1. C:\Users\quent\AppData\Local\Programs\Python\Python311\python.exe C:\Users\quent\PycharmProjects\pythonProject\instagram.py
          File "C:\Users\quent\PycharmProjects\pythonProject\instagram.py", line 14
            print(f"{len(followers) followers")
                                              ^
        SyntaxError: f-string: expecting '}

        Merci mamiemando,

        En 3 il faut indiquer son login insta ou laisser comme tu as indiqué ?

        0
      2. @quentin2121

        Bonjour

        , c'est une erreur de syntaxe fstring, pardonnable à mamiemando car écrit sans IDE mais un peu moins pour toi : développer n'est rien sans debugging :-)

        L'erreur dit "f-string: expecting '}" donc qu'il manque une accolade (ça te dit même où, quasi) :

        print(f"{len(followers)} followers")

        ... et je pense qu'il vaut mieux que tu essaies avec ton login --'

        1
      3. @luckydu43

        instagram' is not allowed to run in parallel

        Sous PyCharm avec mon login

        0
      4. @quentin2121

        A mon avis il y a un script précédent qui tourne. Faut voir la partie "run" si y a un truc lancé dans PyCharm.

        À défaut de trouver, tente un

        taskkill /f -im python.exe

        Si ça persiste, le process porte un autre nom : parcours avec tasklist -v (mets le CMD en grand écran pour mieux voir)

        0
      5. @luckydu43

        Dans Pycharm, il faut utiliser l'invite de commande CMD ou le terminal pour faire cette commande ?

        0
    4. Ah ah, Instagram se défend ^^

      Jusque là c'est bon signe que ça réponde. La troisième fois est normale, il y a une limite aux appels de ton programme.

      Tu peux utiliser une session unique pour faire tes appels, pour cela go documentation précisément le stockage de la session dans un fichier (y a 2 liens).

      Rapidement je vois ça, je te laisse corriger si besoin, je suis sur autre chose ^^

      L'exception c'est parce que ça peut la lever, par ex une question de droits d'accès en lecture/écriture au fichier de session généré

      import instaloader
      
      login = 'plume_quentique_du_mascaret'
      mdp = 'mdp'
      
      session_file = f"{login}.session"
      
      # Créer une instance d'Instaloader
      L = instaloader.Instaloader()
      
      try:
          L.load_session_from_file(session_file)
      except FileNotFoundError:
          L.context.username = login
          L.context.password = mdp
          L.context.do_login(L.context.username, L.context.password)
          L.save_session_to_file(session_file)
      
      # Charger le profil
      profile = instaloader.Profile.from_username(L.context, login)
      
      # Afficher le nombre de followers
      print(f"Le compte {login} a {profile.followers} followers.")

      Tiens au jus, comme d'hab


      0
      1. C:\Users\quent\AppData\Local\Programs\Python\Python311\python.exe C:\Users\quent\PycharmProjects\pythonProject\TAGRAM.py
        Traceback (most recent call last):
          File "C:\Users\quent\PycharmProjects\pythonProject\TAGRAM.py", line 12, in <module>
            L.load_session_from_file(session_file)
          File "C:\Users\quent\AppData\Local\Programs\Python\Python311\Lib\site-packages\instaloader\instaloader.py", line 635, in load_session_from_file
            with open(filename, 'rb') as sessionfile:
                 ^^^^^^^^^^^^^^^^^^^^
        FileNotFoundError: [Errno 2] No such file or directory: 'c:\\users\\quent\\appdata\\local\\temp/.instaloader-quent/session-plume_quentique_du_mascaret.session'

        During handling of the above exception, another exception occurred:

        Traceback (most recent call last):
          File "C:\Users\quent\PycharmProjects\pythonProject\TAGRAM.py", line 16, in <module>
            L.context.do_login(L.context.username, L.context.password)
            ^^^^^^^^^^^^^^^^^^
        AttributeError: 'InstaloaderContext' object has no attribute 'do_login'

        0
      2. @quentin2121

        Il y a eu 2 levées.

        La 2ème c'est un loupé de ma part en réécrivant le code, c'est login() et non do_login() , cf doc

        La première c'est la FileNotFoundError attendue, là encore logique de la lever à la première exécution vu qu'il n'a pas encore stocké la session dans le fichier.

        Comme j'ai dit, c'était une proposition rapide. Fallait aller plus loin qu'exécuter et attendre qu'on corrige --' Qu'avais-tu analysé de ton côté ?

        Voici une propale. Sois proactif dans ton code, c'est ton projet. Tu viens littéralement de pondre une stack trace sans la lire.

        import instaloader
        
        login = 'plume_quentique_du_mascaret'
        mdp = 'mdp'
        
        session_file = f"{login}.session"
        
        # Créer une instance d'Instaloader
        L = instaloader.Instaloader()
        
        try:
            L.load_session_from_file(session_file)
        except FileNotFoundError:
            L.context.login(login, mdp)
            L.save_session_to_file(session_file)
        
        # Charger le profil
        profile = instaloader.Profile.from_username(L.context, login)
        
        # Afficher le nombre de followers
        print(f"Le compte {login} a {profile.followers} followers.")
        
        0
      3. @luckydu43

        C:\Users\quent\AppData\Local\Programs\Python\Python311\python.exe C:\Users\quent\PycharmProjects\pythonProject\TAGRAM.py
        Traceback (most recent call last):
          File "C:\Users\quent\PycharmProjects\pythonProject\TAGRAM.py", line 12, in <module>
            L.load_session_from_file(session_file)
          File "C:\Users\quent\AppData\Local\Programs\Python\Python311\Lib\site-packages\instaloader\instaloader.py", line 635, in load_session_from_file
            with open(filename, 'rb') as sessionfile:
                 ^^^^^^^^^^^^^^^^^^^^
        FileNotFoundError: [Errno 2] No such file or directory: 'c:\\users\\quent\\appdata\\local\\temp/.instaloader-quent/session-plume_quentique_du_mascaret.session'

        During handling of the above exception, another exception occurred:

        Traceback (most recent call last):
          File "C:\Users\quent\PycharmProjects\pythonProject\TAGRAM.py", line 14, in <module>
            L.context.login(login, mdp)
          File "C:\Users\quent\AppData\Local\Programs\Python\Python311\Lib\site-packages\instaloader\instaloadercontext.py", line 304, in login
            raise TwoFactorAuthRequiredException("Login error: two-factor authentication required.")
        instaloader.exceptions.TwoFactorAuthRequiredException: Login error: two-factor authentication required.

        0
      4. @quentin2121

        Tu viens littéralement de pondre une stack trace sans la lire

        0
      5. @luckydu43

        Je ne comprends pas les erreurs lignes 12 et 14, j'ai bien activé la double authentification sur le site Instagram.

        0