2017-08-29 72 views
1

我正在使用jsoup库,今天我遇到了问题。 我凑DuckDuckGo,并获得每一个页面的查询结果的所有冠军,但使用使用JSoup从所有页面获取结果

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

我得到大约只有第一页的结果。我怎样才能继续下一页?

+0

你能提供你的Java解决方案吗? – Sergii

+0

我做了一些网页抓拍,你有两个选择: 1)看看网站是如何构建他们的网址的,所以你可以模仿下一页的结果,2)尝试搜索链接“下一页”,获取链接并通过jsoup访问以获得下一批结果,在“下一页”链接被禁用或不存在的情况下重复。 –

回答

0

您需要从每个页面中提取表单参数以获取下一页的请求参数。这是如何:

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(); 
    } 
+0

好的男人,这个工程,但我真的不明白为什么,因为我从来没有研究过这样的事情。我试图通过第二页但没有任何结果。你能再给我一个例子吗?真的非常感谢您的支持 –

+0

如果有效,请点击接受答案。如上所述,您需要使用Jsoup来提取当您单击下一页时提交的表单参数。 – Kamran