2010-03-27 102 views
68

我想用URLConnection解析一個使用Java的網頁。我嘗試建立的用戶代理是這樣的:設置java URLConnection的用戶代理

java.net.URLConnection c = url.openConnection(); 
c.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); 

但由此產生的用戶代理是一個我指定,用「的Java/1.5.0_19」追加到末尾。有沒有一種方法來真正設置用戶代理沒有這個補充?

+0

你怎麼知道這是由此產生的用戶代理?你在哪裏看到它? – skaffman 2010-03-27 15:02:06

+1

通過PHP獲取並在Java抓取的頁面上顯示它。 – DiglettPotato 2010-03-27 15:44:09

回答

53

Off-off,將http.agent系統屬性設置爲""可能會訣竅(我沒有在我面前的代碼)。

你也許可以僥倖逃脫:

System.setProperty("http.agent", ""); 

但可能需要您和URL協議處理程序的初始化之間的比賽,如果緩存在啓動時(實際上,我不認爲它的價值)。

屬性也可以通過JNLP文件(可從6u10中的小程序)設置和命令行:

-Dhttp.agent= 

或者用於包裝命令:

-J-Dhttp.agent= 
+0

我該怎麼做? c.setRequestProperty( 「http.agent」, 「」);?我假設別的地方... – DiglettPotato 2010-03-27 16:18:37

+0

http://www.innovation.ch/java/HTTPClient/advanced_info.html - > http.agent – Karussell 2010-03-27 16:44:34

+0

@diglettpotato我錯過了這個詞系統。系統屬性。回答編輯... – 2010-03-27 17:23:08

76

只是澄清:setRequestProperty工作得很好!至少在Java 1.6.30中。

我聽我的機器上使用netcat的(一個端口監聽):

$ nc -l -p 8080 

它只是監聽的端口,讓你看到它獲取要求,像原始HTTP報頭什麼。

,得到了下面的HTTP報頭,而不調用setRequestProperty:

GET /foobar HTTP/1.1 
User-Agent: Java/1.6.0_30 
Host: localhost:8080 
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 
Connection: keep-alive 

,並與調用setRequestProperty:

GET /foobar HTTP/1.1 
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 
Host: localhost:8080 
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 
Connection: keep-alive 

正如你所看到的用戶代理進行正確設置。

完整的示例:

import java.io.IOException; 
import java.net.URL; 
import java.net.URLConnection; 


public class TestUrlOpener { 

    public static void main(String[] args) throws IOException { 
     URL url = new URL("http://localhost:8080/foobar"); 
     URLConnection hc = url.openConnection(); 
     hc.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); 

     System.out.println(hc.getContentType()); 
    } 

} 
+12

這應該是被接受的答案。 – 2014-06-16 08:57:59

+2

那麼,如果仍然使用Java 1.5 – Dejell 2014-12-31 18:07:38

+0

@Dejell您是否建議這種方法已過時?我正在使用Java 7,而這正是我想要的。 – Shadoninja 2016-06-23 04:09:45

1

它的工作對我來說 設置的User-Agent在addRequestProperty。

URL url = new URL(<URL>); 
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); 
httpConn.addRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0");