Как использовать промежуточное ПО Downloader в Scrapy

Я использую scrapy для очистки некоторых веб-страниц. Я написал свой собственный класс ProxyMiddleware, в котором я реализовал свое требование в методе process_request(self,request,spider). Вот мой код (скопировано):

class ProxyMiddleware(scrapy.downloadermiddlewares.httpproxy):
def __init__(self, proxy_ip=''):
    self.proxy_ip = proxy_ip

def process_request(self,request,spider):
    ip = random.choice(self.proxy_list)
    if ip:
        request.meta['proxy'] = ip
    return request

proxy_list = [list of proxies]

Теперь я не понял, как scrapy будет рассматривать мою реализацию вместо класса по умолчанию. После некоторых поисков и мозгового штурма я понял, что мне нужно внести изменения в settings.py

DOWNLOADER_MIDDLEWARES = {
    'IPProxy.middlewares.MyCustomDownloaderMiddleware': 543,
    'IPProxy.IPProxy.spiders.RandomProxy': 600
}

Для лучшего понимания читателями структуры моего проекта я добавил в список второй элемент с некоторым случайным значением. Структура моего проекта:

введите здесь описание изображения

Мой вопрос,

  • Как правильно использовать DOWNLOADER_MIDDLEWARES в settings.py
  • Как присвоить значения элементам в DOWNLOADER_MIDDLEWARES
  • Как сделать, чтобы scrapy вызывал мой индивидуальный код вместо кода по умолчанию

person Jack Daniel    schedule 08.10.2015    source источник


Ответы (1)


Если вы хотите отключить встроенное ПО промежуточного слоя HttpProxyMiddleware Downloader, установите его значение в DOWNLOADER_MIDDLEWARES на None:

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': None,
    'IPProxy.middlewares.MyCustomDownloaderMiddleware': 543,
    'IPProxy.IPProxy.spiders.RandomProxy': 600
}
person alecxe    schedule 08.10.2015
comment
Спасибо. Еще одна двусмысленность заключается в том, что способ, которым я написал свой класс ProxyMiddleware, будет переопределять process_request по умолчанию scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware. - person Jack Daniel; 08.10.2015
comment
DOWNLOADER_MIDDLEWARES = { 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': нет, 'IPProxy.IPProxy.spiders.ProxyMiddleware': 600, 'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware' : нет, 'IPProxy.IPProxyUser'AgentM.spiders.Rotate :700 } Теперь мой код проходит через исключение No Module Name UserAgentMiddleware Exception. Как можно использовать мой индивидуальный класс здесь. - person Jack Daniel; 08.10.2015
comment
@Ashwanth Я думаю, что это scrapy.downloadermiddlewares.useragent.UserAgentMiddleware. - person alecxe; 08.10.2015
comment
Изменил соответственно, но все равно выдает ту же ошибку - person Jack Daniel; 08.10.2015
comment
Есть некоторая двусмысленность в вызове настроенного метода process_request. Не могли бы вы объяснить, как я могу вызывать свои методы process_request в классе RotateUserAgentMiddleware. - person Jack Daniel; 08.10.2015
comment
После нескольких изменений в коде столкнулся с этой ошибкой. - person Jack Daniel; 08.10.2015