Как установить различные параметры лечения для разных пауков?

Я хочу включить некоторый 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
    }

Если код выше не работает, есть ли другое предложение?

Ответ 1

Вы можете определить свое собственное промежуточное ПО прокси, что-то прямое:

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 в пауках, для которого вы хотите включить прокси. Не забудьте отключить промежуточное программное обеспечение прокси-сервера по умолчанию и включить измененный.

Ответ 2

немного поздно, но начиная с версии 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}}

Ответ 3

Существует новый и более простой способ сделать это.

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

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

Я использую Scrapy 1.3.1

Ответ 4

Вы можете добавить settings.overrides в файл spider.py Пример, который работает:

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
}

Ответ 5

Почему бы не использовать два проекта, а не только один?

Назовите эти два проекта с помощью proj1 и proj2. В proj1 settings.py введите следующие настройки:

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

В proj2 settings.py введите следующие настройки:

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