J'ai un peu regardé le truc avec un proxy (Burp) pour voir ce qui passait.
La requête pour valider le formulaire est en GET, donc je te conseille de commencer par là pour essayer de comprendre le mécanisme. Plus précisément tu fais la première recherche sur l'URL suivante :
http:/www.voyages-sncf.com/vsc/train-ticket/directSearchTravel
Ensuite cela te redirige sur la page :
billet-train/recherche-en-cours?hid=<id>
puis finalement sur
billet-train/resultat?hid=<id_bis>
Donc en détail si tu regardes ta réponse (statut code 302) pour la première requête tu as une redirection comme tu le disais et le header Location qui va te pointer vers une URL du genre /billet-train/recherche-en-cours?hid=ID. Tu as juste à reproduire une requête vers cette URL.
Si on se penche sur requests ; requests réalise les redirections automatiquement et tu peux voir l'historique de redirection avec r.history
(détail ici). Donc ce qu'il va falloir que tu gères c'est le passage entre l'étape 2 et 3 qui correspond à la jolie barre d'attente quand tu es sur le site de voyages-scnf.
Du coup, je ne sais pas précisément comment tu peux gérer l'attente entre l'étape 2 et la 3, mais ça fonctionne la même manière, je pense que la manière brute fonctionne : envoyer une première requête pour dire que tu veux les résultats puis tu attends un peu, puis tu redemandes pour voir si la réponse est une 302.
J'espère que je suis clair. Sinon pour ce genre de truc je pense que Scrapy pourrai t'aider énormément, notamment pour le crawling ensuite.