ウェブサイトのパース、APIリクエストの自動化、またはマーケットプレイスでの競合価格の監視を行う際、IPによるブロックに直面することは避けられません。curlとwgetは、コマンドラインでのHTTPリクエストを操作するための標準ツールであり、これらのツールでのプロキシ設定は制限を回避するために非常に重要です。この記事では、curlとwgetにおけるプロキシの使用方法を基本的なコマンドからIPのローテーションやエラーハンドリングを含む高度なシナリオまで詳しく解説します。
curlとwgetにおけるプロキシの基本構文
プロキシを介して接続するための最も簡単なコマンドから始めましょう。両方のツールはプロキシサーバーを指定するためのパラメータをサポートしていますが、構文は少し異なります。
curlでのプロキシの使用
curlでは、プロキシはパラメータ -x または --proxy を介して指定されます。コマンドの基本フォーマットは次のとおりです:
curl -x http://proxy-server:port http://example.com
実際のプロキシサーバーを使用した具体例:
curl -x http://45.130.123.45:8080 http://api.ipify.org
このコマンドは、指定されたプロキシサーバーを介してapi.ipify.org(あなたのIPアドレスを返すサービス)にリクエストを送信します。あなたの実際のアドレスではなく、プロキシのIPが表示されます。
wgetでのプロキシの使用
wgetでは、プロキシはパラメータ -e use_proxy=yes と環境変数を介して設定されるか、オプションを介して直接指定されます:
wget -e use_proxy=yes -e http_proxy=http://45.130.123.45:8080 http://example.com
または、環境変数を介したより短いバージョン(詳細は以下のセクションで説明します):
export http_proxy="http://45.130.123.45:8080"
wget http://example.com
プロキシサーバーへの認証
ほとんどの商業プロキシサービスは、ユーザー名とパスワードによる認証を要求します。これはプロキシを不正使用から保護し、各クライアントのトラフィックを追跡することを可能にします。curlとwgetで認証情報を渡す方法を見てみましょう。
curlでの認証
curlでは、ユーザー名とパスワードをプロキシサーバーのURLに直接指定するか、別のパラメータ -U を介して指定できます:
# 方法1:URLにユーザー名とパスワードを含める
curl -x http://username:password@proxy-server:port http://example.com
# 方法2:-Uパラメータを介して
curl -x http://proxy-server:port -U username:password http://example.com
認証情報を使用した具体的な例:
curl -x http://user123:pass456@45.130.123.45:8080 http://api.ipify.org
重要な点:パスワードに特殊文字(@、:、/、?)が含まれている場合、それらをURL形式にエンコードする必要があります。たとえば、@は%40に置き換えられます:
# パスワードに@が含まれている場合:pass@456
curl -x http://user123:pass%40456@45.130.123.45:8080 http://api.ipify.org
wgetでの認証
wgetでは、認証は --proxy-user と --proxy-password パラメータを介して設定されます:
wget --proxy-user=username --proxy-password=password \
-e use_proxy=yes -e http_proxy=http://45.130.123.45:8080 \
http://example.com
または、URLに認証情報を含めた環境変数を介して:
export http_proxy="http://username:password@45.130.123.45:8080"
wget http://example.com
異なるタイプのプロキシの操作:HTTP、HTTPS、SOCKS5
プロキシサーバーは異なるプロトコルで動作し、タイプの選択はタスクによって異なります。HTTPプロキシは簡単なリクエストに適しており、HTTPSは暗号化を提供し、SOCKS5はより低いレベルで動作し、任意のトラフィックをサポートします。WildberriesやOzonのようなマーケットプレイスをパースする際には、レジデンシャルプロキシがよく使用され、これらのプロトコルのいずれかで動作することができます。
HTTPおよびHTTPSプロキシ
HTTPプロキシは最も一般的なタイプです。これらはHTTPプロトコルレベルで動作し、ほとんどのウェブパースタスクに適しています:
# curlでのHTTPプロキシ
curl -x http://proxy-server:8080 http://example.com
# curlでのHTTPSプロキシ(保護された接続用)
curl -x https://proxy-server:8080 https://example.com
重要な点:ターゲットサイトがHTTPSを使用している場合でも、プロキシはHTTPである可能性があります。CurlはCONNECTメソッドを介してトンネルを自動的に確立します:
# HTTPSサイト用のHTTPプロキシ(正常に動作します)
curl -x http://proxy-server:8080 https://secure-site.com
SOCKS5プロキシ
SOCKS5は、TCPレベルで動作し、任意のタイプのトラフィック(HTTP、HTTPS、FTP、さらにはUDP)をサポートする、より汎用的なプロトコルです。これにより、SOCKS5は複雑な自動化タスクに最適な選択肢となります:
# curlでのSOCKS5
curl -x socks5://proxy-server:1080 http://example.com
# 認証付きSOCKS5
curl -x socks5://username:password@proxy-server:1080 http://example.com
# SOCKS5h(プロキシを介したDNS解決)
curl -x socks5h://proxy-server:1080 http://example.com
socks5とsocks5hの違い:前者ではDNSリクエストがあなたのコンピュータから行われ、後者ではプロキシサーバーを介して行われます。DNSリクエストを含めて完全に活動を隠したい場合はsocks5hを使用してください。
wgetではSOCKS5のサポートが制限されているため、そのようなタスクにはcurlやproxychainsのような追加のユーティリティを使用する方が良いでしょう。
ヒント:マーケットプレイス(Wildberries、Ozon、Yandex.Market)のパースには、HTTP/HTTPSプロトコルを持つレジデンシャルまたはモバイルプロキシの使用をお勧めします。これらは実際のユーザーのIPを持っているため、ブロックされることが少なくなります。
環境変数を通じたプロキシの設定
プロキシを介して定期的に作業する場合、各コマンドでパラメータを指定するよりも、一度環境変数を設定する方が便利です。Curlとwgetはこれらの変数を自動的に読み取ります。
現在のセッションの設定
ターミナルで変数をエクスポートします(セッションが終了するまで有効):
# HTTPトラフィック用
export http_proxy="http://username:password@proxy-server:8080"
# HTTPSトラフィック用
export https_proxy="http://username:password@proxy-server:8080"
# FTPトラフィック用
export ftp_proxy="http://username:password@proxy-server:8080"
# SOCKS5用
export all_proxy="socks5://username:password@proxy-server:1080"
これでcurlとwgetは自動的にプロキシを使用します:
# プロキシが自動的に適用されます
curl http://api.ipify.org
wget http://example.com
.bashrcまたは.zshrcでの永続的な設定
各ターミナル起動時にプロキシを適用するには、シェルの設定ファイルに変数を追加します:
# エディタでファイルを開く
nano ~/.bashrc # bash用
# または
nano ~/.zshrc # zsh用
# ファイルの最後に追加:
export http_proxy="http://username:password@proxy-server:8080"
export https_proxy="http://username:password@proxy-server:8080"
# 変更を保存して適用:
source ~/.bashrc
例外:no_proxy
特定のアドレスをプロキシから除外する必要がある場合があります(たとえば、localhostや内部サービス):
export no_proxy="localhost,127.0.0.1,192.168.0.0/16,.local"
これで、これらのアドレスへのリクエストは直接行われ、プロキシをバイパスします。
bashスクリプトでのプロキシのローテーション
大量のパースを行う場合(たとえば、Wildberriesの数千の商品の価格を収集する場合)、1つのプロキシを使用するとブロックされます。解決策はIPアドレスのローテーションです。これをbashスクリプトで実装する方法を見てみましょう。
プロキシリストからの簡単なローテーション
プロキシサーバーのリストを含むproxies.txtファイルを作成します(1行に1つ):
http://user1:pass1@proxy1.example.com:8080
http://user2:pass2@proxy2.example.com:8080
http://user3:pass3@proxy3.example.com:8080
プロキシを順番にローテーションするスクリプト:
#!/bin/bash
# パースするためのURLリストファイル
urls_file="urls.txt"
# プロキシリストファイル
proxies_file="proxies.txt"
# プロキシを配列に読み込む
mapfile -t proxies < "$proxies_file"
proxy_count=${#proxies[@]}
current_proxy=0
# 各URLを処理する
while IFS= read -r url; do
# サイクルでプロキシを選択
proxy="${proxies[$current_proxy]}"
echo "$urlへのリクエストを$proxy経由で送信"
curl -x "$proxy" -s "$url" -o "output_$(basename $url).html"
# 次のプロキシに切り替える
current_proxy=$(( (current_proxy + 1) % proxy_count ))
# リクエスト間の待機(1〜3秒)
sleep $((RANDOM % 3 + 1))
done < "$urls_file"
このスクリプトは、リストからプロキシを順番に使用し、最後の後は最初に戻ります。リクエスト間のランダムな待機時間は、活動をより自然に見せます。
プロキシのランダム選択
より予測不可能にするために、プロキシをランダムに選択することもできます:
#!/bin/bash
proxies_file="proxies.txt"
mapfile -t proxies < "$proxies_file"
proxy_count=${#proxies[@]}
while IFS= read -r url; do
# ランダムにプロキシを選択
random_index=$((RANDOM % proxy_count))
proxy="${proxies[$random_index]}"
echo "$urlへのリクエストをプロキシ#$random_index経由で送信"
curl -x "$proxy" -s "$url" -o "output_$(date +%s).html"
sleep $((RANDOM % 3 + 1))
done < "urls.txt"
プロキシサービスのAPIを介した自動ローテーション
多くのプロキシプロバイダー(レジデンシャルプロキシを提供するサービスを含む)は、単一のエンドポイントを介して自動ローテーションを提供しています。1つのプロキシアドレスを使用し、リクエストごとまたはタイマーでIPが変更されます:
# 自動ローテーション付きプロキシ
# リクエストごとにIPが変更される
curl -x http://username:password@rotating.proxy.com:8080 http://api.ipify.org
curl -x http://username:password@rotating.proxy.com:8080 http://api.ipify.org
# 上記の2つのリクエストは異なるIPアドレスを取得します
これは、大規模なパースに最も便利な方法です—プロキシリストを手動で管理する必要がありません。
プロキシを通じたヘッダーとUser-Agentの送信
現代のウェブサイトは、IPアドレスだけでなく、HTTPリクエストのヘッダーも分析します。User-Agentが欠落しているか、疑わしいヘッダーがあると、質の高いプロキシを使用していてもブロックされる可能性があります。curlとwgetでヘッダーを正しく設定する方法を見てみましょう。
curlでのUser-Agent
User-Agentは、ブラウザとオペレーティングシステムを識別するヘッダーです。Curlはデフォルトで独自のUser-Agent(curl/7.x.x)を送信するため、自動化がすぐに明らかになります。これを実際のブラウザに置き換えます:
# WindowsのChrome
curl -x http://proxy:8080 \
-A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" \
http://example.com
# macOSのFirefox
curl -x http://proxy:8080 \
-A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:121.0) Gecko/20100101 Firefox/121.0" \
http://example.com
追加のヘッダー
よりリアルなリクエストを作成するために、一般的なブラウザヘッダーを追加します:
curl -x http://proxy:8080 \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0" \
-H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" \
-H "Accept-Language: ru-RU,ru;q=0.9,en;q=0.8" \
-H "Accept-Encoding: gzip, deflate, br" \
-H "Connection: keep-alive" \
-H "Upgrade-Insecure-Requests: 1" \
http://example.com
wgetでのUser-Agent
wgetでは、User-Agentは --user-agent パラメータを介して設定されます:
wget --user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0" \
-e use_proxy=yes -e http_proxy=http://proxy:8080 \
http://example.com
スクリプト内でのUser-Agentのランダム化
大規模なパースには、User-Agentを交互に使用してリクエストが異なるユーザーからのものであるように見せることが有用です:
#!/bin/bash
# User-Agentの配列
user_agents=(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36"
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Safari/605.1.15"
"Mozilla/5.0 (X11; Linux x86_64) Firefox/121.0"
"Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) Safari/604.1"
)
while IFS= read -r url; do
# ランダムなUser-Agent
random_ua=${user_agents[$RANDOM % ${#user_agents[@]}]}
curl -x http://proxy:8080 -A "$random_ua" -s "$url"
sleep 2
done < "urls.txt"
問題の診断とエラーハンドリング
プロキシを使用する際には、タイムアウト、接続拒否、不正な認証などのエラーがよく発生します。これらの状況を診断し、処理する方法を見てみましょう。
プロキシの動作確認
プロキシを確認する最も簡単な方法は、あなたのIPを返すサービスにリクエストを送信することです:
# HTTPプロキシの確認
curl -x http://proxy:8080 http://api.ipify.org
# SOCKS5プロキシの確認
curl -x socks5://proxy:1080 http://api.ipify.org
# 詳細情報を表示
curl -x http://proxy:8080 -v http://api.ipify.org
-v(verbose)オプションは、接続の詳細、ヘッダー、エラーを表示します。
タイムアウトの処理
遅いプロキシや過負荷のサーバーはタイムアウトを引き起こす可能性があります。合理的な時間制限を設定します:
# 接続タイムアウト10秒、全体のタイムアウト30秒
curl -x http://proxy:8080 --connect-timeout 10 --max-time 30 http://example.com
# wgetの場合
wget --timeout=30 --tries=3 -e http_proxy=http://proxy:8080 http://example.com
スクリプト内での自動エラーハンドリング
エラーが発生した場合に次のプロキシに自動的に切り替えるパース用スクリプト:
#!/bin/bash
proxies_file="proxies.txt"
mapfile -t proxies < "$proxies_file"
fetch_with_retry() {
local url=$1
local max_attempts=3
for proxy in "${proxies[@]}"; do
echo "プロキシを介して試行中:$proxy"
if curl -x "$proxy" \
--connect-timeout 10 \
--max-time 30 \
-s -f "$url" -o output.html; then
echo "プロキシで成功:$proxy"
return 0
else
echo "プロキシでエラー:$proxy、次を試みます"
fi
done
echo "$urlに対してすべてのプロキシが利用できません"
return 1
}
# 使用方法
fetch_with_retry "http://example.com/page1"
-fオプションは、HTTPステータス4xxおよび5xxの場合にcurlがエラーを返すようにします。これにより、ネットワークエラーだけでなく、アプリケーションレベルでのブロックも処理できます。
デバッグのためのロギング
問題を分析するために、リクエストの詳細なログを保存します:
# レスポンスヘッダーを保存
curl -x http://proxy:8080 -D headers.txt http://example.com
# 完全な相互作用のログ
curl -x http://proxy:8080 -v http://example.com 2>&1 | tee curl.log
# HTTPステータスのみ
curl -x http://proxy:8080 -o /dev/null -s -w "%{http_code}\n" http://example.com
実用的な使用シナリオ
curlとwgetを使用して、特定のビジネス上の問題を解決する実際のタスクを見てみましょう。
マーケットプレイスでの競合価格のパース
タスク:Wildberriesから500商品の競合価格を収集し、価格戦略を分析します。Wildberriesは1つのIPからの大量リクエストを積極的にブロックします。
解決策:ローテーションとUser-Agentのランダム化を使用したレジデンシャルプロキシの使用:
#!/bin/bash
# 自動ローテーション付きプロキシ
PROXY="http://user:pass@rotating-residential.proxy.com:8080"
# User-Agentの配列
user_agents=(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0"
"Mozilla/5.0 (iPhone; CPU iPhone OS 17_0) Safari/604.1"
)
# 商品IDをファイルから読み込む
while IFS= read -r product_id; do
ua=${user_agents[$RANDOM % ${#user_agents[@]}]}
curl -x "$PROXY" \
-A "$ua" \
-H "Accept-Language: ru-RU,ru;q=0.9" \
-s "https://www.wildberries.ru/catalog/${product_id}/detail.aspx" \
-o "products/${product_id}.html"
echo "商品 $product_id をダウンロードしました"
sleep $((RANDOM % 5 + 3)) # 3〜8秒の待機
done < product_ids.txt
異なる地域からのAPIの可用性の監視
タスク:異なる国のユーザーに対するAPIの動作を確認します(地理的ブロック、応答速度)。
解決策:必要な国からのIPを持つプロキシを使用:
#!/bin/bash
# 異なる国のプロキシ
declare -A proxies=(
["US"]="http://user:pass@us-proxy.com:8080"
["DE"]="http://user:pass@de-proxy.com:8080"
["JP"]="http://user:pass@jp-proxy.com:8080"
)
API_URL="https://api.yourservice.com/v1/status"
for country in "${!proxies[@]}"; do
echo "$countryから確認中..."
response_time=$(curl -x "${proxies[$country]}" \
-s -o /dev/null \
-w "%{time_total}" \
"$API_URL")
http_code=$(curl -x "${proxies[$country]}" \
-s -o /dev/null \
-w "%{http_code}" \
"$API_URL")
echo "$country: HTTP $http_code, 応答時間 ${response_time}s"
done
wgetを使用したファイルのダウンロードとプロキシのローテーション
タスク:1つのIPに対して速度制限があるサイトからファイルのアーカイブ(商品画像、ドキュメント)をダウンロードします。
#!/bin/bash
proxies_file="proxies.txt"
mapfile -t proxies < "$proxies_file"
proxy_count=${#proxies[@]}
current=0
while IFS= read -r file_url; do
proxy="${proxies[$current]}"
filename=$(basename "$file_url")
echo "$filenameをプロキシ#$current経由でダウンロード中"
wget --proxy-user=username --proxy-password=password \
-e use_proxy=yes -e http_proxy="$proxy" \
-O "downloads/$filename" \
"$file_url"
current=$(( (current + 1) % proxy_count ))
sleep 2
done < file_urls.txt
異なるGEOでの広告クリエイティブのテスト
タスク:アメリカ、カナダ、イギリスのユーザーに対するFacebook Adsの広告を確認します(異なる通貨、言語、オファーの可用性)。
#!/bin/bash
# 現実的なための異なる国のモバイルプロキシ
declare -A mobile_proxies=(
["US"]="http://user:pass@us-mobile.proxy.com:8080"
["CA"]="http://user:pass@ca-mobile.proxy.com:8080"
["GB"]="http://user:pass@gb-mobile.proxy.com:8080"
)
AD_URL="https://www.facebook.com/ads/library/?id=YOUR_AD_ID"
for country in "${!mobile_proxies[@]}"; do
curl -x "${mobile_proxies[$country]}" \
-A "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0) Safari/604.1" \
-H "Accept-Language: en-US,en;q=0.9" \
-s "$AD_URL" \
-o "ads_preview_${country}.html"
echo "$countryのプレビューを保存しました"
done
このようなタスクには、特にモバイルプロキシが効果的です。これらは実際のスマートフォンユーザーを模倣し、Facebookの不正防止システムに疑われることが少なくなります。
アービトラージャーにとって重要:プロキシを介して広告クリエイティブを確認する際は、モバイルIPとモバイルデバイスのUser-Agentを使用してください。Facebookはデータの一貫性を分析します(User-AgentのデバイスタイプはIPのタイプと一致する必要があります)。
ウェブサイトの可用性チェックの自動化
タスク:実際のユーザーからのリクエストを模倣して、5分ごとにウェブサイトの可用性を監視します(サーバーIPからではなく)。
#!/bin/bash
PROXY="http://user:pass@residential.proxy.com:8080"
SITE_URL="https://yoursite.com"
LOG_FILE="uptime.log"
while true; do
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
http_code=$(curl -x "$PROXY" \
-s -o /dev/null \
-w "%{http_code}" \
--max-time 10 \
"$SITE_URL")
if [ "$http_code" -eq 200 ]; then
echo "[$timestamp] OK - HTTP $http_code" >> "$LOG_FILE"
else
echo "[$timestamp] ERROR - HTTP $http_code" >> "$LOG_FILE"
# アラートを送信(たとえば、Telegram APIを介して)
curl -s "https://api.telegram.org/botTOKEN/sendMessage" \
-d "chat_id=CHAT_ID&text=サイトが利用できません:HTTP $http_code"
fi
sleep 300 # 5分
done
結論
CurlとwgetはHTTPリクエストの自動化に強力なツールであり、プロキシの正しい設定により、パース、監視、テストに欠かせないものとなります。基本構文からIPのローテーション、エラーハンドリング、ヘッダーのランダム化に至るまで、すべての重要な側面を見てきました。
記事の主なポイント:
- curlでのプロキシ設定には
-xパラメータを使用し、環境変数を設定してください - タスクに応じてプロキシの種類を選択:簡単なリクエストにはHTTP、汎用性にはSOCKS5を使用
- 標準のUser-Agentを常にリアルなブラウザのものに置き換えてください
- 大規模なパースにはプロキシのローテーションを実装してください—ブロックを回避するために重要です
- プロダクションスクリプトにエラーハンドリングとタイムアウトを追加してください
- リクエスト間にランダムな待機時間を追加して人間の行動を模倣してください
高い匿名性とブロックリスクの最小化を必要とするタスク(マーケットプレイスのパース、広告の確認、競合の監視)には、レジデンシャルプロキシの使用をお勧めします。これらは実際の家庭ユーザーのIPを持っているため、あなたのリクエストは通常のトラフィックと区別がつかず、ブラックリストに入る可能性が大幅に減少します。
これで、curlとwgetでプロキシを効果的に使用するための完全なツールと知識が得られました。これらのテクニックをプロジェクトに適用し、具体的なタスクに合わせて例を調整し、ブロックの恐れなく自動化をスケールアップしてください。