IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Requête web génère erreur 401 mais pas l'URL directement dans le navigateur


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut Requête web génère erreur 401 mais pas l'URL directement dans le navigateur
    Bonjour,
    J'essaye de récupérer par le code un fichier texte produit par une API :
    https://www.boursorama.com/bourse/ac...bol=0P0000VHMO

    Si je saisis cette URL directement dans le navigateur, un fichier texte est automatiquement enregistré dans mes "téléchargements"

    Si je le fais par le code, cela me génère une erreur 401.

    Voici le code Python que j'ai essayé (parmi d'autres) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import requests 
     
    url = 'https://www.boursorama.com/bourse/action/graph/ws/download?length=1825&period=1&symbol=0P0000VHMO'
     
     
    header = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"}
    response = requests.get(url,headers=header)
    print (response)
    J'ai essayé de spécifié des headers, et même de façon aléatoire, mais cela ne marche pas.

    Je pense qu'il faut spécifier un cookie mais là je ne sais pas trop comment faire. J'ai cherché sur le net et j'ai trouvé des codes qui résolvent des situations pour d'autres API mais aucun tuto qui permette de les comprendre pour les adapter à mon cas présent

    En utilisant l'inspecteur du navigateur, j'ai trouvé que cette requête web utilise un cookie dans les request headers mais je ne suis pas assez calé pour savoir comment lui générer ce cookie par le code. J'ai bien tattoné avec ceci mais le cookie_dict renvoie une chaine nulle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import requests 
     
    url = 'https://www.boursorama.com' #/bourse/action/graph/ws/download?length=1825&period=1&symbol=0P0000VHMO'
    s = requests.Session()
     
    header = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"}
    response = s.get(url,headers=header)
    cookie_dict = s.cookies.get_dict()
    print(cookie_dict)
    Bref, si vous pouvez m'aider à trouver la solution, voire mieux, m'orienter vers un tuto qui permette de trouver la solution adaptée à n'importe quelle API, ce serait super.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 714
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 714
    Points : 31 026
    Points
    31 026
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par noftal Voir le message
    Si je saisis cette URL directement dans le navigateur, un fichier texte est automatiquement enregistré dans mes "téléchargements"
    Pas chez-moi. Moi j'ai "non authorized"

    Citation Envoyé par noftal Voir le message
    Si je le fais par le code, cela me génère une erreur 401.
    Coïncidence, c'est aussi le même numéro chez-moi.

    Citation Envoyé par noftal Voir le message
    Je pense qu'il faut spécifier un cookie mais là je ne sais pas trop comment faire
    Ce n'est pas à toi de mettre des cookies, ceux-ci sont positionnés par le site web (qui les connait et qui sait lesquels il doit avoir)

    Citation Envoyé par noftal Voir le message
    Bref, si vous pouvez m'aider à trouver la solution, voire mieux, m'orienter vers un tuto qui permette de trouver la solution adaptée à n'importe quelle API, ce serait super.
    La base: il faut d'abord que ça fonctionne chez-toi, que ça fonctionne sans tout ton historique et cookies mis en cache. Mets toi dans un navigateur en mode "sans echec", ou bien prend un profil vierge ; comme ça tu n'auras pas ton historique, et là tu peux faire tes tests.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    Ah ben là je suis sec. Je confirme que l'API marche bien dans mon naivgateur (que ce soit sous Firefox 115.9.1 ESR ou Chrome 109.0.5414.120. Est-ce parce que je n'ai pas les dernières versions (je sais c'est pas bien mais je n'ai pas le choix à cause de Win7)

    Je ne vois pas très bien ce que le profil de mon navigateur va jouer dans mon code qui s'affranchit du navigateur. Donc que je vide le cache ou non, ou que je parte sur un nouveau profil de navigateur ou non, quelle influence sur le code ?

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 714
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 714
    Points : 31 026
    Points
    31 026
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par noftal Voir le message
    Je ne vois pas très bien ce que le profil de mon navigateur va jouer dans mon code qui s'affranchit du navigateur. Donc que je vide le cache ou non, ou que je parte sur un nouveau profil de navigateur ou non, quelle influence sur le code ?
    Cette remarque partait du principe que si ça fonctionne chez-toi et pas chez-moi (et je viens de réessayer depuis un autre ordi), c'est que tu dois avoir une espèce d'historique, de cache ou autre qui font que ça marche dans ton navigateur et seulement dans celui-ci (donc pas dans les autres navigateurs et à fortiori pas dans ton code). Mais quand je l'ai faite, je n'avais pas connaissance que tu avais une version obsolète. Effectivement cette nouvelle information peut rendre cette remarque caduque.

    Citation Envoyé par noftal Voir le message
    Est-ce parce que je n'ai pas les dernières versions (je sais c'est pas bien mais je n'ai pas le choix à cause de Win7)
    Ca pourrait jouer. En général c'est plutôt l'inverse : ça fonctionne avec les dernières versions et pas avec les précédentes cause dialogue incompatible mais peut-être que là le site n'a pas activé de verrou contre une vieille version et donc là ça fonctionne avec une vieille version et pas avec une récente (et donc pas non plus avec requests).

    Ok tu as win7 et tu as tes raisons (que je peux comprendre, moi j'imagine pas passer sous W11 quand W10 ne sera plus maintenu en 2025) mais tu as d'autres façons de tester. Par exemple tu télécharges un Linux (je conseillerais XUbuntu assez complet), tu le mets sur clef, tu démarres dessus et là il te propose "Try or Install" te permettant de tester sans installer. Ca t'amène dans un environnement fenêtré avec divers outils dont un navigateur.
    Et là tu peux tester ton site avec une version de navigateur relativement récente
    Nom : VirtualBox_linux_initiation_11_04_2024_16_23_22.png
Affichages : 109
Taille : 107,2 Ko
    Nom : VirtualBox_linux_initiation_12_04_2024_11_09_41.png
Affichages : 109
Taille : 115,3 Ko
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 140
    Points : 4 538
    Points
    4 538
    Par défaut
    bonjour

    le scraping n'est autorisé que si le site le permet, ici la réponse (401) est claire : ils considèrent que c'est du vol !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     curl -IL 'https://www.boursorama.com/bourse/action/graph/ws/download?length=1825&period=1&symbol=0P0000VHMO'
    location: https://api.boursorama.com/services/api/files/download.phtml?token=7fe238d3ab74533dd6933571d148271cd38c4e35e61478e2379bd3bb4cc2d20c
     
    HTTP/1.1 401 V Not Authorized
    la redirection est claire, il faut un token (clé sécurisée)
    Je suppose que tu n'as pas cette erreur dans ton navigateur car tu as un compte chez eux et que tu es loggé ? (voir alors selenium)

    A noter que ce site propose des api pour ces clients et existe de nombreuses api (non liées à ce site) pour suivre un produit en bourse (yfinance,...)
    $moi= ( !== ) ? : ;

  6. #6
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    @Papajoker : non je n’ai pas de compte quand je lance cette URL dans mon navigateur.

    S’ils considéraient cela comme du vol l’URL ne fonctionnerait pas dans mon navigateur

  7. #7
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 857
    Points : 7 176
    Points
    7 176
    Par défaut
    Bonjour,

    Citation Envoyé par noftal
    Je reste un peu frustré car je suis incapable de comprendre comment vous avez fait.
    J'ai pas suivi la conversation, mais il semble qu'ils ont juste ajouter l'information des cookies par rapport à votre code présenté au départ...

    Est-ce que le code que vous présentez au départ a été créé par vos soins ? Car le code de @jurassic est très proche du vôtre !

    Citation Envoyé par noftal
    Ou m'orienter vers un tuto qui explique ?
    Regardez le tuto sur le module requests... sur google rien de compliqué, utilisez les mots clés requests python et vous y serez dirigé.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  8. #8
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    Bonjour,
    Oui le code initial est de moi.
    La différence apportée par jurassic pork est l'ajout de l'instruction sur les cookies. Ca change tout !
    Est-ce que l'instruction pour "accepter les cookies" est toujours du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cookie = dict(PHPSESSID='blabla...')
    ou bien cela dépend-il du site ? Et dans ce cas comment savoir ?

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 714
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 714
    Points : 31 026
    Points
    31 026
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par noftal Voir le message
    Du coup je me demande comment Jurassic Pork a trouvé que cette instruction supplémentaire marcherait.
    ...
    Est-ce que l'instruction pour "accepter les cookies" est toujours du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cookie = dict(PHPSESSID='blabla...')
    ou bien cela dépend-il du site ? Et dans ce cas comment savoir ?
    Cette instruction ne crée pas un cookie, ça crée juste un dictionnaire Python. Mais comme ce dictionnaire aura pour but d'être traité "comme" un cookie, Jurassic Pork l'a (assez intelligemment) appelé "cookie".

    Ensuite il a vu que la doc "request()" contenait un paramètre nommé "cookies". De là, faire une association d'idées...

    Le seul truc en fait à connaître, c'est que le cookie du site se nomme "PHPSESSID". Ou peut-être pas (papajoker, lui, crée un cookie nommé "x" et il dit que le nom semble n'avoir pas d'importance). Donc tu peux tenter avec cookie = dict(toto='zero+zero') et tu verras bien si ça fonctionne.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    Effectivement, dans le cas présent, je peux remplacer PHPSESSID par n'importe quoi et ça marche quand même
    Peut-être une faiblesse du site ?
    Et s'il fallait absolument reprendre le bon nom de cookie, est-ce que la méthode consiste bien à utiliser l'outil de développement, réseau, onglet "Cookie" et noter le nom du cookie ?
    Quand je fais cela, je trouve ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    {
    	"Cookies de la requête": {
    		"cookie_privacy_gdpr": "1",
    		"RT": "\"z=1&dm=boursorama.com&si=dfb1b8fc-429c-4921-bbd4-3527f8183754&ss=lv1zgqoe&sl=i&tt=cxi&bcn=/bucky/v1/send/&obo=1&ld=hql4&ul=j0f5&hd=j0is\""
    	}
    }'
    Est ce que c'est "RT" ou "cookie_privacy_gdpr" ou les deux qu'il faut mettre à la place de PHPSESSID ?

  11. #11
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 140
    Points : 4 538
    Points
    4 538
    Par défaut
    Citation Envoyé par noftal Voir le message
    Peut-être une faiblesse du site ?
    Pourquoi parler de faiblesse ? Il est clair que cette api n'a aucun contrôle (c'est justement pour cela que j'ai donné le code !). Il existe des milliers d'api publiques sur le web, il n'y a rien d'extraordinaire
    Pour les api non publiques, il faut un compte et un token nous sommes alors dans une problématique complètement différente (api github par exemple)

    Citation Envoyé par noftal Voir le message
    il faut mettre à la place de
    Dans mon exemple, une fois j'ai juste mis x=.. et une autre y=.. pour justement montrer que cela n'a aucune incidence. Pourquoi tu cherches des complications ? Cette api n'attend strictement rien, juste que l'api puisse lire les cookies, il faut donc créer "une base de donnée" locale liée à ce site. Pour la créer, j'ai juste créé une clé bidon.

    Tes questions n'ont aucun rapport avec python ! Perso j'ai utilisé curl pour tester cette url, il n'y avait certainement pas besoin d'un langage de programmation pour ta demande.
    Existe des forums sur la le techno web si tu as des questions
    $moi= ( !== ) ? : ;

  12. #12
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 857
    Points : 7 176
    Points
    7 176
    Par défaut
    Bonjour,

    Citation Envoyé par noftal
    ou bien cela dépend-il du site ? Et dans ce cas comment savoir ?
    Oui les cookies dépendent du site, il faut donc lire la doc sur l'API de Boursorama pour savoir qu'il y a ce besoin.

    Concernant le format dict, dans la documentation de requests, vous avez des exemples... Prenez le temps de lire les documentations et faire vos propres tests.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  13. #13
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Bonjour,



    Oui les cookies dépendent du site, il faut donc lire la doc sur l'API de Boursorama pour savoir qu'il y a ce besoin.
    .
    J'ai souvent lu cela sur internet. Mais justement, et c'est bien le problème, je ne sais plus comment j'ai trouvé cette API. J'ai fait des recherches pour trouver la doc mais je ne l'ai pas trouvée.
    Du coup je me demande comment Jurassic Pork a trouvé que cette instruction supplémentaire marcherait.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 30/09/2015, 14h51
  2. [Web Service] Erreur 401.3 lors de l'accès à mon service web
    Par [DreaMs] dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 07/05/2010, 11h18
  3. Réponses: 2
    Dernier message: 15/12/2009, 08h55
  4. [Web Service] Acces Localhost mais pas NomMachine
    Par le_sonic dans le forum Services Web
    Réponses: 6
    Dernier message: 19/01/2009, 13h49
  5. Web Service Erreur 401
    Par Bal1n dans le forum Services Web
    Réponses: 2
    Dernier message: 03/11/2008, 10h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo