Estoy tratando de analizar una página web usando Java con URLConnection. Intento configurar el agente de usuario de esta manera:
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");
Pero el agente de usuario resultante es el que especifico, con "Java / 1.5.0_19" adjunto al final. ¿Hay alguna forma de configurar realmente el agente de usuario sin esta adición?
java
user-agent
DiglettPotato
fuente
fuente
Respuestas:
De forma indirecta, configurar la
http.agent
propiedad del sistema en""
podría funcionar (no tengo el código frente a mí).Puede salirse con la suya:
System.setProperty("http.agent", "");
pero eso podría requerir una carrera entre usted y la inicialización del controlador del protocolo URL, si almacena en caché el valor al inicio (en realidad, no creo que lo haga).
La propiedad también se puede configurar a través de archivos JNLP (disponibles para applets de 6u10) y en la línea de comando:
O para los comandos de envoltura:
fuente
Solo para aclarar: ¡
setRequestProperty("User-Agent", "Mozilla ...")
ahora funciona bien y no se adjuntajava/xx
al final! Al menos con Java 1.6.30 y versiones posteriores.Escuché en mi máquina con netcat (un oyente de puerto):
$ nc -l -p 8080
Simplemente escucha en el puerto, por lo que ve todo lo que se solicita, como encabezados http sin procesar.
Y obtuve los siguientes encabezados http sin 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
Y CON 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
Como puede ver, el agente de usuario se configuró correctamente.
Ejemplo completo:
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()); } }
fuente
su trabajo para mí establece el agente de usuario en el 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");
fuente
HttpURLConnection
. Habrías tenido razón si lo hubiera usadoURLConnection
. De todos modos, si intenta compilar esta líneaHttpURLConnection c = new URL("http://www.google.com").openConnection();
por ejemplo,javac
le daráerror: incompatible types
en esa línea. Estoy usando Java 1.8.0 r172, por lo que la versión más reciente de Java 8HttpURLConnection c = new URL("http://www.google.com").openConnection();
ciertamente requiere una conversión a HttpURLConnection, en Java 8 y también en versiones anteriores de Java.Los servidores HTTP tienden a rechazar los navegadores y sistemas antiguos.
La página Tech Blog (wh): Agentes de usuario más comunes refleja la propiedad de agente de usuario de su navegador actual en la sección "Su agente de usuario es:" , que se puede aplicar para establecer la propiedad de solicitud "Agente de usuario" de
java.net.URLConnection
ao el propiedad del sistema "http.agent".fuente