6
votes

urllib2.urlopen va pendre pour toujours malgré le délai d'attente

J'espère que c'est une question assez simple, mais ça me rend fou. J'utilise Python 2.7.3 sur une installation hors de la boîte du serveur Ubuntu 12.10. J'ai continué à zoomer sur le problème jusqu'à ce que je suis arrivé à cet extrait:

import urllib2
x=urllib2.urlopen("http://casacinema.eu/movie-film-Matrix+trilogy+123+streaming-6165.html", timeout=5)


3 commentaires

J'ai le même problème. Apparemment, c'est un bug dans urllib2.


À une rare occasion, j'ai vu cela avec Python 2.6.x


Dans mon cas, c'était une question de pare-feu. Mon pare-feu local Lulu bloquait toutes les demandes de Python. Supprimer cette règle résolue cette question.


3 Réponses :


4
votes

On dirait que vous rencontrez la question du proxy. Voici une excellente explication sur la façon de travailler: Essayer d'accéder à Internet à l'aide d'Urllib2 à Python .

J'ai exécuté votre code sur mon Ubuntu avec Python 2.7.3 et n'ai vu aucune erreur. P>

aussi, envisagez d'utiliser Demandes : P>

import requests

response = requests.get("http://casacinema.eu/movie-film-Matrix+trilogy+123+streaming-6165.html", timeout=5)
print response.status_code


14 commentaires

Eh bien .. je n'ai pas configuré de proxy sur mon serveur ... Je ne suis pas sûr de ce que je dois faire .. Comment puis-je détecter la présence d'un proxy que je dois configurer?


Veuillez également noter que je suis sur un serveur Web avec une adresse IP publique, qui est correctement détectée de l'extérieur ..


Il réussit également à charger d'autres pages Web sans aucune difficulté. Seules certaines pages ne se chargeront tout simplement pas et pendent pour toujours ..


Merci. HM, d'abord voir si smth est dans http_proxy env variable ( Stackoverflow.com/questions/7338837/... ). Avez-vous essayé le code à l'aide de demandes ?


Oui, j'ai essayé votre code en utilisant des demandes et il est passé exactement comme l'autre. La variable http_proxy env est NULL sur mon système ...! Étrange, n'est-ce pas?


Oui. Veuillez essayer 2 choses plus: urllib2.urlopen ('http://google.com') et curl http://casacinema.eu/movie-film-matrix+trilogy+123+ Streaming -6165.html . Que vois-tu?


Urlopen sur Google lit la page immédiatement et sans problème, CURL est suspendu indéfiniment sans aucune sortie.


Ainsi, on dirait que la question n'est pas pertinente pour Python / Urllib. Vous ne pouvez tout simplement pas accéder à casacinema.eu à partir du bloc de pare-feu?


Je n'ai pas vraiment besoin de ça pour être chargé. Ce serait suffisant si, après un certain temps, Python a eu le temps de lancer une exception. Casacinema.eu n'était qu'un exemple de quelque chose de suspendu! Je veux juste qu'il arrête d'essayer après un moment et de continuer! Est-ce possible en quelque sorte? Il doit y avoir un moyen !!


Oui, je l'ai eu. Veuillez essayer de définir le délai d'attente via socket : prise d'importation; socket.setDefaulttimeout (5) .


Déjà fait! Ce n'est pas allé sur le temps d'attente de toute façon. En fait, il fait du temps sur tout autre système (sur mon ordinateur portable, mais pas sur mon serveur.


Je vais fou de ça.


@Matteomonti Avez-vous trouvé votre problème?


UHMM Oui, je pense que je l'ai fait, mais qu'il y a deux ans, je ne me souviens vraiment pas de la façon dont! Désolé pour ça..



1
votes

L'affiche originale indiquait qu'ils ne comprenaient pas pourquoi cela se bloquerait, mais ils souhaitaient également un moyen de garder urllib.request.urlopen de la suspension. Je ne peux pas dire comment le garder de la suspension mais si cela aide quelqu'un c'est pourquoi il peut accrocher.

Le python-urllib / 3.6 est difficile. Il s'attend, par exemple, le serveur de retourner http / 1.1 200 ok pas http 200 ok ok . Il s'attend également à ce que le serveur ferme la connexion lorsqu'il envoie une connexion : fermer dans les en-têtes.

Le meilleur moyen de diagnostiquer ceci est d'obtenir la sortie RAW de la réponse du serveur et de le comparer avec une autre réponse de serveur que vous connaissez fonctionne. Ensuite, si vous devez créer un serveur et manipuler la réponse pour déterminer exactement quelle différence est la cause. Peut-être que cela peut mener au moins de changer sur le serveur et de lui permettre de ne pas suspendre.


0 commentaires

1
votes

peut essayer d'utiliser socket.setDefaulttimeout (5) comme alecxe suggérées.

Plus de détails dans URLLIB2 DOC

Sockets et couches

Le support Python pour récupérer des ressources à partir de la bande est superposé. URLLIB2 utilise la bibliothèque HTTPLIB, qui utilise à son tour la bibliothèque de socket.

AS de Python 2.3 Vous pouvez spécifier la durée pendant laquelle une prise doit attendre une réponse avant de terminer une réponse. Cela peut être utile dans des applications qui doivent chercher des pages Web. Par défaut, le module de socket n'a pas de délai et peut accrocher. Actuellement, le délai d'attente de socket n'est pas exposé aux niveaux HTTPLIB ou URLLIB2. Cependant, vous pouvez définir le délai d'attente par défaut globalement pour toutes les prises utilisant xxx


0 commentaires