2013-10-11 14 views
10

Chcę włączyć niektóre protokoły http dla niektórych pająków i wyłączyć je dla innych pająków.Jak ustawić różne ustawienia scrapy dla różnych pająków?

Czy mogę zrobić coś takiego?

# 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 
    } 

Jeśli powyższy kod nie działa, czy są jakieś inne sugestie?

Odpowiedz

3

Można zdefiniować własne oprogramowanie pośredniczące proxy, coś prostego tak:

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) 

Następnie zdefiniuj atrybut use_proxy = True w pająkach, dla których chcesz włączyć serwer proxy. Nie zapomnij wyłączyć domyślnego oprogramowania pośredniczącego proxy i włączyć zmodyfikowanego.

-2

Dlaczego nie używać dwóch projektów, a nie tylko jednego?

Nazwijmy te dwa projekty z proj1 i proj2. W proj1 's settings.py, umieścić te ustawienia:

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

w proj2' s settings.py, umieścić te ustawienia:

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

To nie to, co użytkownik chce zrobić, istnieją pewne przypadki, w których chcesz kilka pająków w samym projekcie. – rajat

7

Możesz dodać setting.overrides w pliku spider.py przykład, który działa:

from scrapy.conf import settings 

settings.overrides['DOWNLOAD_TIMEOUT'] = 300 

Dla ciebie, coś jak to powinno również pracować

from scrapy.conf import settings 

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

Nie zapomnij tego zanim zrobimy, że 'from scrapy.conf import settings' –

+2

settings.overrides został uznany za przestarzały w wersjach Scrapy większych niż 1. Używanie słownika custom_settings w twojej deklaracji pająka działa. – v01d

21

nieco późno, ale od wydanie 1.0.0 jest nowa funkcja w scrapingu, w której można zastąpić ustawienia na pająka w ten sposób:

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

Otrzymuję "name error" AUTOTHROTTLE_ENABLED "nie zdefiniowane". Twój fragment nie pokazuje, że importujesz plik settings.py –

8

Jest to nowy i łatwiejszy sposób na zrobienie tego.

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

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

używam Scrapy 1.3.1

Powiązane problemy