0

我正在尝试获取此页面(它是中文的,对此感到抱歉):

亚马逊(dot)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();
    }
}

但是在多次运行这段代码之后,我发现我随机得到了两个不同的结果(见截图http://www.flickr.com/photos/31629891@N07/4173636464/

无论我在浏览器中刷新此页面多少次,它都会返回相同的结果。

我想知道为什么会这样?

4

4 回答 4

0

在我看来,这是亚马逊的问题。也许你应该问他们这个。

于 2009-12-10T04:33:00.160 回答
0

您应该检查程序发送的流量并将其与浏览器发送的流量进行比较。使用 Fiddler 捕获浏览器事务,使用 Wireshark 捕获程序的事务(或两者都使用 Wireshark)。您可能会发现导致服务器返回不同结果的细微差别可能与 cookie 有关。

于 2009-12-10T04:36:48.390 回答
0

亚马逊付出了很多努力来根据(潜在)客户可能想要购买的东西来定制搜索结果。(对于外部观察者)发生的各种事情都不是完全可预测/可解释的。我可以说更多......但我认为我仍然处于 NDA 之下。

简而言之,您的应用程序总是看到不同的结果,我并不感到惊讶。

编辑:顺便说一句,如果您出于某种原因对亚马逊网站进行屏幕抓取,则应注意“使用条件”页面的以下摘录:

亚马逊授予您访问和个人使用本网站的有限许可,除非经亚马逊明确书面同意,否则不得下载(页面缓存除外)或修改本网站或其任何部分。本许可不包括对本网站或其内容的任何转售或商业使用;任何产品列表、描述或价格的任何收集和使用;本网站或其内容的任何衍生使用;为其他商家的利益下载或复制账户信息;或任何使用数据挖掘、机器人或类似的数据收集和提取工具。未经亚马逊明确书面同意,不得出于任何商业目的复制、复制、复制、出售、转售、访问或以其他方式利用本网站或本网站的任何部分。未经明确书面同意,您不得构图或使用构图技术附上亚马逊的任何商标、徽标或其他专有信息(包括图像、文本、页面布局或表格)。未经亚马逊明确书面同意,您不得使用任何使用亚马逊名称或商标的元标签或任何其他“隐藏文本”。任何未经授权的使用都会终止亚马逊授予的许可或许可。您被授予有限的、可撤销的和非独家的权利来创建指向 Amazon.com 主页的超链接,只要该链接不以虚假、误导、贬损或其他冒犯性的方式描述亚马逊或其产品或服务.

简而言之,获得许可。

于 2009-12-10T05:13:51.480 回答
0

您可能可以通过在请求中添加 HTTP Cache-Control: no-cache 标头来消除这种可变性(请参阅http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html)。否则,您的请求可能会被通往 Amazon 的“原始 Web 服务器”的路由中的许多中间 HTTP 缓存中的任何一个满足,并且这些缓存可能各自具有不同的页面版本,具体取决于 Amazon 允许缓存页面副本的时间长短. 如果网站为不一定必须是最新的内容牺牲一点一致性,那么网站将获得更高的可扩展性。

一旦您的请求进入 Amazon 数据中心,同样会为可扩展性牺牲一致性。它可以负载平衡到任何免费的 Web 服务器,并且该 Web 服务器通常可以利用页面上组件的不同来源。也许不同之处在于页面是由存储在两个不同的 memcached(分布式内存缓存)机器集群上的部分组装而成的。

最重要的是,正如@Stephen C 所暗示的那样,您可能会看到个性化效果。

于 2009-12-10T06:06:44.670 回答