2011-07-05 20 views
31

Estoy tratando de analizar la página principal de Facebook con JSoup pero siempre obtengo el código HTML para dispositivos móviles y no la versión para navegadores normales (en mi caso, Firefox 5.0).JSoup UserAgent, cómo configurarlo ¿verdad?

Soy la creación de mi agente de usuario de la siguiente manera:

doc = Jsoup.connect(url) 
     .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0") 
     .get(); 

¿Estoy haciendo algo mal?

EDIT:

que se acaba de analizar http://whatsmyuseragent.com/ y parece que el agente de usuario está trabajando. Ahora es aún más confuso para mí por qué el sitio http://www.facebook.com/ devuelve una versión diferente al usar JSoup y mi navegador. Ambos están usando el mismo agente de uso ....

Me di cuenta de este comportamiento en algunos otros sitios también ahora. Si pudiera explicarme qué es el problema, estaría más que feliz.

+2

No puedo ser el único que tiene este tema, o soy yo? – Markus

+0

Gracias Markus. Agregar user agent solo solucionó mi problema – Bloomberg58

Respuesta

43

Usted puede tratar de establecer el encabezado de referencia, así:

doc = Jsoup.connect("https://www.facebook.com/") 
     .userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6") 
     .referrer("http://www.google.com") 
     .get(); 
+0

¿Cómo funciona? – Silentbang

+0

@silentbang, ¿cómo funciona * qué? – Gili

+1

@Gili Quise decir el referente. ¿Cuál es su función en esto? – Silentbang

8

Es probable que Facebook es la creación (y luego esperar) a determinadas cookies en sus peticiones, y considera un encabezado que carece de cualquier ser un bot/usuario móvil/navegador limitado/algo más.

Hay varias preguntas sobre handling cookies with JSoup, sin embargo, puede resultarle más fácil usar HttpUrlConnection o HttpClient de Apache y luego pasar el resultado a JSoup. Un excelente informe sobre todo lo que necesita saber: Using java.net.URLConnection to fire and handle HTTP requests

Una forma útil de eliminar la diferencia entre su navegador y JSoup es Chrome's network inspector. Puede agregar encabezados desde el navegador a JSoup uno a la vez hasta que obtenga el comportamiento que espera, luego acote exactamente qué encabezados necesita.

26
Response response= Jsoup.connect(location) 
      .ignoreContentType(true) 
      .userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0") 
      .referrer("http://www.google.com") 
      .timeout(12000) 
      .followRedirects(true) 
      .execute(); 

Document doc = response.parse(); 

agente de usuario

Usar el último agente de usuario. Aquí está la lista completa http://www.useragentstring.com/.

Tiempo de espera

Tampoco se olvide de añadir timout, ya que a veces se tarda más de lo normal de tiempo de espera para descargar la página.

Referer

Ajuste el árbitro como Google.

sigue las redirecciones

seguimiento redirecciona para llegar a la página.

ejecutar() en lugar de get()

Uso ejecutar() para obtener el objeto Response. Lo cual puede ayudarlo a verificar el contenido y los códigos de estado en caso de error.

Posteriormente puede analizar el objeto de respuesta para obtener el documento.

+1

useragentstring.com parece estar roto ahora. – Siddhartha

+0

Solo para aclararlo, aunque el enlace exacto en la respuesta está roto (http://www.useragentstring.com/pages/Firefox/), el sitio en sí está activo (en el momento de escribir este comentario): http: //www.useragentstring.com/ –

+0

Gracias. Actualizado el enlace en la respuesta – Sorter

1

que tenían el problema y el establecimiento de 403 .userAgent("Mozilla") trabajó para mí (por lo que no tiene que ser súper específico para trabajar.