2010-03-27 105 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");