Odpytywanie Google.pl (java.net.HttpURLConnection)

0

Napisałem klasę sprawdzającą notowania poszczególnych fraz na podstawie ilości ich wystąpień w indexie wyszukiwarki google. Niestety nie wiem dlaczego za każdym razem, gdy wyślę niepuste zapytanie google odpowiada HTTP 403 [glowa]

Nie wiem dlaczego :/

http://www.google.pl/search?hl=en&q=sebo&btnG=Search&lr=lang_pl
Connecting... 1
java.io.IOException: Server returned HTTP response code: 403 for URL: http://www.google.pl/search?hl=en&q=sebo&btnG=Search&lr=lang_pl
 at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
 at java.net.URL.openStream(Unknown Source)
 at sebo.wordPopularity.GooglePopularityCounter.run(GooglePopularityCounter.java:90)

Wszystko działa gdy wysyłam takie samo zapytanie z pustym parametrem q=

http://www.google.pl/search?hl=en&q=&btnG=Search&lr=lang_pl
Connecting... 1
<html><head><meta http-e...</body></html>
/**
 * GooglePopularityCounter.java
 *  ścieżka sprawdzającą notowania poszczególnych fraz
 *  na podstawie ilości ich wystąpień w indeksie wyszukiwarki
 *  Google.
 *
 * Copyright (C) [email protected] na warunkach GNU GPLv3.
 * Copyright (C) [email protected] under the terms of GNU GPLv3.
 *
 *  For full license text, see http://www.gnu.org/licenses/gpl-3.0-standalone.html.
 */
package sebo.wordPopularity;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author Sebo http://sebo.office-on-the-net
 * @version 2008-01-16 00:51:43
 */
public class GooglePopularityCounter extends Thread{
 private static boolean log= false;//czy wyświetlać komunikaty o stanie na System.out||System.err
 private final Object object;//Czego szukamy
 private int popularity= -1;//Ilość znalezionych stron
 private int retry= 5;//ilośc nieudanych prób łączenia do hosta przed awaryjnym zamknięciem

 /**
  * Testowe uruchomienie scieżki sprawdzające wyniki
  * @autor Sebo
  * @version 2008-01-16 04:21:09
  * @param a Parametry uruchumieniowe
  */
 public static void main(final String[] a){
  log=true;
  GooglePopularityCounter.start(a.length>0?a[0]:"");
 }

 /*
  * (non-Javadoc)
  * 
  * @see sebo.wordPopularity.PopularityCounter#start(java.lang.Object)
  */
 public static GooglePopularityCounter start(final Object object){
  final GooglePopularityCounter googlePopularityCounter= new GooglePopularityCounter(
    object);
  googlePopularityCounter.start();
  return googlePopularityCounter;
 }

 private GooglePopularityCounter(final Object object){
  this.object= object;
 }

 /*
  * (non-Javadoc)
  * 
  * @see sebo.wordPopularity.PopularityCounter#getPopularity()
  */
 public int getPopularity(){
  if(this.isAlive()) throw new IllegalThreadStateException("Still counting...");
  return this.popularity;
 }

 /*
  * (non-Javadoc)
  * 
  * @see java.lang.Thread#run()
  */
 @Override
 public void run(){
  HttpURLConnection.setFollowRedirects(true);
  for(int i= 0; i<this.retry; i++)
   try{
    final String url= "http://www.google.pl/search?hl=en&q="
      +URLEncoder.encode(this.object.toString(),"ISO-8859-1")
      +"&btnG=Search&lr=lang_pl";// ?lr=lang_pl&hl=en&q="+this.object.toString());
    if(GooglePopularityCounter.log) System.err.println(url+"\nConnecting... "+(i+1));
    final BufferedReader bufferedReader= new BufferedReader(
      new InputStreamReader((new URL(url)).openStream()));
    try{
     String content;// =.toString();
     final Pattern pattern= Pattern.compile("of about <b>([0-9,]+)</b>");
     while(null!=(content= bufferedReader.readLine())){
      if(GooglePopularityCounter.log) System.out.println(content);
      final Matcher matcher= pattern.matcher(content);
      if(matcher.find()){
       final StringBuffer stringBuffer= new StringBuffer(matcher.group(1));
       for(int c= stringBuffer.length()-1; c>-1; c--)
        if(stringBuffer.charAt(c)==',') stringBuffer.deleteCharAt(c);
       this.popularity= Integer.valueOf(stringBuffer.toString());
       if(GooglePopularityCounter.log) System.out.println("I've found ("
         +this.object+": "+this.popularity+") - returnning :)");
       return;
      }
     }
    }finally{
     if(GooglePopularityCounter.log) System.err
       .println("Finally closing bufferedReader.close();");
     bufferedReader.close();
    }
   }catch(final MalformedURLException exception){
    if(GooglePopularityCounter.log) exception.printStackTrace();
   }catch(final IOException exception){
    if(GooglePopularityCounter.log) exception.printStackTrace();
   }
 }
}

Jakieś pomysły?? Co mogę jeszcze spróbować [???]

0

A jesteś przekonany o tym, że w ogóle google tak działa?

Poczytaj (poszukaj w google) czy serwer nie potrzebuje nagłówka przeglądarki (który możesz zasymulować w javie) aby dać poprawną odpowiedź.

HTH

0

ja bym sie przyinteresowal Goole API (cos tam chyba jest w javie)
http://www.cs.usfca.edu/~wolber/SoftwareDev/Distributed/WebServices/Google/googleJavaTutorial.htm

Generalnie programiki typu poszukaj po slowach kluczach w tym sie pisze. Oczywiscie mozna samemu.

0
reichel napisał(a)

ja bym sie przyinteresowal Goole API (cos tam chyba jest w javie)
http://www.cs.usfca.edu/~wolber/SoftwareDev/Distributed/WebServices/Google/googleJavaTutorial.htm

Generalnie programiki typu poszukaj po slowach kluczach w tym sie pisze. Oczywiscie mozna samemu.

Problem polega na tym, że google zamknęło projekt Google SOAP Search API i nie udostępnia już kluczy niezbędnych do używania tego pakietu ;]

A swoją klasę już naprawiłem :) - wystarczy dodać wysyłanie nagłówku HTTP Agent:

0

Mógłbyś wrzucić kod który działa poprawnie? Bo mam ten sam kłopot co Ty.

1 użytkowników online, w tym zalogowanych: 0, gości: 1