Scrapy如何使用代理池

时间:2016-02-17 18:24:10

标签: python web-scraping scrapy web-crawler

我正在使用Scrapy并尝试通过创建自定义DownloaderMiddleware来使用代理池。我遇到了一些麻烦,想在这里得到一些帮助(我查看了Scrapy网站上的文档,但没有代码示例)

我的python代码是:

import random

class ProxyRotator(object):
    proxy_pool = ['ip1...', 'ip2...', 'ip3...']

    def process_request(self, request, spider):
        request.meta['proxy'] = "http://" + self.proxy_pool[random.randint(0, len(self.proxy_pool) - 1)] + ":80"
        return request

在settings.py中,我添加了

 DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
    'pricecheck_crawler.ProxyMiddleware.ProxyRotator': 100,
 }

目前,抓取工具无法从网站获取任何内容。 日志显示:

2016-02-17 11:27:50 [scrapy] INFO:抓0页(0页/分),刮0件(0件/分)

2016-02-17 11:27:50 [scrapy] DEBUG:telnet控制台监听127.0.0.1:6051

2016-02-17 11:28:50 [scrapy] INFO:抓0页(0页/分),刮0件(0件/分)

2016-02-17 11:29:50 [scrapy]信息:抓0页(0页/分),刮0项(0件/分)

3 个答案:

答案 0 :(得分:3)

试试这个。删除return request语句,因为它会将请求返回到process_request,并且永远不会调用process_response。在此之前,请确保仅使用http或https代理:

def process_request(self, request, spider):
    request.meta['proxy'] = self.proxy_pool[random.randint(0, len(self.proxy_pool) - 1)]

您还可以将设置更改为以下内容:

'pricecheck_crawler.ProxyMiddleware.ProxyRotator': 100,
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110

同时验证request.meta['proxy'] = "http://ip:port"

答案 1 :(得分:0)

另一个方向可能是使用外部程序,例如proxifier,以便通过代理隧道传输带宽。

答案 2 :(得分:0)

您可以使用 Scrapy_proxy_pool

只需在 settings.py 中添加到您当前的代码

PROXY_POOL_ENABLED = True
相关问题