设置Java URLConnection的用户代理


79

我正在尝试使用带有URLConnection的Java解析网页。我尝试像这样设置用户代理:

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”。有没有一种方法可以在没有此添加的情况下真正设置用户代理?


您怎么知道这就是生成的用户代理?你在哪里看?
skaffman 2010年

1
通过使用PHP抓取并显示在Java抓取的页面上。
DiglettPotato

现在这实际上有效,请参阅第二个答案。
rogerdpack

Answers:


70

暂时,将http.agentsystem属性设置为""可以解决问题(我前面没有代码)。

您可能会摆脱:

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

但这可能需要您与URL协议处理程序的初始化之间进行竞争,如果它在启动时缓存了值(实际上,我认为不是)。

也可以通过JNLP文件(可从6u10的applet使用)和在命令行上设置该属性:

-Dhttp.agent=

或对于包装器命令:

-J-Dhttp.agent=

我该怎么办?c.setRequestProperty(“ http.agent”,“”);? 我正在假设其他地方...
DiglettPotato 2010年

1
是的...这就像一个魅力!只需执行以下操作:System.setProperty(“ http.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”); 然后您就可以出发了!:)
eduardo.lopes '16

93

只是为了澄清:setRequestProperty("User-Agent", "Mozilla ...")现在工作正常,并且不会java/xx在末尾追加!至少使用Java 1.6.30及更高版本。

我使用netcat(端口侦听器)在机器上侦听:

$ nc -l -p 8080

它只是在端口上侦听,因此您可以看到任何请求的内容,例如原始的HTTP标头。

并获得了以下不带setRequestProperty的http标头:

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());
    }

}

2
好吧,如果仍然使用Java 1.5
Dejell 2014年

3
@Dejell您是否建议此方法已过时?我正在使用Java 7,而这正是我想要的。
Shadoninja

5

对我来说,它的工作是 在addRequestProperty中设置User-Agent。

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");

无需强制转换为HttpURLConnection。
jechterhoff

1
@jechterhoff,它在Java 8中是必需的
FonzTech

@FonzTech我不明白为什么Java 8需要强制转换。以下程序在我的程序中工作(兼容Java 1.8):URL clSourceUrl = new URL(clSource); URLConnection urlConn = clSourceUrl.openConnection(); urlConn.setRequestProperty(“ User-Agent”,“ Mozilla / 5.0(Windows NT 6.1; Win64; x64; rv:56.0)Gecko / 20100101 Firefox / 56.0”); 请详细说明一下吗?
jechterhoff

@jechterhoff提供答案的用户HttpURLConnection。如果他使用的话你会是对的URLConnection。无论如何,HttpURLConnection c = new URL("http://www.google.com").openConnection();例如,如果您尝试编译此行,javacerror: incompatible types在该行上为您提供帮助。我使用的是Java 1.8.0 r172,因此是Java 8的最新版本
FonzTech '18

@FonzTech啊,现在我明白你的意思了。我在第一条评论中应该比较精确(对不起):我想说的是,您根本不需要在这里使用HttpURLConnection。显然,您也可以只使用URLConnection,如我之前的评论所示。我认为这可以稍微改善答案。在任何情况下,您都正确地HttpURLConnection c = new URL("http://www.google.com").openConnection();肯定需要强制转换为HttpURLConnection-在Java 8和Java的早期版本中。
jechterhoff

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.