【问题标题】:Get results from all the pages using JSoup使用 JSoup 从所有页面获取结果
【发布时间】:2018-02-07 04:34:33
【问题描述】:

我正在使用 jsoup 库,今天我遇到了问题。 我必须抓取 DuckDuckGo 并获取每个页面的查询结果的所有标题,但使用

Document doc = Jsoup.connect("https://duckduckgo.com/html/?q=" + query).get();

我只得到关于第一页的结果。如何继续阅读下一页?

【问题讨论】:

  • 你能提供你的java解决方案吗?
  • 我做了一些网页抓取,你有 2 个选择:1) 看看网站如何构建他们的 url,这样你就可以模仿下一页的结果,2) 尝试搜索链接“next page”,获取链接并使用jsoup访问以获得下一批结果,在“下一页”链接被禁用或不存在后重复。

标签: java jsoup


【解决方案1】:

你需要从每个页面中提取表单参数来获取下一页的请求参数。方法如下:

   public static Map<String, String> getFormParams(final Document doc) {
        return doc.select("div.nav-link > form")
                .first()
                .select("input")
                .stream()
                .filter((input) -> {
                    return input.attr("name") != null && !input.attr("name").equals("");
                })
                .collect(Collectors.toMap(input -> input.attr("name"), input -> input.attr("value")));
    }

    public static void main(final String... args) throws IOException {
        final String baseURL = "https://duckduckgo.com/html";
        final Connection conn = Jsoup.connect(baseURL)
                .userAgent("Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19");
        conn.data("q", "search phrase"); // Change "search phrase"

        // 1st page
        final Document page1 = conn.get();

        final Map<String, String> formParams
                = getFormParams(page1);

        // 2nd page
        final Document page2 = conn.data(formParams).get();
    }

【讨论】:

  • 好吧,这行得通,但我真的不明白为什么,因为我从来没有研究过这样的东西。我试图翻过第二页,但没有任何结果。你能再给我一个例子吗?非常感谢您的光临
  • 如果有效,请点击接受答案。如前所述,您需要使用 Jsoup 提取单击下一页时提交的表单参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-08
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 2017-10-14
相关资源
最近更新 更多