Estoy escribiendo un pequeño programa en Java para obtener la cantidad de resultados de búsqueda de Google plazo. Por alguna razón, en Java me estoy haciendo un 403 (Prohibido), pero estoy recibiendo el derecho de los resultados en los navegadores web. Código:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;


public class DataGetter {

    public static void main(String[] args) throws IOException {
        getResultAmount("test");
    }

    private static int getResultAmount(String query) throws IOException {
        BufferedReader r = new BufferedReader(new InputStreamReader(new URL("https://www.google.com/search?q=" + query).openConnection()
                .getInputStream()));
        String line;
        String src = "";
        while ((line = r.readLine()) != null) {
            src += line;
        }
        System.out.println(src);
        return 1;
    }

}

Y el error:

Exception in thread "main" java.io.IOException: Server returned HTTP response code: 403 for URL: https://www.google.com/search?q=test
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
    at DataGetter.getResultAmount(DataGetter.java:15)
    at DataGetter.main(DataGetter.java:10)

Por qué está haciendo esto?

  • podría ser algo que ver con las sesiones?
  • ¿Por qué estás usando el protocolo SSL extremo?
  • um… ¿qué es un certificado SSL extremo? (lo siento, estoy desorientado acerca de este tipo de cosas)
  • SSL (secure socket layer) es un método para garantizar la seguridad de los datos que se pasan de ida y vuelta entre un cliente y un servidor. SSL extremo es un regular de la URL, pero con https en lugar de http. El uso de SSL es más complicado de regular http porque no necesita ser un apretón de manos entre el cliente y el servidor. Que en su caso es innecesario, ya que usted sólo puede usar el ‘normal’ http extremo de Google (http;//www.google.com/search)
  • si yo uso normal http:// pasa lo mismo
  • Agregar la consulta que se está trabajando con la pregunta.
  • u puede demostrar su solución .Tengo este problema, también.

InformationsquelleAutor Doorknob | 2012-12-02

4 Comentarios

  1. 91

    Usted sólo debe fijar un agente de usuario de cabecera para que funcione:

    URLConnection connection = new URL("https://www.google.com/search?q=" + query).openConnection();
    connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11");
    connection.connect();
    
    BufferedReader r  = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charset.forName("UTF-8")));
    
    StringBuilder sb = new StringBuilder();
    String line;
    while ((line = r.readLine()) != null) {
        sb.append(line);
    }
    System.out.println(sb.toString());

    El SSL fue manejado de forma transparente para ti como podría ser visto desde su excepción stacktrace.

    Obtener el resultado monto no es realmente así de simple, aunque, después de esto tienes que fingir que eres un navegador por medio de obtención de la cookie y el análisis de la redirección token de enlace.

    String cookie = connection.getHeaderField( "Set-Cookie").split(";")[0];
    Pattern pattern = Pattern.compile("content=\\"0;url=(.*?)\\"");
    Matcher m = pattern.matcher(response);
    if( m.find() ) {
        String url = m.group(1);
        connection = new URL(url).openConnection();
        connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11");
        connection.setRequestProperty("Cookie", cookie );
        connection.connect();
        r  = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charset.forName("UTF-8")));
        sb = new StringBuilder();
        while ((line = r.readLine()) != null) {
            sb.append(line);
        }
        response = sb.toString();
        pattern = Pattern.compile("<div id=\"resultStats\">About ([0-9,]+) results</div>");
        m = pattern.matcher(response);
        if( m.find() ) {
            long amount = Long.parseLong(m.group(1).replaceAll(",", ""));
            return amount;
        }
    
    }

    Ejecución el código completo puedo obtener 2930000000L como resultado.

    • Tio, te debo un barril de cerveza, esta es una perfecta solución a mi problema! Google puede restringir/acelerador de los resultados mediante este método?
    • la limitación está basado en ip, así que no se trata de el método, pero si puedes cambiar tu ip 🙂
    • Veo! Un simple router se reinicie (WAN cambio) va a resolver el problema :). Gracias de nuevo!!
    • conexión.conectar(); va a lanzar la excepción «ya conectado»
    • ¿Cómo debe ser la variable de response contienen?
    • El código completo enlace está muerto. Puede ser re-alojado en un servicio sin vencimientos?

  2. 2

    Probablemente no se ajuste correcto de los encabezados. Uso LiveHttpHeaders (o equivalente) en el navegador para ver los encabezados de que el navegador es el envío de emular en su código.

    • Traté de "https://www.google.com/search?q=" + query + "&rlz=1C1RNNN_enUS371&aq=f&oq=" + query + "&sugexp=chrome,mod=6&sourceid=chrome&ie=UTF-8", aún no funciona
    • agregó un parámetro de cadena de consulta, no cambiar los encabezados. Puede configurar los encabezados con .setRequestProperty() en el URLConnection objeto
    • He aquí, ENTONCES, el artículo que habla acerca de la adición de encabezados de solicitud: stackoverflow.com/questions/480153/…
  3. 1

    A mí me ha funcionado mediante la adición de la cabecera:
    «Aceptar»: «*/*»

    • Esto no agrega nada a la aceptación de la respuesta.
    • De verdad!! Me dijo que lo que funcionó para mí, para el autor de la pregunta funcionó algo, para otros podría ser algo más … ¿ustedes viven a downvote, lo que está mal con u
    • Yo echo de manera más upvotes de downvotes, así que no hay. Pero una tarde de respuesta que no añade nada a las anteriores respuestas es algo que habitualmente downvote. Sin embargo, en este caso, he leído un poco rápido y me voy a quitar la downvote.
  4. 0

    Es debido a que el sitio utiliza SSL. Trate de usar el Jersey Cliente HTTP. Usted probablemente también tienen que aprender un poco acerca de HTTPS y los certificados, pero creo Jersey puede apostar conjunto de ignorar la mayoría de los detalles relativos a la seguridad real.

    • No, No es así, funciona mediante la emulación de navegador http headers como @KevinDay dijo en su respuesta.
    • Brunk – no es una buena lección aquí – en el centro, todos de la programación está hecha de una capa de abstracción adicional. La comprensión de los niveles bajos es super útil. El uso de un mayor nivel de cliente como usted describe puede trabajar, pero sólo porque se trata de hacer que un bajo nivel de convocatoria que usted puede hacer si usted elige. Nunca me olvidaré de cómo la iluminación era para mí, a sentarse y a interactuar con un servidor web mediante un cliente de telnet y la elaboración de la solicitud HTTP a mano. ¡Hasta la vista!
    • En realidad, todavía no estoy seguro de por qué ese código funcionó porque normalmente tiene para agregar el sitio del público certificado para su local de Java almacén de claves con el fin de utilizar SSL como que, incluso con URLConnection, así que algo no cuadra acerca de esa URL. También, ¿qué te hace pensar que yo nunca conectado a un sitio web mediante telnet? Tengo que hacer esto para vivir y se me olvida a menudo hay un montón de gente en este sitio, que son alumnos o afición a los programadores. Yo sólo trato de ser hepful.
    • Si el sitio utiliza un certificado que tiene una cadena de confianza a una CA que se incluye con JAVA en el archivo cacerts almacén de confianza (que se encuentra en el jdk\jre\lib\security), a continuación, agregar explícitamente los sitios certificado no es necesario.

Dejar respuesta

Please enter your comment!
Please enter your name here