【问题标题】:Fetch webpage, get different results?获取网页,得到不同的结果?
【发布时间】:2009-12-12 11:52:13
【问题描述】:

我正在尝试获取这个页面(它是中文的,很抱歉):

amazon(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/

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

我想知道为什么会这样?

【问题讨论】:

  • 可能是 cookie 问题。尝试启用cookie。

标签: java webpage


【解决方案1】:

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

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

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

亚马逊授予您有限的许可 访问和个人使用 网站而不是下载(除了 页面缓存)或修改它,或任何 它的一部分,除了快递 亚马逊的书面同意。这个 许可证不包括任何转售或 将本网站或其 内容;任何收集和使用 任何产品列表、描述或 价格;对此的任何衍生用​​途 网站或其内容;任何下载 或复制帐户信息 另一个商人的利益;或者 任何使用数据挖掘、机器人或 类似的数据收集和提取 工具。本网站或任何部分 本站不得转载, 复制,复制,出售,转售, 访问或以其他方式利用 任何未经明示的商业目的 亚马逊的书面同意。你不可以 框架或利用框架技术 附上任何商标、标志或其他 专有信息(包括 图像、文本、页面布局或表格)的 亚马逊没有明确书面 同意。您不得使用任何元标记 或任何其他“隐藏文本”利用 亚马逊的名称或商标 亚马逊的明确书面同意。 任何未经授权的使用都会终止 由授予的许可或许可 亚马逊。你被授予有限的, 可撤销且非排他性的权利 创建一个指向主页的超链接 只要链接有效,Amazon.com 不得描绘亚马逊或其产品或 提供虚假、误导性的服务, 贬义的,或以其他方式冒犯的 事情。您不得使用任何亚马逊 徽标或其他专有图形或 商标作为链接的一部分,没有 明确的书面许可。

简而言之,获得许可。

【讨论】:

  • 更多提示好吗?问题是这样的:当我使用浏览器时,总是显示售罄的商品,但是当我使用java代码获取相同的页面时,这些售罄的商品有时会被隐藏。
  • 我真的无能为力,尤其是因为我不知道。我建议您尝试联系亚马逊,解释您要做什么,并寻求建议。他们可能不会忽视你。 (我知道一些“反馈”电子邮件确实会传达给您可以做些什么的人。)
  • 哦,我没注意到,谢谢提醒。顺便说一句,我正在做的只是一个学生项目,作为信息搜索和检索课程的家庭作业。我不够小心,对此感到抱歉。
【解决方案2】:

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

【讨论】:

  • 我想他们会直接无视我的:(
  • @tomtung - 如果你不问他们肯定会忽略你:-)
【解决方案3】:

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

【讨论】:

  • 我抓取了浏览器发送的包,并在代码中添加了相应的header字段定义(“Accept-Encoding”除外,即“gzip,deflate”),但似乎没有工作。我认为可能不是饼干。当我使用禁用 cookie 的浏览器时,它返回的结果仍然是正确的。
【解决方案4】:

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

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

除此之外,正如@Stephen C 所暗示的那样,您可能会看到个性化效果。

【讨论】:

  • 嗯,所以这种可变性似乎发生在亚马逊数据中心内部,或者是由于个性化影响。
猜你喜欢
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多