如何在Scrapy中使用Downloader Middleware

时间:2015-10-08 12:19:03

标签: python python-2.7 scrapy 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]

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

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

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

enter image description here

我的问题是,

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

1 个答案:

答案 0 :(得分:1)

如果您要禁用内置HttpProxyMiddleware下载器中间件的假设,请将其值DOWNLOADER_MIDDLEWARES设置为None

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': None,
    'IPProxy.middlewares.MyCustomDownloaderMiddleware': 543,
    'IPProxy.IPProxy.spiders.RandomProxy': 600
}