Ich versuche, eine Webseite mit Java mit URLConnection zu analysieren. Ich versuche, den Benutzeragenten wie folgt einzurichten:
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");
Der resultierende Benutzeragent ist jedoch der von mir angegebene, an dessen Ende "Java / 1.5.0_19" angehängt ist. Gibt es eine Möglichkeit, den Benutzeragenten ohne diesen Zusatz wirklich festzulegen?
java
user-agent
DiglettPotato
quelle
quelle
Antworten:
Wenn Sie die
http.agent
Systemeigenschaft so einstellen ,""
dass sie den Trick macht (ich habe den Code nicht vor mir).Sie könnten davonkommen mit:
System.setProperty("http.agent", "");
Dies erfordert jedoch möglicherweise einen Wettlauf zwischen Ihnen und der Initialisierung des URL-Protokoll-Handlers, wenn der Wert beim Start zwischengespeichert wird (ich glaube nicht, dass dies der Fall ist).
Die Eigenschaft kann auch über JNLP-Dateien (verfügbar für Applets ab 6u10) und über die Befehlszeile festgelegt werden:
Oder für Wrapper-Befehle:
quelle
Nur zur Verdeutlichung: Funktioniert
setRequestProperty("User-Agent", "Mozilla ...")
jetzt einwandfrei und wirdjava/xx
am Ende nicht angehängt ! Zumindest mit Java 1.6.30 und neuer.Ich habe auf meinem Computer mit netcat (einem Port-Listener) zugehört:
$ nc -l -p 8080
Es lauscht einfach auf dem Port, sodass Sie alles sehen, was angefordert wird, wie z. B. rohe http-Header.
Und bekam die folgenden http-Header ohne 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
Und MIT 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
Wie Sie sehen, wurde der Benutzeragent richtig eingestellt.
Vollständiges Beispiel:
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()); } }
quelle
Seine Arbeit für mich setzt den User-Agent in der 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");
quelle
HttpURLConnection
. Du hättest recht gehabt, wenn er es benutzt hätteURLConnection
. Wenn Sie auf jeden Fall versuchen , diese Zeile zu kompilierenHttpURLConnection c = new URL("http://www.google.com").openConnection();
zum Beispieljavac
gibt Sieerror: incompatible types
auf dieser Linie. Ich verwende Java 1.8.0 r172, also die neueste Version von Java 8HttpURLConnection c = new URL("http://www.google.com").openConnection();
erfordert sicherlich eine Umwandlung in HttpURLConnection - in Java 8 und auch in früheren Versionen von Java.HTTP-Server neigen dazu, alte Browser und Systeme abzulehnen.
Die Seite Tech Blog (wh): Die meisten gängigen Benutzeragenten spiegelt die Benutzeragenteneigenschaft Ihres aktuellen Browsers im Abschnitt "Ihr Benutzeragenten ist:" wider, mit der die Anforderungseigenschaft "Benutzeragenten" eines
java.net.URLConnection
oder des Benutzers festgelegt werden kann Systemeigenschaft "http.agent".quelle