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

Réseau/Web Python Discussion :

Lever les erreurs sur le socket


Sujet :

Réseau/Web Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Par défaut Lever les erreurs sur le socket
    Bonjour,

    J'ai un petit souci sur un script que j'ai réalisé récemment. Le script en question par d'une URL de base, récupère le texte html de la page grâce à la librairie urllib2 et qui ensuite à l'aide d'une regex je récupère tous les liens puis je les "nettoies" ( http://www.developpez.net/forums/newthread.php?do deviendra => http://www.developpez.net ) puis je fais la même chose, a partir de ces liens propre je récupère la page puis les liens et ainsi de suite.

    En bref une sorte de Web Crawler comme on dit.

    Supposons tmp1 une liste de lien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for url in tmp1 :
    		print '### Try to get ' + url + ' page...'
    		req =  urllib2.Request(url, '', Headers)
    		try : 
    			HTMLsourcetmp = urllib2.urlopen(req)
    		except:
    			print '### ERROR !'
    			pass
    		else :
    			HTMLsource = HTMLsource + HTMLsourcetmp.read()
    			print '### Succes !'
    Seulement quand mon script tourne, au bout du 70éme lien ou bien au bout de 3000 liens ( de façon aléatoire quoi... ) j'ai des erreurs qui ne sont pas levées, ce sont des erreurs en rapport avec le "Socket"

    J'ai deux type d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Traceback (most recent call last):
      File "parser.py", line 140, in <module>
        HTMLsource = HTMLsource + HTMLsourcetmp.read()
      File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/socket.py", line 291, in read
        data = self._sock.recv(recv_size)
      File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/httplib.py", line 529, in read
        s = self.fp.read(amt)
      File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/socket.py", line 309, in read
        data = self._sock.recv(recv_size)
    socket.timeout: timed out
    Ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
      File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/urllib.py", line 82, in urlopen
        return opener.open(url)
      File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/urllib.py", line 190, in open
        return getattr(self, name)(url)
      File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/urllib.py", line 328, in open_http
        errcode, errmsg, headers = h.getreply()
      File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/httplib.py", line 1195, in getreply
        response = self._conn.getresponse()
      File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/httplib.py", line 924, in getresponse
        response.begin()
      File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/httplib.py", line 385, in begin
        version, status, reason = self._read_status()
      File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/httplib.py", line 343, in _read_status
        line = self.fp.readline()
      File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/socket.py", line 331, in readline
        data = recv(1)
    IOError: [Errno socket error] (54, 'Connection reset by peer')

    J'ai fais beaucoup de recherche sur divers forum pour essayer de comprendre. ( Je suis débutant en python )

    D'une part je n'ai pas compris l'origine des erreurs ( que veulent t-elles dire ? )
    D'autre part je n'ai pas non plus trouvé comment lever ces erreurs ?

    Merci d'avance pour votre aide, j'espère que vous allez pouvoir m'éclairer :-)

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 114
    Par défaut
    Bonjour

    Ces erreurs proviennent de la couche basse de communication : les sockets.

    D'un certain point de vu, ce n'est pas un problème de ton programme, c'est juste que le serveur auquel tu essayes de te connecter te renvoie une erreur à la place de la page web demandée.

    Il faudrait voir à mettre la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    req =  urllib2.Request(url, '', Headers)
    dans un try.


    Cordialement
    Emmanuel

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Par défaut
    Tout d'abord merci de ta réponse.

    En effet je n'ai pas eu la présence d'esprit de mettre un try sur cette ligne...

    C'est donc ce que j'ai fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    	for url in tmp1 :
    		print '### Try to connect to : ' + url
    		try:
    			req =  urllib2.Request(url, '', Headers)
    		except: 
    			print '### ERROR CONNECTION !'
    		else:
    			print '### Try to get ' + url + ' page...'
    			try : 
    				HTMLsourcetmp = urllib2.urlopen(req)
    			except:
    				print '### ERROR !'
    				pass
    			else :
    				HTMLsource = HTMLsource + HTMLsourcetmp.read()
    				print '### Succes !'

    J'ai testé et, au bout d'un moment j'ai eu cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ### Try to connect to : http://www.cbsnews.com
    ### Try to get http://www.cbsnews.com page...
    Traceback (most recent call last):
      File "parser.py", line 145, in <module>
        HTMLsource = HTMLsource + HTMLsourcetmp.read()
      File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/socket.py", line 291, in read
        data = self._sock.recv(recv_size)
      File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/httplib.py", line 509, in read
        return self._read_chunked(amt)
      File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/httplib.py", line 544, in _read_chunked
        line = self.fp.readline()
      File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/socket.py", line 331, in readline
        data = recv(1)
    socket.timeout: timed out
    J'ai bien vu ça : http://docs.python.org/library/socket.html#socket.error


    Mais je dois avouer que j'ai un peu du mal à tout comprendre ...

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 114
    Par défaut
    Bonjour

    Chaque appel à urllib2 (direct ou indirect) peut masquer des appels à la couche socket, qui est la couche basse de communication.
    Il faut avoir en tête que quand on attaque la programmation réseau, on doit passer beaucoup de temps à gérer les erreurs. Ces erreurs sont en effet fort nombreuses :
    * rupture de la communication
    * congestion temporaire du réseau
    * bug de l'autre partie
    * etc.
    C'est pourquoi dans la programmation réseau, la gestion des erreurs est fondamentale, et en python, cela passe par des try partout.

    Dans ton cas, il semble que tu commences à recevoir la réponse à une requête et la fin d'arrive jamais. Cette fin est attendu par la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HTMLsource = HTMLsource + HTMLsourcetmp.read()
    qui n'est pas dans un try, donc ton programme est interrompu.

    Tu peux aussi augmenter le temps de timeout avec la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import socket
    socket.setdefaulttimeout(500)
    (NB: change le timeout maxi en seconde)
    Cela ne résoud pas l'erreur, mais la rend moins probable.

    Emmanuel

Discussions similaires

  1. [Généralités] requete Sql d'ajout (ignorer les erreurs sur primary key)
    Par sperchey dans le forum WinDev
    Réponses: 17
    Dernier message: 25/07/2012, 15h00
  2. [AC-2003] Ignorer les erreurs sur fermeture d'un formulaire
    Par tarnx dans le forum IHM
    Réponses: 2
    Dernier message: 04/08/2011, 06h14
  3. erreur sur classe socket
    Par Gnius dans le forum Débuter
    Réponses: 5
    Dernier message: 29/11/2008, 13h56
  4. voir les erreurs sur IE
    Par paolo2002 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 09/01/2008, 11h11
  5. question sur les erreurs de compilation
    Par vince3320 dans le forum C
    Réponses: 5
    Dernier message: 19/04/2004, 11h34

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