0

このページを取得しようとしています (中国語で申し訳ありません):

アマゾン (ドット) cn/s?rh=n:663227051

次のコードを使用します。

import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

public class Application {
    public static void main(String[] args) throws IOException, InterruptedException {
        final URL url = new URL("http://www.amazon.cn/s?rh=n:663227051");
        final String agentString = "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)";

        URLConnection urlConnection = url.openConnection();
        urlConnection.setRequestProperty("User-Agent", agentString);

        InputStreamReader streamReader = new InputStreamReader(urlConnection.getInputStream());
        BufferedReader reader = new BufferedReader(streamReader);

        final String path = "d:\\desktop\\Test.html";
        FileWriter writer = new FileWriter(path);
        writer.write("");
        String line;
        while ((line = reader.readLine()) != null)
            writer.append(line).append(System.getProperty("line.separator"));
        writer.close();
    }
}

しかし、このコードを数回実行した後、ランダムに 2 つの異なる結果が得られることがわかりました (こちらのスクリーンショットを参照してください http://www.flickr.com/photos/31629891@N07/4173636464/ ) 。

このページをブラウザで何度更新しても、同じ結果が返されます。

なぜそうなのか?

4

4 に答える 4

0

HTTP Cache-Control:no-cacheヘッダーをリクエストに追加することで、この変動の一部を取り除くことができます(http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.htmlを参照)。そうしないと、Amazonの「オリジンウェブサーバー」へのルートに沿ったいくつかの中間HTTPキャッシュのいずれかによってリクエストが満たされる可能性があり、Amazonがページのコピーをキャッシュできる期間に応じて、これらのキャッシュにはそれぞれ異なるバージョンのページが含まれる可能性があります。 。Webサイトは、完全に最新である必要はないコンテンツの一貫性を少し犠牲にすると、はるかに高いスケーラビリティを得ることができます。

リクエストがAmazonデータセンターに入ると、スケーラビリティのための一貫性の同じ犠牲が当てはまります。無料のWebサーバーに負荷分散することができ、そのWebサーバーは通常、ページ上のコンポーネントのさまざまなソースを利用できます。おそらく違いは、ページがmemcached(分散インメモリキャッシュ)マシンの2つの異なるクラスターに格納されているパーツから組み立てられたことです。

さらに、@ Stephen Cがほのめかしているように、パーソナライズ効果が見られる場合があります。

于 2009-12-10T06:06:44.670 に答える
0

どうやらAmazon側の問題のようです。多分あなたはこれについて彼らに尋ねるべきです。

于 2009-12-10T04:33:00.160 に答える
0

プログラムから送信されるトラフィックを調べて、ブラウザが送信するものと比較する必要があります。Fiddler を使用してブラウザー トランザクションをキャプチャし、Wireshark を使用してプログラムのトランザクションをキャプチャします (または両方に Wireshark を使用します)。おそらく、サーバーが異なる結果を返す原因となっている微妙な違いがあり、おそらく Cookie に関係していることがわかるでしょう。

于 2009-12-10T04:36:48.390 に答える
0

Amazon は、検索結果を (潜在的な) 顧客が購入する可能性が高いものに合わせて調整するために多大な努力を払っています。(外部の観察者にとって)正確に予測可能/説明可能ではない、あらゆる種類のことが起こります。もっと言えばいいのですが、まだ秘密保持契約を結んでいると思います。

要するに、アプリケーションが常に異なる結果を表示していることに驚きはありません。

編集: ところで、何らかの理由で Amazon サイトのスクリーン スクレイピングを行っている場合は、「使用条件」ページからの次の抜粋に注意を払う必要があります。

Amazon は、Amazon の書面による明示的な同意がある場合を除き、このサイトにアクセスして個人的に使用するための限定的なライセンスをお客様に付与します。このライセンスには、このサイトまたはそのコンテンツの再販または商用利用は含まれません。製品リスト、説明、または価格の収集および使用。このサイトまたはそのコンテンツの派生的使用。別のマーチャントの利益のためにアカウント情報をダウンロードまたはコピーすること。または、データ マイニング、ロボット、または同様のデータ収集および抽出ツールの使用。このサイトまたはこのサイトの一部は、Amazon の書面による明示的な同意なしに、商業目的で複製、複製、コピー、販売、転売、訪問、またはその他の方法で利用することはできません。書面による明示的な同意なしに、Amazon の商標、ロゴ、またはその他の専有情報 (画像、テキスト、ページ レイアウト、またはフォームを含む) を囲むためにフレームを作成したり、フレーム技術を利用したりすることはできません。Amazonの書面による明示的な同意なしに、Amazonの名前または商標を利用したメタタグまたはその他の「隠しテキスト」を使用することはできません。無許可で使用すると、Amazon によって付与された許可またはライセンスが終了します。Amazon.com のホームページへのハイパーリンクを作成する限定的、取消可能、かつ非独占的な権利が付与されます。 ただし、そのリンクが、虚偽、誤解を招く、中傷的、またはその他の不快な方法で Amazon またはその製品またはサービスを描写していない場合に限ります。 .

要するに、GET PERMISSION です。

于 2009-12-10T05:13:51.480 に答える