Télécharger la source Pandora avec Java?


J'essaie de télécharger www.pandora.com/profile/stations/olin_d_kirkland HTML avec Java pour correspondre à ce que j'obtiens lorsque je sélectionne "afficher la source de la page" dans le menu contextuel de la page Web dans Chrome.

Maintenant, je sais comment télécharger le code source HTML de la page Web avec Java. Je l'ai fait avec downloads.nl et testé sur d'autres sites. Cependant, Pandora est un mystère. Mon but ultime est d'analyser les "Stations" d'un compte Pandora.

Plus précisément, je voudrais récupérer les noms de stations d'un site tel que www.pandora.com/profile/stations/olin_d_kirkland

J'ai essayé d'utiliser la bibliothèque selenium et le getter URL intégré en Java, mais je n'obtiens que ~4700 lignes de code alors que je devrais en obtenir 5300. Sans oublier qu'il n'y a pas de données personnalisées dans le code, ce que je recherche.

J'ai pensé que je n'attrapais pas le JavaScript ou ne laissais pas le JavaScript s'exécuter en premier, mais même si j'attendais qu'il se charge dans mon code, j'obtiendrais toujours le même résultat.

Si possible, je devrais avoir une méthode appelée 'grabPageSource ()' qui renvoie une chaîne. Il devrait renvoyer le code source lorsqu'il est appelé.


public class PandoraStationFinder {
    public static void main(String[] args) throws IOException, InterruptedException {
        String s = grabPageSource();
        String[] lines = s.split("\n\r");
        String t;
        ArrayList stations = new ArrayList();
        for (int i = 0; i < lines.length; i++) {
            t = lines[i].trim();
            Pattern p = Pattern.compile("<a href=\"/station/\\d+\">[\\w\\s]+</a>");
            Matcher m = p.matcher(t);
            if (m.matches() ? true : false) {
                Station someStation = new Station(t);
                stations.add(someStation);
                // System.out.println("I found a match on line " + i + ".");
                // System.out.println(t);
            }
        }
    }

    public static String grabPageSource() throws IOException {
        String fullTxt = "";
        // Get HTML from www.pandora.com/profile/stations/olin_d_kirkland
        return fullTxt;
    }
}

Ce n'est pas pertinent comment c'est fait, mais j'aimerais, dans le produit final, saisir une liste complète de TOUTES les chansons qui ont été appréciées par un utilisateur sur Pandora.

Author: Peter O., 2012-07-24

2 answers

Les pages Pandora sont fortement construites en utilisant ajax, tant de grattoirs luttent. Dans le cas que vous avez montré ci-dessus, en regardant la liste des stations, la page passe en fait par une demande secondaire à:

Http://www.pandora.com/content/stations?startIndex=0&webname=olin_d_kirkland

Si vous exécutez votre demande, mais pointer vers l'URL plutôt que le site principal, je pense que vous aurez beaucoup plus de chance avec votre grattage.

De même, pour accéder aux " j'aime", vous voulez cette URL: http://www.pandora.com/content/tracklikes?likeStartIndex=0&thumbStartIndex=0&webname=olin_d_kirkland

Cela retirera les pistes aimées par groupes de 5, mais vous pouvez parcourir les résultats en augmentant le paramètre 'thumbStartIndex'.

 4
Author: Erica, 2012-10-23 05:48:57

Pas une réponse exactement, mais j'espère que cela vous fera avancer dans la bonne direction:

Chaque fois que j'entre dans ce genre de chose, je me replie toujours sur un outil de surveillance HTTP. J'utilise Firefox, et j'aime vraiment l'extension Live HTTP Headers. Découvrez quels sont les en-têtes qui vont et viennent, puis adaptez vos requêtes http en conséquence. En tant que test de niveau le plus bas absolu, récupérez l'en-tête d'une demande réussie, puis envoyez - le au port 80 à l'aide de telnet et voir ce qui revient.

 2
Author: Kevin Day, 2012-07-30 02:42:04