49

Python WebスクレイピングフレームワークScrapyでプロキシサポートをどのように利用しますか?

4

9 に答える 9

53

Scrapy FAQから、

ScrapyはHTTPプロキシで動作しますか?

はい。HTTPプロキシのサポートは、HTTPプロキシダウンローダーミドルウェアを介して提供されます(Scrapy 0.8以降)。を参照してください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プロキシを使用してhttpsWebにアクセスする場合、環境変数を設定するにはhttp_proxy、以下に従う必要があります。

C:\> set https_proxy = https:// proxy:port
csh%setenv https_proxy https:// proxy:port
sh $ export 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

/ etc / environmentに環境を設定するのに問題があったので、スパイダー(Python)に入れたものは次のとおりです。

os.environ["http_proxy"] = "http://localhost:12345"
于 2015-11-18T07:58:32.283 に答える
4

誰かが書いた素敵なミドルウェアがあります[1]:https ://github.com/aivarsk/scrapy-proxies 「Scrapyプロキシミドルウェア」

于 2015-12-01T01:58:10.473 に答える
3

Windowsでは、以前のいくつかの回答をまとめましたが、うまくいきました。私は単にしました:

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

それから私は自分のプログラムを立ち上げました:

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

ここで、「dmzo」はプログラム名です(インターネット上のチュートリアルで見つけたものであり、ここにいる場合はおそらくチュートリアルから始めているので、私はそれを書いています)。

于 2015-10-27T13:20:01.107 に答える
3

Scrapyプロキシなどのミドルウェアを使用することをお勧めします。プロキシをローテーションしたり、不良プロキシをフィルタリングしたり、すべてのリクエストに単一のプロキシを使用したりできます。また、ミドルウェアを使用すると、実行のたびにプロキシを設定する手間を省くことができます。

これはGitHubREADMEから直接のものです。

  • 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

これが私がすることです

方法1:

このようなダウンロードミドルウェアを作成します

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

これで、すべてのリクエストにプロキシが適用されます

方法2:

有効HttpProxyMiddlewareにしsettings.pyて、リクエストごとにこれを実行するだけです

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