URL openStream

Résolu/Fermé
fred - 26 nov. 2014 à 23:36
 fred - 27 nov. 2014 à 20:05
Salut la gang, j'aimerais savoir pourquoi ce code que tout le monde connaît ne marche pas pour ces liens "http://www.stl.laval.qc.ca/fr/horaires-et-trajets/autobus/stl/" et "http://www.stl.laval.qc.ca/fr/horaires-et-trajets/autobus/stl/choisissez-une-ligne-pour-connaitre-la-grille-horaire-complete/?route_id=31N" mais il marche pour "http://www.stl.laval.qc.ca".
Bref, c'est pour un travaux pratique, il faut que je lit tous les circuits sur le premier lien et les rajoutent au deuxième et après faire des traitement de données sur les horaires.

URL SiteWeb = new URL (URLlignes);

BufferedReader in = new BufferedReader(new InputStreamReader(SiteWeb.openStream()));

String ligne;

while ((ligne = in.readLine()) != null)
{
System.out.println(ligne);
}

Pourtant je suis capable de lire le code source et presque tous les liens sur ce site marche, sauf les deux que j'ai besoin!!??.
J'ai passé 3 heures à chercher et faire le debug sur netbeans. Dans le fond pour les deux liens que je vous ai mentionné plus haut, le programme de rentre pas dans la boucle while parce que ligne = null donc il n'y a rien dans le buffer.

Merci

2 réponses

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
Modifié par KX le 27/11/2014 à 08:15
Bonjour,

Il va falloir faire un code un peu plus long pour simuler plus précisément la requête HTTP, en particulier parce que ce que te renvoie le site dépend de ton navigateur web, donc si tu ne lui précises pas au minimum le header HTTP
User-Agent : Mozilla
il sera impossible pour le serveur de t'envoyer quoi que ce soit.

Regarde du côté de la classe HttpURLConnection pour faire ça en Java.
La confiance n'exclut pas le contrôle
0
ok merci, je vais regarder ça!
0
ok mais pourquoi le premier code marche sur ce site avec d'autres liens mais pas les deux que j'ai besoin?
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
27 nov. 2014 à 19:57
La plupart des sites ne changent pas leur contenu en fonction des navigateurs, ou alors ils ont un comportement par défaut, mais ici le serveur PHP n'arrive pas à s'en sortir, ça peut être un choix de sécurité pour éviter que des robots aillent requêter le site (qui est typiquement ce que tu essayes de faire avec Java).

Remarque : maîtriser les headers des requêtes/réponses permettent de faire des opérations un peu complexe, comme se connecter avec un login/mot de passe, récupérer la session, etc.
0
WOW merci 1000 x , j'ai fait ce code inspirer de d'autre programmeur

URL SiteWeb = new URL(URLlignes);
HttpURLConnection conn = (HttpURLConnection) SiteWeb.openConnection();

conn.setReadTimeout(5000);
conn.addRequestProperty("User-Agent", "Mozilla");

String ligne;

BufferedReader in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));

while ((ligne = in.readLine()) != null)
{

System.out.println(ligne);
}
0
J'ai oublié de vous dire que pour ces deux liens in.ready() = false, donc le buffer n'est pas près pour être lu. Avec un peu de recherche, j'ai vu que bufferReader contient un tableau de char de 8192 espaces. Dans le code source de mes deux lien, il y a des lignes avec plus de 27 000 caractères. J'ai donc augmenter la taille du buffer:
BufferedReader in = new BufferedReader(new InputStreamReader(SiteWeb.openStream()),30000);
mais le problème persiste, toutes mes lignes = null. Je ne vois vraiment pas ou est le problème parce que ce code marche sur tous les sites que j'ai testé.
0