Je suis en train de créer un bot D&D qui télécharge les feuilles de personnage de DnDBeyond. Malheureusement, la tentative de téléchargement du fichier json pour un personnage accessible au public renvoie une erreur 403.
J'essaye de télécharger cette feuille de personnage: https://www.dndbeyond.com/characters/22738330/json
qui est accessible au public et devrait renvoyer un fichier json.
J'ai utilisé le code suivant:
import requests url = "https://www.dndbeyond.com/characters/22738330/json" response = requests.get(url) print(response.json())
Ce qui continue de renvoyer une erreur 403 malgré le fait que je suis capable de charger le personnage sur mon navigateur en cliquant simplement dessus. Où vais-je mal?
3 Réponses :
Ce site protégé par https://www.perimeterx.com/whywasiblocked/
Il détecte que vous n'êtes pas un utilisateur réel et vous refuse l'accès. vérifiez la sortie de response.text
dans votre script.
Comment trouvez-vous que le site est protégé par PerimeterX?
vérifiez la sortie de response.text dans votre script: ... Propulsé par <a href=" perimeterx.com/whywasiblocked"> PerimeterX </ a > ...
Essayez d'ajouter un User-Agent valide et d'autres en-têtes pour donner l'impression que vous accédez via un navigateur.
Quelque chose comme ça:
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3835.0 Safari/537.36', 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Host':'www.dndbeyond.com', 'Accept-Language': 'en-US,en;q=0.5', 'Accept-Encoding': 'gzip, deflate', 'Upgrade-Insecure-Requests': '1', 'Connection': 'close' } response = requests.get(url, headers=headers)
Cela ne télécharge que le HTML, pas le JSON. Mais c'est un début.
Pour accéder au json, vous devez supprimer le pluriel sur le composant de chemin "caractères".
En ce qui concerne le format des données, j'ai presque terminé d'étoffer toute la structure.
La source Objective-C inclut toutes les définitions de classe.
Combien de fois avez-vous exécuté ce script? Le site Web peut vous refuser une utilisation excessive.
En outre, les URL dans le corps de la question et l'exemple de code ne correspondent pas. L'URL de code n'a pas
/json
à la fin.Ajoutez des en-
headers
dans votre script. cette URL renvoie des donnéesHTML
, utilisez donc response.content.