私がしていることは:
- ページをクロールする
- ページのすべてのリンクを取得し、それらをリストに入れる
- リストの各リンクにアクセスする新しいクローラーを開始する
- それらをダウンロードする
ページにアクセスしたときにリンクを直接ダウンロードできる、より迅速な方法が必要ですか? どうも!
このプロセスは、 crawler4j によって自動的に行われます。最初に 1 つ以上のシード ページを追加します。これらは、最初にフェッチされて処理されるページです。次に、crawler4j はこれらのページ内のすべてのリンクを抽出し、shouldVisit 関数に渡します。それらすべてを本当にクロールしたい場合、この関数はすべての関数で true を返す必要があります。特定のドメイン内のページのみをクロールする場合は、URL を確認し、それに基づいて true または false を返すことができます。
shouldVisit が true を返す URL は、クローラー スレッドによってフェッチされ、同じプロセスが実行されます。
ここにあるコード例は、開始するのに適したサンプルです。
一般的なアプローチは、クロールタスクとダウンロードタスクを別々のワーカースレッドに分割し、メモリ要件(つまり、このすべての情報を格納するために使用する最大RAM)に応じてスレッド数を最大にすることです。
ただし、crawler4jはすでにこの機能を提供しています。ダウンロードとクロールを別々のスレッドに分割することで、接続の使用率を最大化し、接続が処理できる限り多くのデータを取得し、情報を提供するサーバーが送信できるようにします。これに対する自然な制限は、1,000スレッドを生成した場合でも、サーバーに毎秒0.3kのコンテンツしか提供されない場合でも、ダウンロードするのは毎秒300KBにすぎないことです。しかし、あなたはそれのその側面を制御することはできません、私は恐れています。
速度を上げるもう1つの方法は、インターネットへのパイプが太いシステムでクローラーを実行することです。これは、最大ダウンロード速度が、現在データを取得できる速度の制限要因であるためです。たとえば、AWSインスタンス(またはクラウドアプリケーションプラットフォームのいずれか)でクロールを実行している場合、バックボーンへの非常に高速な接続の恩恵を受け、ウェブサイトのコレクションをクロールするのにかかる時間を短縮します。自宅やオフィスの接続で得られる帯域幅をはるかに超えて帯域幅を効果的に拡張します(つまり、ISPで働いている場合を除く)。
理論的には、パイプが非常に大きい状況では、ローカル(またはネットワーク)ディスクストレージに保存するデータについて、制限がディスクの最大書き込み速度になり始める可能性があります。