【问题标题】:How to manage cookies with Jsoup?如何使用 Jsoup 管理 cookie?
【发布时间】:2012-02-22 13:36:17
【问题描述】:

Jsoup 中是否有一个简单的 cookie 管理器,可以按主机存储 cookie? this thread 中的示例非常缺乏。

【问题讨论】:

  • Apache HttpClient 怎么样?我一直在使用它。它与 cookie 配合得非常好。

标签: java cookies jsoup


【解决方案1】:

我没有找到适用于 Jsoup 的标准解决方案。这是我使用 HashMap 进行的简单 cookie 处理。它可能缺少一些功能,但我希望它对我的基本爬虫来说足够好:

private static HashMap<String, HashMap<String, String>> host2cookies = new HashMap<String, HashMap<String, String>>();

public static String[] DownloadPage(URL url) throws Exception
{
    Connection con = Jsoup.connect(url.toString()).timeout(600000);
    loadCookiesByHost(url, con);


    Document doc = con.get();
    url = con.request().url();

    storeCookiesByHost(url, con);

    return new String[]{url.toString(), doc.html()};
}

private static void loadCookiesByHost(URL url, Connection con) {
    try {
        String host = url.getHost();
        if (host2cookies.containsKey(host)) {
            HashMap<String, String> cookies = host2cookies.get(host);
            for (Entry<String, String> cookie : cookies.entrySet()) {
                con.cookie(cookie.getKey(), cookie.getValue());
            }
        }
    } catch (Throwable t) {
        // MTMT move to log
        System.err.println(t.toString()+":: Error loading cookies to: " + url);
    }
}

private static void storeCookiesByHost(URL url, Connection con) {
        try {
            String host = url.getHost();
            HashMap<String, String> cookies = host2cookies.get(host);
            if (cookies == null) {
                cookies = new HashMap<String, String>();
                host2cookies.put(host, cookies);
            }
            cookies.putAll(con.response().cookies());
        } catch (Throwable t) {
            // MTMT move to log
            System.err.println(t.toString()+":: Error saving cookies from: " + url);
        }    
}   

【讨论】:

  • 您可以使用 Connection#cookies(cookies) 将映射中的所有 cookie 添加到连接,而不是遍历 loadCookiesByHost(..) 中的 cookies 的条目。
【解决方案2】:

Connection.Base 类包含您需要了解的有关 jsoup 如何处理 cookie 的所有信息。

本质上,它可以让您在每个连接上获取和设置它们,但除此之外,由您来“管理”它们。

【讨论】:

  • 你有例子吗?
  • API 非常清晰。尝试使用它,如果您遇到困难,我很乐意为您提供任何指示。
猜你喜欢
  • 2023-04-01
  • 2016-12-10
  • 1970-01-01
  • 2015-02-17
  • 2012-04-11
  • 2017-02-20
  • 1970-01-01
  • 2020-11-03
  • 2015-06-22
相关资源
最近更新 更多