[java] Resultaten van een Google Scholar search vanuit java

Pagina: 1
Acties:

  • Red devil
  • Registratie: December 1999
  • Laatst online: 16:53
Vanuit mijn java applicatie zou ik graag een query richting Google Scholar willen doen. De standaard Google Web API (die overigens niet verder ontwikkeld wordt) ondersteunt alleen standaard google searches en de resultaten daarvan bevatten teveel troep.
Overigens ben ik niet veeleisend, ik hoef alleen maar te weten dat er uberhaupt resultaten zijn.
Zelf dacht ik aan een standaard method die de url opstuurt en html pagina daarvan saved, vervolgens wordt er simpel gekeken of er uberhaupt relevante links in de html pagina zitten.

Bijv ik stuur deze link op:

http://scholar.google.nl/...lus+subtillis&btnG=Zoeken

het feit alleen al dat er resultaten zijn: Resultaten 1 - 10 van circa 21 voor dna microarray bacillus subtillis (0.10 seconden) , is voldoende, meer hoef ik niet te weten.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    public void checkGoogle(String theUrl){
        
         final String FS = File.separator;

                try {
                    URL gotoUrl = new URL(theUrl);
                    InputStreamReader isr = new InputStreamReader(gotoUrl.openStream());
                    BufferedReader in = new BufferedReader(isr);

                    StringBuffer sb = new StringBuffer();
                    String inputLine;
                    boolean isFirst = true;
                    
                    //grab the contents at the URL
                    while ((inputLine = in.readLine()) != null){
                        sb.append(inputLine+"\r\n");
                    }
                    createAFile("testOutput.html", sb.toString());
                }
                catch (MalformedURLException mue) {
                    mue.printStackTrace();
                }
                catch (IOException ioe) {
                     ioe.printStackTrace();
                }
            
    }
     public static void createAFile(String outfile, String content) throws IOException {
            FileOutputStream fileoutputstream = new FileOutputStream(outfile);
            DataOutputStream dataoutputstream = new DataOutputStream(fileoutputstream);
            dataoutputstream.writeBytes(content);
            dataoutputstream.flush();
            dataoutputstream.close();
        }


Maar helaas pindakaas, dat levert een fijne

Java:
1
2
3
4
java.io.IOException: Server returned HTTP response code: 403 for URL: http://scholar.google.nl/scholar?hl=nl&lr=&q=dna+microarray+bacillus+subtillis&btnG=Search
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at java.net.URL.openStream(Unknown Source)
    


op.

Heeft iemand enig idee hoe ik wel een dergelijke query goed kan laten doorkomen?

  • r5d
  • Registratie: Februari 2002
  • Niet online

r5d

Read more, write less...

Waarom zou je zelf met inputstreams en buffers gaan prutsen? Als je een relatief standaard actie wilt uitvoeren zoals het fetchen van webpagina's zou ik niet het wiel opnieuw uitvinden. Ik raad aan om eens naar een library als Commons HTTPClient te kijken. Dan heb je meteen ondersteuning voor zaken als SSL, Redirects, Cookies, etc.

Later betaal je meer, maar dan heb je wel een gratis datalimiet....


  • alx
  • Registratie: Maart 2002
  • Niet online

alx

Ik heb wel eens succes gehad met:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
String encodedURL = "http://www.google.nl/search?hl=nl&q=zoekterm&btnG=Google+zoeken&meta=";
URL url = new URL(encodedURL);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();

int respcode = conn.getResponseCode();
if (respcode == HttpURLConnection.HTTP_OK) {
    InputStream in = conn.getInputStream();

    // check for gzip encoding and setup on-the-fly decoding if necessary
    String hdrFieldEnc = conn.getHeaderField("Content-Encoding");
    if (hdrFieldEnc != null) {
        if (hdrFieldEnc.equals("gzip")) {
            in = new GZIPInputStream(in);
        }
    }

    BufferedReader br = new BufferedReader(new InputStreamReader(in));
    StringBuffer buf = new StringBuffer();
    String line;
    while ((line = br.readLine()) != null) {
        buf.append(line);
    }

    createFile("testOutput.html", buf.toString());
} else {
    // handle other response codes
}

[ Voor 6% gewijzigd door alx op 15-12-2006 17:10 ]


  • Red devil
  • Registratie: December 1999
  • Laatst online: 16:53
Thanks the both of you, ik kan weer even verder prutsen :), als het lukt, laat ik het weten.

  • Red devil
  • Registratie: December 1999
  • Laatst online: 16:53
simulacrum schreef op vrijdag 15 december 2006 @ 17:04:
Ik heb wel eens succes gehad met:
Java:
1
2
3
String encodedURL = "http://www.google.nl/search?hl=nl&q=zoekterm&btnG=Google+zoeken&meta=";
URL url = new URL(encodedURL);
etc
Het werkte niet meer voor Google, zie ook http://www.cse.unsw.edu.au/~hendras/archives/00000174.html maar wel voor een andere erg belangrijke search engine! Bedankt!

  • alx
  • Registratie: Maart 2002
  • Niet online

alx

Tja; ik had even die google URL erin geknalt voor je. Zelf gebruikte ik het niet voor google. Zag later dat je met google scholar bezig was. Anyway, wat ik ook wegliet was code om HTTP headers gelijk te trekken met die van firefox:
Java:
1
2
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20060508 Firefox/1.5.0.4");
// etc; vergelijk met ethereal de requests

en enige const + random delay in te bouwen tussen verschillende requests. Geen idee of google daar nog iets tegenin kan brengen. Ik denk van niet, want je bent niet meer te onderscheiden van firefox, maar ze hebben hun doel dan al bereikt, want ze worden niet meer overstroomd door automatisch gegenereerde requests.

  • Red devil
  • Registratie: December 1999
  • Laatst online: 16:53
simulacrum schreef op maandag 18 december 2006 @ 17:11:
Tja; ik had even die google URL erin geknalt voor je. Zelf gebruikte ik het niet voor google. Zag later dat je met google scholar bezig was. Anyway, wat ik ook wegliet was code om HTTP headers gelijk te trekken met die van firefox:
Java:
1
2
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20060508 Firefox/1.5.0.4");
// etc; vergelijk met ethereal de requests

en enige const + random delay in te bouwen tussen verschillende requests. Geen idee of google daar nog iets tegenin kan brengen. Ik denk van niet, want je bent niet meer te onderscheiden van firefox, maar ze hebben hun doel dan al bereikt, want ze worden niet meer overstroomd door automatisch gegenereerde requests.
Ja dat zal wel 1 van de manieren zijn van google om de automatische procedures te scheiden van normaal verkeer. Ik zal dat ook eens proberen, kan geen kwaad.

[edit] het werkt :)
Pagina: 1