web-dev-qa-db-ja.com

スパイダーごとに異なるスクレイプ設定を設定するにはどうすればよいですか?

一部のスパイダーでは一部のhttpプロキシを有効にし、他のスパイダーでは無効にします。

このようなことはできますか?

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

上記のコードが機能しない場合、他に何か提案はありますか?

18
Michael Nguyen

独自のプロキシミドルウェアを定義できます。これは次のように簡単です。

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)

次に、プロキシを有効にするスパイダーで属性use_proxy = Trueを定義します。デフォルトのプロキシミドルウェアを無効にし、変更したミドルウェアを有効にすることを忘れないでください。

3
Rolando Max

少し遅れていますが、リリース1.0.0以降、scrapyに新機能があり、次のようにスパイダーごとの設定を上書きできます。

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}}
33
user4055746

これを行うための新しくて簡単な方法があります。

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

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

Scrapy1.3.1を使用しています

11
Aminah Nuraini

Spider.pyファイル内にsetting.overridesを追加できます。機能する例:

from scrapy.conf import settings

settings.overrides['DOWNLOAD_TIMEOUT'] = 300 

あなたにとって、このようなものもうまくいくはずです

from scrapy.conf import settings

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