Java 使用JSoup从所有页面获取结果

Java 使用JSoup从所有页面获取结果,java,jsoup,Java,Jsoup,我正在使用jsoup库,今天我遇到了一个问题。 我必须抓取DuckDuckGo并获取每页查询结果的所有标题,但使用 Document doc = Jsoup.connect("https://duckduckgo.com/html/?q=" + query).get(); 我只得到关于第一页的结果。如何继续下一页?您需要从每个页面提取表单参数,以获取下一页的请求参数。这就是为什么: public static Map<String, String> getFormParams

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

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

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

您需要从每个页面提取表单参数,以获取下一页的请求参数。这就是为什么:

   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();
    }
公共静态映射getFormParams(最终文档文档){
返回单据选择(“div.nav-link>表单”)
.first()
.选择(“输入”)
.stream()
.filter((输入)->{
返回input.attr(“name”)!=null&&!input.attr(“name”).equals(“”);
})
.collect(Collectors.toMap(输入->输入.attr(“名称”)、输入->输入.attr(“值”));
}
公共静态void main(最终字符串…args)引发IOException{
最终字符串baseURL=”https://duckduckgo.com/html";
最终连接conn=Jsoup.connect(baseURL)
.userAgent(“Mozilla/5.0(Linux;Android 4.0.4;Galaxy Nexus Build/IMM76B)AppleWebKit/535.19(KHTML,如Gecko)Chrome/18.0.1025.133 Mobile Safari/535.19”);
conn.data(“q”,“搜索短语”);//更改“搜索短语”
//第一页
最终文件第1页=连接获取();
最终映射formParams
=getFormParams(第1页);
//第二页
最终文档page2=conn.data(formParams.get();
}

你也可以提供你的java解决方案吗?我做了一些Websplaping,你有两个选择:1)查看网站如何构建URL,这样你就可以模拟下一页的结果;2)尝试搜索链接“下一页”,获取链接并使用jsoup访问以获取下一批结果,在“下一页”之后重复链接被禁用或不存在。好吧,伙计,这是可行的,但我真的不明白为什么,因为我从来没有学过这样的东西。我想翻阅第二页,但没有结果。你能再举一个例子吗?非常感谢您的可用性如果有效,请单击以接受答案。如前所述,您需要使用Jsoup提取表单参数,当您单击下一页时,表单参数将被提交。