如何在 Scrapy 中使用下载器中间件

Jac*_*iel 5 python scrapy python-2.7 scrapy-spider

我正在使用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]
Run Code Online (Sandbox Code Playgroud)

现在,我不明白scrapy 将如何考虑我的实现而不是默认类。经过一番搜索和头脑风暴,我的理解是,我需要在settings.py中进行更改

DOWNLOADER_MIDDLEWARES = {
    'IPProxy.middlewares.MyCustomDownloaderMiddleware': 543,
    'IPProxy.IPProxy.spiders.RandomProxy': 600
}
Run Code Online (Sandbox Code Playgroud)

为了让读者更好地了解我的项目结构,我在列表中添加了具有一些随机值的第二个元素。我的项目结构是:

在此处输入图片说明

我的问题是,

  • 如何正确使用settings.py 中的DOWNLOADER_MIDDLEWARES
  • 如何为 DOWNLOADER_MIDDLEWARES 中的元素赋值
  • 如何让scrapy调用我的自定义代码而不是默认代码

ale*_*cxe 1

如果您想禁用内置的HttpProxyMiddleware下载器中间件 - 将其值设置DOWNLOADER_MIDDLEWARESNone

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': None,
    'IPProxy.middlewares.MyCustomDownloaderMiddleware': 543,
    'IPProxy.IPProxy.spiders.RandomProxy': 600
}
Run Code Online (Sandbox Code Playgroud)