ちょっと、そこ!
Node.js を使用して素晴らしい Web スクレイパーを構築したのに、サイトがリクエストをブロックし続けているということでしょうか?みんな行ったことあるよ!
この包括的な 3000 語以上のガイドでは、Node-Unblocker を活用してブロックを回避し、あらゆるサイトをスクレイピングする方法を学びます。
Node-Unblocker とは何ですか?なぜ使用するのですか?
Node-Unblocker は、リクエストと応答を変更するためのカスタム ミドルウェアを備えたプロキシ サーバーを実行できるオープンソースの Node.js モジュールです。
Node-Unblocker が Web スクレイピングに非常に役立つ主な理由をいくつか示します。
IPブロックを避ける – スクレーパーをプロキシ経由でルーティングすることで、1 つの IP アドレスからのリクエストが多すぎるために IP が禁止されるのを回避できます。これは大規模なスクレイピングを成功させるために重要です。
地理的ブロックをバイパスする – 多くのサイトでは、場所に基づいてコンテンツへのアクセスを制限しています。 Node-Unblocker を使用すると、特定のリージョンの IP を介してプロキシし、これらのブロックをバイパスできます。
JavaScript サイトをスクレイピング – Node-Unblocker は WebSocket のプロキシをサポートしており、JavaScript に大きく依存しているサイトのスクレイピングを可能にします。多くのスクレイパーは JS サイトに苦労しています。
リクエストの変更 – カスタムミドルウェアを使用すると、リクエストヘッダーを変更してブラウザを模倣したり、ログインの自動処理、文字のエンコードなどを行うことができます。
応答の変換 – スクレイパー コードに到達する前に、応答ミドルウェアを使用して応答を再形成し、処理します。
軽量で高速 – Node-Unblocker は完全に JavaScript で構築されているため、超高速で簡単に JS スクレイパーに統合できます。
調査によると、現在、Web サイトの 60% 以上が IP ブロック、CAPTCHA、ボット検出などのスクレイピング対策手段を採用しています。 Node-Unblocker は、これらの障害を乗り越えるための秘密兵器です。
Node-Unblocker のインストールと構成
まず、Node-Unblocker をインストールして構成する方法を見てみましょう。また、サンプル プロキシ サーバーを作成して試してみましょう。
ステップ 1: Node-Unblocker をインストールする
すでに Node.js プロジェクトがあると仮定して、Node-Unblocker と Express をインストールします。
npm install node-unblocker express
これにより、両方のモジュールが package.json
.
ステップ 2: Express サーバーを初期化する
サーバー ファイルで、Express アプリと Node-Unblocker インスタンスを初期化します。
// server.js
const express = require(‘express‘);
const Unblocker = require(‘unblocker‘);
const app = express();
const unblocker = Unblocker();
// Node-Unblocker is now ready to use!
ステップ 3: プロキシ ルートを追加する
リクエストをプロキシするには、Unblocker ミドルウェアを介してリダイレクトするルートを追加します。
app.get(‘/scrape‘, (req, res) => {
const url = req.query.url;
res.redirect(`/proxy/${url}`);
});
リクエストを行うことができるようになりました。 /scrape?url=http://example.com
Node-Unblocker がそれらをプロキシします。
ステップ 4: サーバーを起動する
最後に、プロキシ サーバーを起動します。
const PORT = 3000;
app.listen(PORT, () => {
console.log(`Proxy server running on port ${PORT}`);
});
基本的な Node-Unblocker サーバーが稼働中です。
次に、Web スクレイパーでそれを活用する方法を見てみましょう。
Web スクレイピングに Node-Unblocker を使用する
以下に、Node-Unblocker を使用してサイトをスクレイピングする最も一般的な使用例をいくつか示します。
回転プロキシ
Web スクレイピングにおける最大の課題の 1 つは、1 つの IP からあまりにも多くのリクエストを行った後にターゲット サイトによってブロックされることを回避することです。
Node-Unblocker は、ローテーション プロキシ ソリューションを実装する簡単な方法を提供します。
手順は次のとおりです。
const proxies = [
‘http://proxy1.com‘,
‘http://proxy2.com‘,
// etc
];
- 各リクエストの前に、プロキシをランダムに選択します。
function getRandomProxy() {
return proxies[Math.floor(Math.random() * proxies.length)];
}
- プロキシ経由で Web スクレイピング リクエストを実行します。
const proxy = getRandomProxy();
request(`${proxy}/targetUrl`);
リクエストごとにプロキシをローテーションすることで、ブロックされることなく大規模にスクレイピングできます。プロのヒント: 10 秒あたりのリクエスト速度の少なくとも XNUMX 倍のプロキシ プールを使用します。
地理的ブロックのバイパス
一部の Web サイトでは、訪問者の地理的位置に基づいてコンテンツへのアクセスを制限しています。
たとえば、次のサイト http://usanews.com 米国の IP からのトラフィックのみを許可します。 Node-Unblocker を使用すると、この制限を簡単に回避できます。
手順は次のとおりです。
ターゲット地域 (米国など) の居住用プロキシ IP を取得します。
これらの地域固有のプロキシを Node-Unblocker に追加します。
スクレーパーのトラフィックを Node-Unblocker 経由でルーティングします。
これで、すべてのリクエストが必要なリージョンからのものとして表示され、地理的にブロックされたコンテンツに正常にアクセスできるようになります。
この手法は、特定の国からのモバイル トラフィックをシミュレートするのにも機能し、地域をターゲットとしたモバイル アプリをスクレイピングするのに役立ちます。
JavaScript Web サイトのスクレイピング
最近のサイトは、コンテンツのレンダリングに JavaScript に大きく依存しています。 HTML のみをダウンロードする従来のスクレイパーでは、これらのインタラクティブなページを解析するのが困難です。
ありがたいことに、Node-Unblocker はデフォルトで WebSocket をプロキシするため、JS サイトのスクレイピングが可能になります。
// Enable websocket proxying
unblocker.listen().on(‘upgrade‘, unblocker.onUpgrade);
// Make request and JS will execute
request(‘http://jsSite.com‘);
サイトは実際のブラウザと同じような方法で JS をロードして実行し、データを正常に抽出できるようにします。
ただし、これはパブリック JavaScript サイトでのみ機能します。堅牢な JS レンダリングには、次のようなツールが必要です。 人形 代わりに推奨されます。
カスタムリクエストミドルウェアの適用
Node-Unblocker の最も強力な機能の 1 つは、カスタム ミドルウェアです。これらを使用してリクエストとレスポンスの両方を変更できます。
リクエスト ミドルウェアが Web スクレイピングにどのように役立つかの例をいくつか示します。
ユーザーエージェントのローテーション
多くのサイトは、リクエストごとに同じユーザー エージェントを送信するスクレイパーをブロックします。自動的に回転させることができます。
// Randomly choose User-Agent
unblocker.use((req, res) => {
const userAgents = [‘UA1‘, ‘UA2‘, ‘UA3‘];
req.headers[‘User-Agent‘] = userAgents[Math.floor(Math.random() * userAgents.length)];
});
今後は、各リクエストに異なるユーザー エージェントが設定され、このブロック戦術が防止されます。
自動ログイン
ログインが必要なサイトの場合、スクレイパー コードを変更せずに認証資格情報を追加できます。
unblocker.use((req, res) => {
if (req.url.includes(‘mysite.com‘)) {
req.headers[‘Authorization‘] = ‘Bearer xxx‘;
}
});
サイトへのリクエストにより、ユーザーは自動的にログインします。
特殊文字をエンコードする
一部のサイトでは、絵文字などの奇妙な文字をブロックしています。リクエストに対してカスタム エンコーディングを実行できます。
unblocker.use((req, res) => {
req.url = encodeURI(req.url);
// Encode headers, body etc
});
これにより、スクレイパーはブロックされることなく特殊文字を使用できるようになります。
ご覧のとおり、リクエスト ミドルウェアの可能性は無限です。
応答の処理
応答ミドルウェアを使用して応答データを変換することもできます。
データの解析と抽出
スクレイパーでデータ抽出を行うのではなく、ミドルウェアで直接データ抽出を行うことができます。
unblocker.use((req, res) => {
const $ = cheerio.load(res.body);
res.data = $(‘.result‘).text();
});
これで、スクレイパーは抽出されたデータを直接受け取り、コードを保存します。
機密データのフィルタリング
一部のサイトは、Cookie、ヘッダー、その他の不要なメタデータを返します。これをクリーンアップできます。
unblocker.use((req, res) => {
// Remove unnecessary cookies
res.headers[‘set-cookie‘] = [];
// Delete other unwanted headers
delete res.headers[‘x-rate-limit‘];
});
これにより、有用な応答データのみが得られます。
一般的なリクエストをキャッシュする
エンドポイントが頻繁にアクセスされるサイトの場合、レート制限に達しないようにキャッシュを構築できます。
// In-memory cache
const cache = {};
unblocker.use((req, res) => {
if (cache[req.url]) {
return cache[req.url];
}
cache[req.url] = res;
});
繰り返されるリクエストはキャッシュから直接処理されるようになりました。
ご覧のとおり、応答ミドルウェアは、データがスクレイパーに到達する前に Node-Unblocker 内でデータを処理するのに非常に強力です。
Node-Unblocker と他のプロキシの比較
Node-Unblocker は、Node.js スクレイパーに軽量のインプロセス プロキシを提供します。ただし、専用のプロキシ サービスも利用できます。長所と短所を比較してみましょう:
ノードアンブロッカー
メリット
- 軽量で高速
- カスタマイズ可能なミドルウェア
- ノードスクレーパーに直接統合
デメリット
- 独自のプロキシを管理する必要がある
- 限られた機能
- スケールに合わせて最適化されていない
ルミナティ
メリット
- 巨大なプロキシ プール
- 高度なプロキシ マネージャー
- Webスクレイピング用に作られました
デメリット
- 小型スクレーパーにはやり過ぎ
- 統合するための別のツール
スマートプロキシ
メリット
- 手頃な価格のプロキシ プラン
- 専用IPが利用可能
- REST API経由で統合
デメリット
- 別のアカウントが必要です
- 限定されたカスタマイズ
大規模な本番スクレイピングの場合は、Luminati や Smartproxy などの商用プロキシ サービスを強くお勧めします。プロキシ管理を処理し、API を介して統合を容易にします。
小規模から中規模のスクレイパーに対して、Node-Unblocker は優れたプロセス内オプションを提供します。必要に応じてカスタマイズできるため、非常に強力です。
一般的な問題とその解決方法
Node-Unblocker を使用するときに発生する可能性のある一般的な問題とそのトラブルシューティング方法を次に示します。
サイトブロッキング Node-Unblocker IP
これは、あまりにも多くのリクエストに同じ Node-Unblocker サーバーを使用した場合に発生する可能性があります。解決策は、Node-Unblocker にフィードするアップストリーム プロキシ IP を頻繁にローテーションすることです。
WebSocketが機能しない
あなたが持っていることを確認してください unblocker.listen().on(‘upgrade‘, unblocker.onUpgrade)
コード内で WebSocket プロキシを有効にします。
開いているファイル ハンドルが多すぎます
Node-Unblocker は、数千のリクエストを処理するときに、オープン ファイルの制限に達する可能性があります。 Linux でオープンできるファイルの最大数を増やすか、Nginx などのリバース プロキシを使用してソケットの処理を改善します。
サイトをスクレイピングするときのエラー
加えます debug
ミドルウェアを Node-Unblocker に送信して、すべてのリクエストをログに記録します。これは、どのリクエストが失敗しているかを正確に特定するのに役立ちます。
高いメモリ使用量
デフォルトでは、Node-Unblocker は応答本文をメモリにバッファリングするため、スパイクが発生する可能性があります。必要に応じてストリーミングを使用するか、バッファリングを無効にします。
Scrape() が遅い
Node-Unblocker は超高スループット向けに最適化されていません。速度を最大化する必要がある場合は、Smartproxy などの専用プロキシ サービスを使用してください。
ミドルウェアの実行順序
ミドルウェアの実行順序に留意してください。たとえば、応答ミドルウェアは、戻りの要求ミドルウェアより前に実行されます。
Node-Unblocker を適切に構成するには、試行錯誤が必要です。を参照してください。 ドキュメント 高度な構成オプション。
Node-Unblocker を大規模に導入する
Node-Unblocker を実稼働環境で実行するには、高負荷向けに設計されたサーバー上で Node-Unblocker を適切にホストする必要があります。
推奨されるアーキテクチャの 1 つを次に示します。
これは次の内容で構成されます。
ノードアンブロッカーアプリサーバー – これらには、メインのプロキシ アプリ ロジックが含まれています。高負荷の場合は、少なくとも 2 ~ 4 台のサーバーを使用します。
リバースプロキシ (Nginx) – Node-Unblocker フリートを前面に出し、それら全体で負荷のバランスをとります。 SSL およびその他のエッジ ルーティング ロジックも処理します。
データベース – キャッシュや統計などの永続化されたアプリ データを保存するには、Redis が適切に機能します。
アップストリームプロキシサーバー – Node-Unblocker にトラフィックをフィードする外部プロキシ IP。ここでは少なくとも 50 ~ 100 以上のプロキシを使用します。
クラウドホスティング – AWS や GCP などのプロバイダーを使用して、サーバー、負荷分散、フェイルオーバー、スケーラビリティを管理します。
Node-Unblocker 展開を適切に設計すると、100,000 日あたり XNUMX 件を超えるリクエストを問題なくサポートできます。起動前に必ず大規模なシステムのストレス テストを行ってください。
さらに大きな負荷の場合は、グローバル プロキシ インフラストラクチャを通じて数百万のリクエストを簡単に処理できる Oxylabs のような専用プロキシ サービスを利用します。
生産的な Web スクレイピングのベスト プラクティス
Node-Unblocker を使用した Web スクレイピングの成功を最大化するための一般的なヒントをいくつか紹介します。
ランダムな時間間隔を使用する – 固定された一定のペースではなく、ランダムな間隔でサイトをスクレイピングします。これは、ブロックを引き起こす可能性のあるトラフィック パターンを回避するのに役立ちます。
IPごとにリクエストを制限する – IP の書き込みを避けるために、アップストリーム プロキシ IP ごとの Node-Unblocker リクエストを 5 RPM などの適切な制限に制限します。
ターゲット地域の一致 – ターゲット サイトの視聴者と同じリージョンから発信されたプロキシ IP を使用します。これは、地理ベースのブロックを回避するのに役立ちます。
ログを使用してデバッグする – エラーを簡単に特定して再現できるように、リクエストのログを実装します。
ブロックから学ぶ – 実際にブロックされた場合は、使用されているブロックのアプローチを正確に検討し、今後ブロックされないように戦略を調整してください。
サーバーを定期的にローテーションする – プロキシ サーバーとインフラストラクチャを数か月ごとにローテーションして、すべての外部向け IP を更新します。
プロキシサービスを利用する – 独自のプロキシ インフラストラクチャの維持は複雑です。信頼性を高めるために、代わりにエンタープライズ プロキシ サービスを利用します。
Web スクレイピングは確かに難しい場合があります。ただし、Node-Unblocker などのツールを賢く活用し、ベスト プラクティスに従うことで、ほぼすべてのサイトからデータを正常に抽出できます。
主要な取り組み
この包括的な Node-Unblocker Web スクレイピング ガイドで取り上げた主な内容は次のとおりです。
- Node-Unblocker は、Web スクレイピング リクエストをルーティングするためのインプロセス プロキシ サーバーを提供します。
- プロキシ ローテーション、カスタム ミドルウェア、WebSocket サポートなどの重要な機能を実装できます。
- Node-Unblocker を適切に構成するには試行錯誤が必要です。デバッグを使用して問題を特定します。
- 大規模なスクレイピングの場合は、Luminati や Smartproxy などの専用プロキシ サービスを推奨します
- Web スクレイピングのベスト プラクティスに従うと、ブロックを回避し、データを確実に抽出できます。
Node-Unblocker は、外部サービスと比較してプロキシ ロジックをより詳細に制御できる多用途ツールです。スクレーパーに直接統合することで、次のレベルの可能性が広がります。
このガイドが Node-Unblocker と、Node-Unblocker がどのように Web サイトからのデータの抽出とスクレイピングを成功させるのに役立つのかを理解するのに役立つことを願っています。他にご質問がございましたらお知らせください。
幸せな(ブロック解除された)スクレイピング!