49

你如何在 python 网络抓取框架 Scrapy 中使用代理支持?

4

9 回答 9

53

Scrapy 常见问题解答中,

Scrapy 可以与 HTTP 代理一起使用吗?

是的。通过 HTTP 代理下载器中间件提供对 HTTP 代理的支持(从 Scrapy 0.8 开始)。见HttpProxyMiddleware

使用代理最简单的方法是设置环境变量http_proxy。如何做到这一点取决于您的外壳。

C:\> 设置 http_proxy=http://proxy:port
csh% setenv http_proxy http://proxy:port
sh$ 导出 http_proxy=http://proxy:port

如果你想使用 https 代理并访问 https 网络,设置环境变量http_proxy你应该遵循下面,

C:\>设置 https_proxy=https://proxy:port
csh% setenv https_proxy https://proxy:port
sh$ 导出 https_proxy=https://proxy:port
于 2011-01-17T06:29:08.250 回答
50

单一代理

  1. HttpProxyMiddleware在您的中启用settings.py,如下所示:

    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
于 2013-12-16T10:25:22.577 回答
29

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,
}

现在,您的请求应该由该代理传递。很简单,不是吗?

于 2015-04-18T10:46:02.583 回答
9

那将是:

导出 http_proxy=http://user:password@proxy:port

于 2013-01-18T14:58:29.717 回答
4

有人 [1] 编写了很好的中间件:https ://github.com/aivarsk/scrapy-proxies “Scrapy 代理中间件”

于 2015-12-01T01:58:10.473 回答
4

由于我在 /etc/environment 中设置环境时遇到了麻烦,这是我在我的蜘蛛(Python)中放入的内容:

os.environ["http_proxy"] = "http://localhost:12345"
于 2015-11-18T07:58:32.283 回答
3

这是我所做的

方法一:

像这样创建一个下载中间件

class ProxiesDownloaderMiddleware(object):

    def process_request(self, request, spider):
        
        request.meta['proxy'] = 'user:pass@host:port'

并启用它settings.py

DOWNLOADER_MIDDLEWARES: {
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
    'my_scrapy_project_directory.middlewares.ProxiesDownloaderMiddleware': 600,
},

就是这样,现在代理将应用于每个请求

方法二:

只需启用HttpProxyMiddlewaresettings.py然后为每个请求执行此操作

yield Request(url=..., meta={'proxy': 'user:pass@host:port'})
于 2021-03-09T07:00:38.570 回答
3

我建议您使用诸如scrapy-proxy 之类的中间件。您可以轮换代理、过滤不良代理或对所有请求使用单个代理。此外,使用中间件可以省去每次运行时设置代理的麻烦。

这直接来自 GitHub README。

  • 安装 scrapy-rotating-proxy 库

    pip install scrapy_proxies

  • 在您的 settings.py 中添加以下设置

# Retry many times since proxies often fail
RETRY_TIMES = 10
# Retry on most error codes since proxies fail for different reasons
RETRY_HTTP_CODES = [500, 503, 504, 400, 403, 404, 408]

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': 90,
    'scrapy_proxies.RandomProxy': 100,
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
}

# Proxy list containing entries like
# http://host1:port
# http://username:password@host2:port
# http://host3:port
# ...
PROXY_LIST = '/path/to/proxy/list.txt'

# Proxy mode
# 0 = Every requests have different proxy
# 1 = Take only one proxy from the list and assign it to every requests
# 2 = Put a custom proxy to use in the settings
PROXY_MODE = 0

# If proxy mode is 2 uncomment this sentence :
#CUSTOM_PROXY = "http://host1:port"

在这里您可以更改重试次数,设置单个或轮换代理

  • 然后将您的代理添加到这样的 list.txt 文件中
http://host1:port
http://username:password@host2:port
http://host3:port

在此之后,您对该项目的所有请求都将通过代理发送。代理随机轮换每个请求。它不会影响并发。

注意:如果您不想使用代理。您可以简单地注释scrapy_proxy中间件行。

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': 90,
#    'scrapy_proxies.RandomProxy': 100,
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
}

快乐爬行!!!

于 2019-08-13T10:26:52.803 回答
3

在 Windows 中,我整理了几个以前的答案,并且它起作用了。我只是做了:

C:>  set http_proxy = http://username:password@proxy:port

然后我启动了我的程序:

C:/.../RightFolder> scrapy crawl dmoz

其中“dmzo”是程序名称(我写它是因为它是您在 Internet 上的教程中找到的名称,如果您在这里,您可能已经从教程开始)。

于 2015-10-27T13:20:01.107 回答