Attendre pour le succès de la réponse de l'Appel d'API
Je suis en utilisant des Api Yahoo, j'ai mis en œuvre aléatoire de la méthode sleep en plus de cela, j'ai ajouté dur dort encore, mais je suis incapable de comprendre comment je peux juste attendre ou essayer de nouveau si je ne reçois pas une réponse à la première tentative.
Pour un exemple du code que j'ai mis ci-dessous, ne parvient pas à certains utilisateurs, totalement au hasard. Suite à l'échec je prends l'url dans mon navigateur et il fonctionne comme un charme. Donc ma questions est: pourquoi? et Comment puis-je résoudre ce problème? ou puis-je améliorer ce code pour faire une autre demande après une dure de sommeil (Seulement si c'est une bonne approche)
J'ai quelques informations qui j'ai oublié d'ajouter, j'ai changé le code pour obtenir mon http code de réussite:
print urlobject.getcode()
et il retourne à 200, mais pas de json, comme certains l'ont suggéré que ce pourrait être l'accélérateur.
Note: j'ai supprimé mon appid(Clé) à partir de l'url
# return the json question for given question id
def returnJSONQuestion(questionId):
randomSleep()
url = 'http://answers.yahooapis.com/AnswersService/V1/getQuestion?appid=APPIDREMOVED8&question_id={0}&output=json'
format_url = url.format(questionId)
try:
request = urllib2.Request(format_url)
urlobject = urllib2.urlopen(request)
time.sleep(10)
jsondata = json.loads(urlobject.read().decode("utf-8"))
print jsondata
except urllib2.HTTPError, e:
print e.code
logging.exception("Exception")
except urllib2.URLError, e:
print e.reason
logging.exception("Exception")
except(json.decoder.JSONDecodeError,ValueError):
print 'Question ID ' + questionId + ' Decode JSON has failed'
logging.info("This qid didn't work " + questionId)
return jsondata
- Ce serait formidable, si vous allez ajouter l'exact du message d'échec de l'
- WOW Merci pour les nombreuses FANTASTIQUE bonnes réponses!. Je vais essayer un de mettre en œuvre l'un de ceux et de voir. Je n'ai aucune idée de la réponse, je devrait choisir ils sont tous brillamment expliqué plein d'espoir à tous les votes.
Vous devez vous connecter pour publier un commentaire.
Alrighty, d'abord, quelques points qui ne sont pas directement répondre à votre question, mais peut être utile:
1) je suis assez sûr il n'y a jamais besoin d'attendre entre un appel urllib2.urlopen et la lecture de l'retourné addinfourl objet. Les exemples à http://docs.python.org/library/urllib2.html#examples ne comportent pas de tels sommeil.
2)
peut être simplifié à juste
qui est plus simple et plus lisible.
Fondamentalement, .la charge prend un fichier-comme l'objet que d'un argument, alors que la .charges prend une chaîne de caractères. Vous avez peut-être pensé qu'il était nécessaire de lire() les données de la première dans l'ordre de décodage du format utf-8, mais ce n'est en fait pas de problème, parce que .charge suppose par défaut que l'objet c'est de la lecture est de l'ascii ou utf-8 (voir http://docs.python.org/library/json.html#json.load).
3) Il ne peut pas d'importance pour votre présent, mais j'avais l'égard de votre gestion des exceptions ici aussi mauvais. Si quelque chose se passe mal lors de la "essayez:" à bloc, puis la variable jsondata n'aura pas été affecté. Puis, quand nous essayons de le retourner après la fin des blocs try/except, un NameError sera porté en essayant d'utiliser la non attribuées à la variable. Cela signifie que si une autre fonction dans votre application appelle returnJSONQuestion et une exception se produit, alors il sera un NameError, et non pas l'exception d'origine, que la fonction externe voit, et tout un retraçage de la fonction externe génère la volonté de ne pas pointer vers l'endroit où le réel problème est survenu. Cela pourrait facilement causer de la confusion quand à essayer de comprendre ce qui a mal tourné. Il serait préférable, par conséquent, si tous vos 'a l'exception des" blocs ici fini avec la "relance".
4) En Python, c'est une bonne idée de mettre des commentaires en disant qu'une fonction n'a que des docstrings (voir http://www.python.org/dev/peps/pep-0257/#what-is-a-docstring) plutôt que comme des commentaires ci-dessus la fonction.
De toute façon, à effectivement répondre à votre question...
Vous pouvez obtenir une apparence aléatoire URLError lorsque vous essayez d'ouvrir une URL pour toutes sortes de raisons. Peut-être il y avait un bug sur le serveur lors de la manipulation de votre demande; peut-être il y avait un problème de connexion et de certaines données abandonnée; peut-être que le serveur était down pendant quelques secondes tandis que l'un de ses administrateurs changé un paramètre ou poussé une mise à jour; peut-être quelque chose d'autre entièrement. J'ai remarqué après avoir fait un peu de développement web que certains serveurs sont beaucoup plus fiables que d'autres, mais je me figure que, pour la plupart du monde réel fins, vous n'avez probablement pas besoin de s'inquiéter au sujet de pourquoi. La chose la plus simple à faire est juste de réessayer la demande jusqu'à ce que vous réussissiez.
Avec tout ce qui précède à l'esprit, le code ci-dessous va probablement faire ce que vous avez besoin de:
Espérons que cette aide! Si vous allez faire beaucoup de différentes requêtes web dans votre programme, vous aurez probablement envie de résumé de cette relance de la demande sur l'exception logique en fonction de quelque sorte que vous n'avez pas besoin d'avoir le passe-partout logique de nouvelle tentative mélangé avec d'autres choses. 🙂
Je ne connais pas le motif de l'échec, ce serait un Yahoo limites de la limitation (ou peut être pas), mais en fait, c'est une bonne idée pour sauver la question des id, ce qui cause d'échec et de réessayer plus tard.
Cela pourrait être facile. Fonction modifier un peu:
Et dans tous les cas d'échec cette fonction retournera vous Aucun. Ainsi, vous pouvez vérifier le résultat, et si Aucun magasin id question dans certains liste, puis essayez de nouveau d'environ 3 fois. Il sera peut-être plus de chance une deuxième fois.
Bien sûr, vous pouvez également modifier la fonction si, il réessayer demande quelques fois simultanément sur erreur, mais la première solution est préférable pour moi.
BTW, paramètre 'User-Agent' en-tête à une véritable navigateur de valeur généralement aussi une bonne idée dans de tels cas, par exemple, Google ne retourne pas de résultats dans de nombreux cas de "robo-analyseurs"
J'ai couru dans les questions de ce genre beaucoup. J'ai l'habitude de mettre en œuvre ma demande d'API wrapper ou navigateur "get", comme ceci:
basé sur l'url ou la tentative, je vais aussi changer la demande params. par exemple, certains sites de bloc Python identifié les navigateurs, donc je vais l'échanger par l'agent de l'utilisateur pour Firefox s'ils correspondent à une expression régulière. sinon: si quelque chose échoue à la première tentative, je pourrais toujours essayer Firefox/Safari sur la deuxième demande, ou de mettre en œuvre de façon aléatoire un délai entre les tentatives ultérieures.