3

我遇到了来自名为 Kabum 的网上商店的一些网址。

网址是http://www.kabum.com.br/cgi-local/kabum3/produtos/descricao.cgi?id=01:02:23:55:159

如果我在地址栏中输入站点,或者单击链接,我会得到一个包含产品的页面,但如果我使用 Jsoup,我会得到一个页面,只有元刷新到相同的地址。

尝试设置用户代理、引荐来源网址并点击 meta 中的链接,但我得到了相同的页面。

我的代码在这里:

Document doc;
String url = "http://www.kabum.com.br/cgi-local/kabum3/produtos/descricao.cgi?id=01:02:23:55:159";
try {
    String ua = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0";
    String referrer = "http://www.google.com";
    doc = Jsoup.connect(url).timeout(20000).userAgent(ua).referrer(referrer).get();
    Elements meta = doc.select("html head meta");
    for (Iterator<Element> it = meta.iterator(); it.hasNext();) {
        Element element = it.next();
        if (element.attr("http-equiv").matches("refresh")) {
            String novaUrl = element.attr("content").replaceFirst("\\d?;url=", "");
            System.out.printf("redirecting to %s%n", novaUrl);
            doc = Jsoup.connect(novaUrl).userAgent(ua).referrer(referrer).get();
            break;
        }
    }
} catch (IOException ex) {
    Logger.getLogger(Teste1.class.getName()).log(Level.SEVERE, null, ex);
    return;
}
System.out.println(doc);
4

2 回答 2

2

很有意思。

是的,下面这行:<meta http-equiv="refresh" content="0;url=kabum.com.br/cgi-local/kabum3/produtos/…; />告诉浏览器刷新当前的 url。

所以看起来页面告诉浏览器不断刷新页面,直到服务器满足它正在寻找的任何标准。

您必须弄清楚服务器正在寻找什么标准。首先要检查的可能是 (1) jsoup 设置的重定向限制(如果它具有“跟随重​​定向”功能并且可以理解该meta标签),以及 (2) cookie。

于 2012-05-18T14:44:32.773 回答
2

您需要使用 cookie 重新发送请求。该站点正在返回一个它希望在下一个请求中看到的会话 cookie。

String url = "http://www.kabum.com.br/cgi-local/kabum3/produtos/descricao.cgi?id=01:02:23:55:159";
Map<String, String> cookies = Jsoup.connect(url).execute().cookies();
Document document = Jsoup.connect(url).cookies(cookies).get();
System.out.println(document.html());

请注意,您应该对要在同一会话中触发的每个后续请求使用相同的 cookie。

于 2012-05-18T14:57:41.220 回答