2017-08-29 71 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