我正在使用jsoup庫,今天我遇到了問題。 我湊DuckDuckGo,並獲得每一個頁面的查詢結果的所有冠軍,但使用使用JSoup從所有頁面獲取結果
Document doc = Jsoup.connect("https://duckduckgo.com/html/?q=" + query).get();
我得到大約只有第一頁的結果。我怎樣才能繼續下一頁?
我正在使用jsoup庫,今天我遇到了問題。 我湊DuckDuckGo,並獲得每一個頁面的查詢結果的所有冠軍,但使用使用JSoup從所有頁面獲取結果
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();
}
好的男人,這個工程,但我真的不明白爲什麼,因爲我從來沒有研究過這樣的事情。我試圖通過第二頁但沒有任何結果。你能再給我一個例子嗎?真的非常感謝您的支持 –
如果有效,請點擊接受答案。如上所述,您需要使用Jsoup來提取當您單擊下一頁時提交的表單參數。 – Kamran
你能提供你的Java解決方案嗎? – Sergii
我做了一些網頁抓拍,你有兩個選擇: 1)看看網站是如何構建他們的網址的,所以你可以模仿下一頁的結果,2)嘗試搜索鏈接「下一頁」,獲取鏈接並通過jsoup訪問以獲得下一批結果,在「下一頁」鏈接被禁用或不存在的情況下重複。 –