2013-07-04 11 views
6

Ich habe einen Crawler entworfen, wo es zwei Spinnen geben wird. Ich habe diese mit scrapy entworfen.
Diese Spider werden unabhängig ausgeführt, indem Daten aus der Datenbank abgerufen werden.Portfehler in scrapy

Wir betreiben diese Spinnen mit einem Reaktor.Wie wir wissen, dass wir den Reaktor nicht wiederholt
betreiben können, geben wir etwa 500 Links zu der zweiten Spinne zu kriechen. Wenn wir das mögen, haben wir ein Problem mit einem Portfehler. d.h scrapy wird nur mit Single-Port-

Error caught on signal handler: <bound method ?.start_listening of <scrapy.telnet.TelnetConsole instance at 0x0467B440>> 
Traceback (most recent call last): 
File "C:\Python27\lib\site-packages\twisted\internet\defer.py", line 1070, in _inlineCallbacks 
result = g.send(result) 
File "C:\Python27\lib\site-packages\scrapy-0.16.5-py2.7.egg\scrapy\core\engine.py", line 75, in start yield self.signals.send_catch_log_deferred(signal=signals.engine_started) 
File "C:\Python27\lib\site-packages\scrapy-0.16.5-py2.7.egg\scrapy\signalmanager.py", line 23, in send_catch_log_deferred 
return signal.send_catch_log_deferred(*a, **kw) 
File "C:\Python27\lib\site-packages\scrapy-0.16.5-py2.7.egg\scrapy\utils\signal.py", line 53, in send_catch_log_deferred 
*arguments, **named) 
--- <exception caught here> --- 
File "C:\Python27\lib\site-packages\twisted\internet\defer.py", line 137, in maybeDeferred 
result = f(*args, **kw) 
File "C:\Python27\lib\site-packages\scrapy-0.16.5-py2.7.egg\scrapy\xlib\pydispatch\robustapply.py", line 47, in robustApply 
return receiver(*arguments, **named) 
File "C:\Python27\lib\site-packages\scrapy-0.16.5-py2.7.egg\scrapy\telnet.py", line 47, in start_listening 
self.port = listen_tcp(self.portrange, self.host, self) 
File "C:\Python27\lib\site-packages\scrapy-0.16.5-py2.7.egg\scrapy\utils\reactor.py", line 14, in listen_tcp 
return reactor.listenTCP(x, factory, interface=host) 
File "C:\Python27\lib\site-packages\twisted\internet\posixbase.py", line 489, in listenTCP 
p.startListening() 
File "C:\Python27\lib\site-packages\twisted\internet\tcp.py", line 980, in startListening 
raise CannotListenError(self.interface, self.port, le) 
twisted.internet.error.CannotListenError: Couldn't listen on 0.0.0.0:6073: [Errno 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted. 

Also, was ist das Problem hier vorkommenden ?? Dann, was ist der optimale Weg, um dieses Szenario zu lösen? Bitte helfen Sie ...

PS: Ich habe die Anzahl der Ports in den Einstellungen erhöht, aber es nimmt immer 6073 als Standard.

+0

Können Sie zeigen, wie Sie Ihre Spinnen laufen und wie konfigurieren Sie sie? – alecxe

+1

ist dies ein Duplikat von http://StackOverflow.com/Questions/1767553/twisted-errors-in-Scrapy-Spider –

+0

@ Jean-PaulCalderone Nein nicht gleich, ich habe Web-und Telnet-Konsolen deaktiviert, aber es zeigt denselben Fehler. – sathish

Antwort

5

Der einfachste Weg wäre, die Telnet-Konsole zu deaktivieren, indem Sie diese in Ihrem settings.py:

EXTENSIONS = { 
    'scrapy.telnet.TelnetConsole': None 
} 

Siehe auch http://doc.scrapy.org/en/latest/topics/settings.html#extensions für eine Liste der von-default aktiviert Erweiterungen.

+1

Es zeigt die gleichen Fehler auch nach dem Hinzufügen von Erweiterungen zu den Einstellungen. – sathish

1

Ihr Problem könnte durch Ausführen weniger gleichzeitiger Crawler gelöst werden. Hier ist ein Rezept, das ich geschrieben habe, um Anfragen sequentiell zu machen: Diese spezielle Klasse führt nur einen Crawler aus, aber die Modifikationen, die benötigt werden, um Chargen laufen zu lassen (sagen wir 10), sind trivial.

class SequentialCrawlManager(object): 
    """Start spiders sequentially""" 

    def __init__(self, spider, websites): 
     self.spider = spider 
     self.websites = websites 
     # setup crawler 
     self.settings = get_project_settings() 
     self.current_site_idx = 0 

    def next_site(self): 
     if self.current_site_idx < len(self.websites): 
      self.crawler = Crawler(self.settings) 
      # the CSVs data in each column is passed as keyword arguments 
      # the arguments come from the 
      spider = self.spider() # pass arguments if desired 
      self.crawler.crawl(spider) 
      self.crawler.start() 
      # wait for one spider to finish before starting the next one 
      self.crawler.signals.connect(self.next_site, signal=signals.spider_closed) 
      self.crawler.configure() 
      self.current_site_idx += 1 
     else: 
      reactor.stop() # required for the program to terminate 

    def start(self): 
     log.start() 
     self.next_site() 
     reactor.run() # blocking call