0

150 スレッドの Apache HttpComponents を使用して、約 5000 の異なる URL の HTML ソース コードをダウンロードしています。

URL はLinkedBlockingQueueSourceGetterThreads可能な場合はキューから取得されます。次に、スレッドが を使用してソース コードをダウンロードしようとしますEntityUtils.toString(HttpClient.execute().getEntity)。次に、HTML ソース コードの文字列表現が別LinkedBlockingQueueのキューに配置されます。そこでは、2 番目のキューから取得したソース コードに対して有用な作業を実行する準備ができているさらに 10 個のスレッドがあります。

私の問題は、ソース コードで実行されている作業に誤りがあることに気付いたことにあります。Matcher特定のパターンを照合し、見つかったパターンを記録するために使用しています。ただし、ソース コードが正しくなく、URL と一致しない場合があります (つまり、Java メモリに保存されたソース コードが、Chrome または FireFox で表示したときのソース コードと同じではありません)。これはランダムに見えるため、ソース コードが正しい場合と正しくない場合があります。

これがなぜなのか誰か知っていますか?

4

1 に答える 1

0

ほとんどの場合、ページを取得しようとしているサイトは、User-Agent. そのため、分析結果に基づいて異なるコンテンツを簡単に返すことができます。これには多くの理由があります。

  1. 検索ロボットに適切な情報を提供する
  2. Web クローラーによるサイトのコンテンツの取得を拒否する
  3. モバイル デバイスを認識し、ユーザーにさまざまな HTML/CSS/JS を提供する
  4. 同じサイトを集中的にクエリしている場合、ある種の DOS 攻撃保護がトリガーされ、通常のコンテンツの代わりにスタブ エラー ページが返される可能性があります。

ブラウザと同じコンテンツを取得したい場合、クライアントに対する最も基本的な推奨事項は、ブラウザのように動作することです。

  1. 常にUser-Agentヘッダーを提供する
  2. HTTP リダイレクトに従う (HTTP コード 302、303)
  3. 必要に応じて Cookie と認証ルーチンを維持する
  4. HTTPS スキームをサポートする準備を整える

実行しようとしているソース コードがなければ、それ以上のことは言えませんが、使用している Apache HTTP クライアントは間違いなくこれらすべてのことを実行できます。たとえば、User-Agent値を設定する方法は次のとおりです。

String url = "http://www.google.com/search?q=httpClient";
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(url);
request.addHeader("User-Agent","Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2");
HttpResponse response = client.execute(request);
于 2013-10-12T22:49:11.373 に答える