2013-10-11 4 views
10

Ich möchte einige HTTP-Proxy für einige Spinnen aktivieren und sie für andere Spinnen deaktivieren.Wie man verschiedene scrapy-Einstellungen für verschiedene Spinnen einstellt?

Kann ich so etwas tun?

# settings.py 
proxy_spiders = ['a1' , b2'] 

if spider in proxy_spider: #how to get spider name ??? 
    HTTP_PROXY = 'http://127.0.0.1:8123' 
    DOWNLOADER_MIDDLEWARES = { 
     'myproject.middlewares.RandomUserAgentMiddleware': 400, 
     'myproject.middlewares.ProxyMiddleware': 410, 
     'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None 
    } 
else: 
    DOWNLOADER_MIDDLEWARES = { 
     'myproject.middlewares.RandomUserAgentMiddleware': 400, 
     'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None 
    } 

Wenn der obige Code nicht funktioniert, gibt es einen anderen Vorschlag?

Antwort

3

Sie können Ihre eigenen Proxy-Middleware, etwas einfach wie folgt definieren:

from scrapy.contrib.downloadermiddleware import HttpProxyMiddleware 

class ConditionalProxyMiddleware(HttpProxyMiddleware): 
    def process_request(self, request, spider): 
     if getattr(spider, 'use_proxy', None): 
      return super(ConditionalProxyMiddleware, self).process_request(request, spider) 

Definieren Sie dann das Attribut use_proxy = True in den Spidern, für die der Proxy aktiviert werden soll. Vergessen Sie nicht, die Standard-Proxy-Middleware zu deaktivieren und Ihre modifizierte Middleware zu aktivieren.

-2

Warum nicht zwei Projekte statt nur eines verwenden?

Lassen Sie uns diese zwei Projekte mit proj1 und proj2 benennen. In proj1 's settings.py, setzen Sie diese Einstellungen:

HTTP_PROXY = 'http://127.0.0.1:8123' 
DOWNLOADER_MIDDLEWARES = { 
    'myproject.middlewares.RandomUserAgentMiddleware': 400, 
    'myproject.middlewares.ProxyMiddleware': 410, 
    'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None 
} 

In proj2' s settings.py, setzen Sie diese Einstellungen:

DOWNLOADER_MIDDLEWARES = { 
    'myproject.middlewares.RandomUserAgentMiddleware': 400, 
    'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None 
} 
+0

Das ist nicht das, was der Benutzer tun möchte, gibt es bestimmte Fälle, in denen Sie mehrere Spinnen in demselben Projekt wollen. – rajat

7

Sie können setting.overrides innerhalb der spider.py Datei Beispiel hinzufügen, die funktioniert:

from scrapy.conf import settings 

settings.overrides['DOWNLOAD_TIMEOUT'] = 300 

für Sie so etwas wie dies auch

from scrapy.conf import settings 

settings.overrides['DOWNLOADER_MIDDLEWARES'] = { 
    'myproject.middlewares.RandomUserAgentMiddleware': 400, 
    'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None 
} 
+3

Vergessen Sie das nicht, bevor Sie das aus den scrapy.conf-Importeinstellungen übernehmen. –

+2

settings.overrides ist in Scrapy-Versionen größer als 1 veraltet. Das custom_settings-Dictionary in Ihrer Spider-Deklaration funktioniert. – v01d

21

ein bisschen spät arbeiten sollte, aber da Release 1.0.0 gibt es eine neue Funktion in scrapy, wo Sie die Einstellungen pro Spinne wie folgt überschreiben können:

class MySpider(scrapy.Spider): 
    name = "my_spider" 
    custom_settings = {"HTTP_PROXY":'http://127.0.0.1:8123', 
         "DOWNLOADER_MIDDLEWARES": {'myproject.middlewares.RandomUserAgentMiddleware': 400, 
                'myproject.middlewares.ProxyMiddleware': 410, 
                'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None}} 




class MySpider2(scrapy.Spider): 
     name = "my_spider2" 
     custom_settings = {"DOWNLOADER_MIDDLEWARES": {'myproject.middlewares.RandomUserAgentMiddleware': 400, 
                 'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None}} 
+0

Ich bekomme 'Name Fehler 'AUTOTHROTTLE_ENABLED" nicht definiert ". Dein Snippet zeigt nicht an, dass du import settings.py importierst –

8

Es gibt einen neuen und einfacheren Weg, dies zu tun.

class MySpider(scrapy.Spider): 
    name = 'myspider' 

    custom_settings = { 
     'SOME_SETTING': 'some value', 
    } 

Ich benutze Scrapy 1.3.1