目次
簡単な紹介
IPプロキシを使用してターゲットページを要求すると、IPスロットリングを回避できます。淘宝網の製品情報をクロールする背景を例にとると、単一のIPを使用して淘宝網のWebサイトを頻繁に要求すると、それは淘宝網プラットフォームによって認識され、返されるインターフェース情報は「要求が混雑しています...」と報告します。
クライミング対策に抵抗するために、TaobaoのPC製品リストページでは、頻繁にアクセスするIPに再ログインするか、スライダー検証のあるページにジャンプして、ユーザーがログインするかスライダーをドラッグする必要があります。同時に、淘宝網は現在、いくつかの危険なグレーとブラックのIPに制限を設けており、クラウド内の数百万の既知のターゲットリスクのIPブラックとグレーの生産データに関する判断を提供できます。現在、淘宝網モバイル端末はまだクローラーリスク管理を実装していないため、動的IPプロキシを使用して淘宝網モバイル端末のインターフェイスデータにアクセスすることは依然として効果的です。
IPプロキシ
IPプロキシには、透過プロキシ、匿名プロキシ、難読化プロキシ、高隠しプロキシが含まれます。これらの4つのプロキシは、主にプロキシサーバー側で異なる構成を持っているため、3つの変数REMOTE_ADDR、HTTP_VIA、およびHTTP_X_FORWARDED_FORは、ターゲットアドレスに要求を送信するときに異なります。
REMOTE_ADDR =プロキシIP
HTTP_VIA =プロキシIP
HTTP_X_FORWARDED_FOR =あなたのIP
透過プロキシはIPを直接「隠す」ことができますが、HTTP_X_FORWARDED_FORから自分が誰であるかを知ることができます。
REMOTE_ADDR =プロキシIP
HTTP_VIA =プロキシIP
HTTP_X_FORWARDED_FOR =プロキシIP
匿名プロキシは透過プロキシよりも少し高度です。他の人はあなたがプロキシを使用していることだけを知ることができますが、あなたが誰であるかを知ることはできません。
REMOTE_ADDR =プロキシIP
HTTP_VIA =プロキシIP
HTTP_X_FORWARDED_FOR =ランダムIPアドレス
匿名プロキシと同じように、難読化されたプロキシを使用している場合でも、他の人はあなたがプロキシを使用していることを知ることができますが、より現実的な偽のIPアドレスを取得します。
REMOTE_ADDR =プロキシIP
HTTP_VIA =未定
HTTP_X_FORWARDED_FOR =未定
高度に隠されたプロキシを使用すると、プロキシを使用していることを他の人が発見できない可能性があるため、これが最良の選択です。
無料のグラブIPプロキシ
インターネット上には多くのIPエージェンシープロバイダーがありますが、それらの価格は高価であり、中小企業に多くのコスト予算を提供します。以前の情報エージェント、象エージェントなどの使用など。Xishui、jiangxianli、DATA5Uなど、無料のIPプロキシを提供するために個人的に構築する人もたくさんいます。このプロジェクトは定期的に無料のIPプロキシを取得し、有効なIPを利用可能なIPプロキシプールに保存します。
IPプロキシ管理に関する情報はすべてcrawl-proxyモジュールにあります。無料のIPプロキシWebサイト情報のクロールは、クローラータスクのスケジューリングによってトリガーされ、提供されたIPがキャプチャされてredisに保存されます。
クリーンなIPプロキシアルゴリズムの設計
IPプロキシプールには、使用可能なIPプロキシプール、IPプロキシプール、および廃止されたIPプロキシプールがあり、それらのライフサイクルは順番に減少します。無料のIPプロキシページでIPを取得した後、最初にIPをIPプロキシプールに保存し、使用可能かどうかを確認します。使用可能な場合は、使用可能なIPプロキシプールのIPプロキシプールにIPを保存して削除します。 IPプロキシプール。それ以外の場合は、破棄されたIPプロキシプールにIPを保存します。
クリーニングIPが使用可能かどうかは、マルチスレッドのCompletionService非同期ノンブロッキングを使用して、並列タスクの結果を取得します。FutureとCallableを使用してスレッドの実行結果を取得しますが、取得方法はブロッキングです。スレッドプールに追加されたスレッドの順序に従って、1つずつ取得されます。取得されない場合はブロックされます。結果をより速く取得するために、このプロジェクトはCompletionServiceを使用してスレッド実行結果の非同期で高速な収集を実現し、ソケット接続を使用してIPプロキシが使用可能かどうかを判断します。具体的なコアソースコードは次のとおりです。
public class VerifyProxy {
static ExecutorService threads = Executors.newFixedThreadPool(120);
public VerifyProxy() {
}
public Map<HostPort, Boolean> verifyProxy(List<HostPort> hostPortList) {
Map<HostPort, Boolean> hostPortBooleanMap = Collections.synchronizedMap(new HashMap());
CompletionService<Map<HostPort, Boolean>> cs = new ExecutorCompletionService(this.threads);
int i;
for(i = 0; i < hostPortList.size(); ++i) {
cs.submit(new VerifyProxy.RequestCheck(hostPortList.get(i), hostPortBooleanMap));
}
//this.threads.shutdown();
for(i = 0; i < hostPortList.size(); ++i) {
try {
Map var5 =cs.take().get();
} catch (InterruptedException var6) {
var6.printStackTrace();
} catch (ExecutionException var7) {
var7.printStackTrace();
}
}
return hostPortBooleanMap;
}
class RequestCheck implements Callable<Map<HostPort, Boolean>> {
HostPort hostPort = null;
Map<HostPort, Boolean> map = null;
public RequestCheck(HostPort hostPort, Map<HostPort, Boolean> map) {
this.hostPort = hostPort;
this.map = map;
}
public RequestCheck() {
}
public Map<HostPort, Boolean> call() throws Exception {
Socket socket = new Socket();
try {
socket.connect(new InetSocketAddress(hostPort.getHostName(),hostPort.getPort()),2000);
this.map.put(this.hostPort, true);
} catch (IOException e) {
this.map.put(this.hostPort, false);
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return this.map;
}
}
}