2011-12-08 99 views
1

這可能是一個愚蠢的問題,其答案顯而易見......但我無法得到它。查看頁面源代碼vs HTTPURLConnection

我試圖讀取使用Java程序的網頁srouce如下圖所示:

URL url = new URL(urlValue); 
HttpURLConnection urlc = (HttpURLConnection) url.openConnection(); 
BufferedInputStream buffer = new BufferedInputStream(urlc.getInputStream()); 
StringBuilder builder = new StringBuilder(); 
byte[] by = new byte[1024]; 
int byteRead; 
while ((byteRead = buffer.read(by)) != -1){ 
    builder.append(new String(by, 0, byteRead)); 
} 
buffer.close(); 

這是所有工作正常,我可以看到網頁的源文件... 當我打開在同一網址瀏覽器並右鍵單擊它並查看頁面源代碼。 Java程序的頁面源與我從瀏覽器中看到的不一樣。

我只是想知道原因。 我錯過了什麼嗎? 我該怎麼做才能從java程序中得到完全相同的結果?

感謝, 伊爾凡

+1

有什麼不同?查看源代碼顯示瀏覽器在渲染過程中所做的更改,以及某些情況下腳本所做的更改,例如IE將剝離屬性和正常化大小寫的引號...... –

回答

0

根據網站的邏輯,也可以通過用戶代理進行過濾應用程序。

嘗試把不同的「用戶代理」標頭。

的另一個原因沒有得到正確的頁面是,你不處理重定向。例如,如果您打開wsj.com,您的瀏覽器會自動重定向到online.wsj.com。爲了管理這種情況,請在apache httpclient庫中查看實現此功能的位置。

+0

謝謝...我會檢查該問題。 – irbash

0
  1. 我覺得你的頁面必須內的其他頁面的引用。雖然你的瀏覽器通過這些引用自動讀取文件,你應該分析你已經有了HTML和人工讀取引用(或使用一些框架)
  2. 網站(urlValue)可以理解,你是機器人(通過用戶代理)和不要返回頁面的內容。嘗試通過tcpmon嗅探你的連接。
+0

謝謝...我會嘗試設置用戶代理並嘗試... – irbash

+0

我正在嘗試使用htmlUnit的相同的東西...我得到類似的結果,像java程序,以及... – irbash

0

我不會這麼做。

builder.append(new String(by, 0, byteRead));

相反,讀取所有字節爲ByteArrayOutputStream,然後轉換爲字符串。

在UTF-8或類似的字符集的情況下,一個符號並不總是一個字節。讀入緩衝區的最後一個字節可能是多字節字符的一部分。當您轉換爲字符串時,字符串可能不正確,因爲最後一個字符未完成。

0
urlc.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36"); 

通過添加此行將解決您的問題。我在這方面的研究,我發現這個主題沒有解決方案,但結束了我嘗試了各種方法,這顯示了我想要的。