Nombre d'abonnés YouTube

Bonjour, excusez-moi de vous déranger, je souhaite créer une liste automatique du nombre d'abonnés de chaînes YouTube, mais je ne parviens pas à récupérer ces données. Je viens de passer à Excel 2019, espérant que la version d'importation Web soit plus optimisée, mais contrairement à Excel 2016 où toutes les zones de textes étaient importées, plus aucune donnée ne l'est dans cette version...

Comment pourrais-je faire pour obtenir ce nombre d'abonnés ? Je précise que je suis novice en VBA, mais ai des connaissances en programmation, donc pourrais essayer d'adapter un code par exemple.

En vous remerciant par avance pour votre aide,

Killian Bourhis

Bonjour,

As-tu une URL à nous communiquer ?

Cdlt.

Merci pour ta réponse

Pas moyen d'ajouter un lien car je suis nouveau... Par exemple, la page d'accueil de la chaîne d'Excel Pratique.

Bonjour,

Ajoute le remplaçant le point pra [point] et @ par [arobase] avec des blancs autour par exemple ...

Voici la page sur laquelle je souhaite récupérer le nombre d'abonnés :

Impossible de récupérer sans simuler un navigateur (youtube teste le requéreur et envoie une réponse différenciée !).

Pas très stable à mon avis ...

44youtube.xlsm (20.71 Ko)

Peut-être pas très stable, mais fonctionne parfaitement à première vue. Un énorme merci ! Très gentil d'avoir créé cette macro pour moi, que je suis en train d'analyser, et que je vais essayer ajuster. C'est vrai qu'assez souvent, il la copie de la page ne se fait pas, peut-être ajouter un délai ?

Je ne connaissais pas du tout cette méthode de passer par l'ouverture d'un navigateur, et ça risque de me servir !

PS : Pourquoi cela désactive mon pavé numérique ?

Alors, après avoir analysé et ajouté 2/3 lignes, je suis confronté à quelques problèmes, mais ça part bien.

Premièrement, est-ce que je peux te demander de me détailler les quelques lignes suivantes, que je n'arrive pas à comprendre intégralement (principalement, car je ne connais pas les objets) :

Do Until .ReadyState = 4 And .Busy = False:  DoEvents:  Loop
Do: Loop Until .ReadyState = "complete"                Debug.Print "ok"
Resultat = .GetText(1)
If InStr(1, Resultat, "abonner") = 0 Then
Cells(ligne, 2) = Split(Split(Resultat, "abonner")(1), "  ")(0)

Cette ligne m'intéresse particulièrement, car je souhaiterais éventuellement récupérer le nombre de vues du youtubeur. Il faudrait donc récupérer les chiffres placés avant le terme "_vues".

Si je souhaite réaliser cette macro, c'est parce que je veux obtenir les statistiques de plusieurs chaines. J'ai ajouté une boucle pour que la macro s'exécute sur plusieurs pages, mais les résultats sont assez aléatoires, car la macro colle le presse papier avant même que la page ait eu le temps de charger. C'est également probablement pour ça que je reçois régulièrement le message d'erreur. Que faudrait-il ajouter pour attendre le chargement de la page ?

Il y a également le problème que le pavé numérique se désactive à chaque exécution, ainsi que la lenteur de l'exécution, mais ça, je ne crois pas qu'on y puisse grand chose...

Merci d'avance pour ta réponse.

12youtube.xlsm (20.18 Ko)

YouTube détecte le logiciel qui l'a appelé et s'adapte en conséquence. Si on fait un appel classique,

function isGecko() {if (!w.navigator || !w.navigator.userAgent) {return false;}
var ua = w.navigator.userAgent;
return ua.indexOf('Gecko') > 0 &&ua.toLowerCase().indexOf('webkit') < 0 &&ua.indexOf('Edge') < 0 &&ua.indexOf('Trident') < 0 &&ua.indexOf('MSIE') < 0;}
if (isGecko()) {var isHidden = (d.visibilityState || d.webkitVisibilityState) == 'hidden';
if (isHidden) {ytcsi.tick('vc');}
}

et ne donne rien si ce n'est pas un navigateur "classique".

Il est donc indispensable de simuler le navigateur pour récupérer la donnée.

Je suis allé au plus simple avec IE (d'ailleurs YouTube signale qu'il est bientôt obsolète), mais on pourrait lancer un autre navigateur. Mais ce sera toujours long et quelque peu aléatoire. C'est la pire méthode pour récupérer des données mais parfois (et de plus en plus souvent) c'est la seule que j'ai trouvée.

J'avoue que je ne sais pas pourquoi le pavé numérique se désactive (je n'en ai pas !) car aucune instruction dans le code n'agit dessus.

        Do Until .ReadyState = 4 And .Busy = False:  DoEvents:  Loop
        With .Document
            Do: Loop Until .ReadyState = "complete"
            Debug.Print "ok"
        End With

permet de détecter quand la page a été chargée complètement (code que j'ai récupéré, je ne peux pas en dire plus mais cela fonctionne)

à suivre page suivante

    With obj
        ' récupération dans obj du press papier
        .GetFromClipboard
        ' extraction du texte de l'objet
        Resultat = .GetText(1)
        ' test pour savoir si le texte "abonner" s'y trouve car c'est un critère de recherche
        If InStr(1, Resultat, "abonner") = 0 Then
            MsgBox "Impossible de décoder le presse-papier; assurez vous d'avoir bien copié la page internet adhoc !"
            Exit Sub
        End If
        Cells(1, 2) = Split(Split(Resultat, "abonner")(1), "  ")(0)
    End With

Pour la fonction split https://docs.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/split-function

Split découpe un texte selon le critère et produit un tableau qui va de 0 à n éléments. Si je veux savoir ce qu'il y a juste après le critère je vais donc prendre l'indice 1

Split(Resultat, "abonner")(1)

Je peux ensuite redécouper cet élément de texte et retenir ce qui est avant un second critère

Split(_______________, "  ")(0)

On peut donc écrire :

Sub test()
    texte = "AAATGD-ERTH@FGHJ"
    MsgBox Split(Split(texte, "-")(1), "@")(0) ' donne ERTH
End Sub

Si on veut être plus puriste, il faudrait lancer un navigateur plus moderne (chrome ou firefox), récupérer le code source de la page et le json window["ytInitialData"] qui se trouve ici :

capture d ecran 542
Rechercher des sujets similaires à "nombre abonnes youtube"