2015-12-11 3 views
2

J'utilise dryscrape pour récupérer des données HTML de différentes pages. Tout cela fait partie d'une application django, mais j'ai trouvé que ce problème apparaissait lors de l'utilisation de shell python. Problème avec la deuxième connexion. J'utilise:dryscrape - connexion refusée lors de la création d'une nouvelle session après la première

Python 2.7.6 (default, Mar 4 2014, 13:14:52) 
dryscrape Version: 0.9 
webkit-server Version: 1.0 
xvfbwrapper Version: 0.2.5 

Ci-dessous vous pouvez voir comment je sens que l'utiliser

Python 2.7.6 (default, Mar 4 2014, 13:14:52) 
Type "copyright", "credits" or "license" for more information. 

IPython 2.1.0 -- An enhanced Interactive Python. 
?   -> Introduction and overview of IPython's features. 
%quickref -> Quick reference. 
help  -> Python's own help system. 
object? -> Details about 'object', use 'object??' for extra details. 

In [1]: import dryscrape 

In [2]: from xvfbwrapper import Xvfb 

In [3]: x = Xvfb() 

In [4]: x.start() 

In [5]: session = dryscrape.Session(base_url='http://google.com') 

In [6]: session.visit('') 

In [7]: session.url() 
Out[7]: u'http://www.google.pl/?gfe_rd=cr&ei=d95qVvLfFc2v8wfamoG4Aw' 

In [8]: x.stop() 

Tout va bien pour l'instant. Mais si j'essaie de continuer, avec une autre session

... 
In [8]: x.stop() 

In [9]: x = Xvfb() 

In [10]: x.start() 

In [11]: session = dryscrape.Session(base_url='http://google.com') 
--------------------------------------------------------------------------- 
error          Traceback (most recent call last) 
<ipython-input-11-6cbe39a8459d> in <module>() 
----> 1 session = dryscrape.Session(base_url='http://google.com') 

/home/mefioo/public_html/kariera_naukowa/env/lib/python2.7/site-packages/dryscrape/session.pyc in __init__(self, driver, base_url) 
    16    driver = None, 
    17    base_url = None): 
---> 18  self.driver = driver or DefaultDriver() 
    19  self.base_url = base_url 
    20 

/home/mefioo/public_html/kariera_naukowa/env/lib/python2.7/site-packages/dryscrape/driver/webkit.pyc in __init__(self, **kw) 
    28 def __init__(self, **kw): 
    29  kw.setdefault('node_factory_class', NodeFactory) 
---> 30  super(Driver, self).__init__(**kw) 

/home/mefioo/public_html/kariera_naukowa/env/lib/python2.7/site-packages/webkit_server.pyc in __init__(self, connection, node_factory_class) 
    228    node_factory_class = NodeFactory): 
    229  super(Client, self).__init__() 
--> 230  self.conn = connection or ServerConnection() 
    231  self._node_factory = node_factory_class(self) 
    232 

/home/mefioo/public_html/kariera_naukowa/env/lib/python2.7/site-packages/webkit_server.pyc in __init__(self, server) 
    505 def __init__(self, server = None): 
    506  super(ServerConnection, self).__init__() 
--> 507  self._sock = (server or get_default_server()).connect() 
    508  self.buf = SocketBuffer(self._sock) 
    509  self.issue_command("IgnoreSslErrors") 

/home/mefioo/public_html/kariera_naukowa/env/lib/python2.7/site-packages/webkit_server.pyc in connect(self) 
    438  """ Returns a new socket connection to this server. """ 
    439  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
--> 440  sock.connect(("127.0.0.1", self._port)) 
    441  return sock 
    442 

/usr/local/lib/python2.7/socket.pyc in meth(name, self, *args) 
    222 
    223 def meth(name,self,*args): 
--> 224  return getattr(self._sock,name)(*args) 
    225 
    226 for _m in _socketmethods: 

error: [Errno 111] Connection refused 

Je le fais simplement par exemple, parce que dans mon application django cela fait partie de la logique de vue, et en demandant que la deuxième fois vue résultats dans cette erreur. Le redémarrage du serveur django ou du shell python résout le problème, mais uniquement pour la première connexion, il est donc inutile de travailler sur une page Web. Ai-je manqué un "nettoyage" ou un "redémarrage" de la session X, ou un serveur webkit (capibara-webkit) entre ces deux?

Répondre

0

Ok, ce n'est pas une "vraie" réponse, parce que je ne sais toujours pas ce qui ne va pas, mais j'ai trouvé un moyen de le faire fonctionner. J'ai mis à jour dryscrape à 1.0 et utilisé sa nouvelle méthode dryscrape.start_xvfb() au lieu de xvfbwrapper Xvfb(). Tout fonctionne bien.