Scrapy与代理

53 投票
9 回答
78849 浏览
提问于 2025-04-16 10:06

你怎么在使用Python的网页抓取框架Scrapy时,利用代理支持呢?

9 个回答

33

1- 创建一个新的文件,命名为“middlewares.py”,并将其保存在你的scrapy项目中,然后在里面添加以下代码。

import base64
class ProxyMiddleware(object):
    # overwrite process request
    def process_request(self, request, spider):
        # Set the location of the proxy
        request.meta['proxy'] = "http://YOUR_PROXY_IP:PORT"

        # Use the following lines if your proxy requires authentication
        proxy_user_pass = "USERNAME:PASSWORD"
        # setup basic authentication for the proxy
        encoded_user_pass = base64.encodestring(proxy_user_pass)
        request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass

2 - 打开你项目的配置文件(./project_name/settings.py),然后添加以下代码。

DOWNLOADER_MIDDLEWARES = {
    'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 110,
    'project_name.middlewares.ProxyMiddleware': 100,
}

现在,你的请求应该会通过这个代理发送。简单吧?

55

单个代理

  1. 在你的 settings.py 文件中启用 HttpProxyMiddleware,像这样:

    DOWNLOADER_MIDDLEWARES = {
        'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 1
    }
    
  2. 通过 request.meta 将代理传递给请求:

    request = Request(url="http://example.com")
    request.meta['proxy'] = "host:port"
    yield request
    

如果你有多个代理地址,可以随机选择一个地址,像这样:

多个代理

class MySpider(BaseSpider):
    name = "my_spider"
    def __init__(self, *args, **kwargs):
        super(MySpider, self).__init__(*args, **kwargs)
        self.proxy_pool = ['proxy_address1', 'proxy_address2', ..., 'proxy_addressN']

    def parse(self, response):
        ...parse code...
        if something:
            yield self.get_request(url)

    def get_request(self, url):
        req = Request(url=url)
        if self.proxy_pool:
            req.meta['proxy'] = random.choice(self.proxy_pool)
        return req
54

来自 Scrapy 常见问题解答

Scrapy 支持 HTTP 代理吗?

支持的。自 Scrapy 0.8 版本起,通过 HTTP 代理下载中间件提供了对 HTTP 代理的支持。具体可以查看 HttpProxyMiddleware

使用代理的最简单方法是设置一个环境变量 http_proxy。具体怎么设置取决于你使用的命令行工具。

C:\>set http_proxy=http://proxy:port
csh% setenv http_proxy http://proxy:port
sh$ export http_proxy=http://proxy:port

如果你想使用 HTTPS 代理并访问 HTTPS 网站,设置环境变量 http_proxy 的方法如下:

C:\>set https_proxy=https://proxy:port
csh% setenv https_proxy https://proxy:port
sh$ export https_proxy=https://proxy:port

撰写回答