web-dev-qa-db-ja.com

スクレイピーとプロキシ

python web-scraping framework Scrapyでプロキシサポートをどのように利用しますか?

39
no1

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 :港

httpsプロキシを使用してhttps webにアクセスする場合は、環境変数http_proxy以下に従う必要があります。

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

単一プロキシ

  1. 次のように、settings.pyHttpProxyMiddlewareを有効にします。

    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
43
Amom

1-「middlewares.py」という名前の新しいファイルを作成し、スクレイピープロジェクトに保存し、次のコードを追加します。

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

これで、リクエストはこのプロキシによって渡されるはずです。簡単ですね。

26

それは:

export http_proxy = http:// user:password @ proxy:port

9
laurent alsina

誰かによって書かれた素敵なミドルウェアがあります[1]: https://github.com/aivarsk/scrapy-proxies "Scrapy proxy middleware"

4
Niranjan Sagar

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

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

その後、プログラムを開始しました。

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

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

3

/ etc/environmentで環境を設定することで問題が発生したため、ここにスパイダー(Python)に入れたものを示します。

os.environ["http_proxy"] = "http://localhost:12345"
2
pinkvoid

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

これは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,
}

ハッピークロール!!!

0
Amit