Andreas Klatt: Auslesen einer Google-Ergebnisseite nicht moeglich?

Moin!

Ich versuche, die Ergebnisseite, die Google liefert, in eine Datei zu schreiben:

$url = "http://www.google.com/search?q=irgendwas+nochwas&hl=fr&btnG=Google+Search";
 $fp = fopen($url, "r");
 $yafp = fopen("logfile.txt", "a-");

$str = fread ($fp, 100000);
 fputs($yafp, $str);

fclose($fp);
 fclose($yafp);

Mit anderen Seiten klappt das ganz wunderbar, aber hier tritt immer ein Fehler bei fopen() auf. Wenn ich dieselbe Adresse in einen Browser eintippe, erscheint eine korrekte Ergebnisseite.
Nehme ich dagegen als URL "www.google.com" klappt das Einlesen auch. Was ist das Problem mit dem Querystring und wie kann man das Problem umgehen?
Wuerde mich freuen, wenn jemand Rat weiss.
Vielen Dank,

Andreas.

  1. Moin!

    Ich versuche, die Ergebnisseite, die Google liefert, in eine Datei zu schreiben:

    $url = "http://www.google.com/search?q=irgendwas+nochwas&hl=fr&btnG=Google+Search";
     $fp = fopen($url, "r");
     $yafp = fopen("logfile.txt", "a-");

    $str = fread ($fp, 100000);
     fputs($yafp, $str);

    fclose($fp);
     fclose($yafp);

    Quelltext korrekt...

    Mit anderen Seiten klappt das ganz wunderbar, aber hier tritt immer ein Fehler bei fopen() auf. Wenn ich dieselbe Adresse in einen Browser eintippe, erscheint eine korrekte Ergebnisseite.

    also bei mir klappts auch! ;-)

    Nehme ich dagegen als URL "www.google.com" klappt das Einlesen auch. Was ist das Problem mit dem Querystring und wie kann man das Problem umgehen?
    Wuerde mich freuen, wenn jemand Rat weiss.
    Vielen Dank,

    Andreas.

    das mit www.google.com klappt bei mir ebenso nicht wie deine Suchanfrage:
    Warning: fopen("http://www.google.com","r") - No error in c:\apache\htdocs\index.php on line 4

    ("no error" ;-))

    Ich denke es kann sein, dass www.google.com auf Ihrem Server eine .htaccess-Datei haben, die den Zugriff per PHP von außen sperren (das kann man so einstellen).
    Dann klappt auch dein fopen-Befehl nicht.
    Weiter weiß ich grad auch nicht, aber vielleicht kommt dadurch ein anderer drauf...

    --
    Marc Reichelt || http://www.marcreichelt.de/
    tel.: 0049/6181/72224
    fax.: 0049/6181/740724
    e-mail: mailto:
  2. Hi,

    Mit anderen Seiten klappt das ganz wunderbar, aber hier tritt immer ein Fehler bei fopen() auf. Wenn ich dieselbe Adresse in einen Browser eintippe, erscheint eine korrekte Ergebnisseite.
    Nehme ich dagegen als URL "www.google.com" klappt das Einlesen auch. Was ist das Problem mit dem Querystring und wie kann man das Problem umgehen?

    könnte, z.B. daran liegen, daß Google die Seiten komprimiert ausliefert. Dafür müsste aber fopen() im Accept-Encoding-Header "gzip" o.ä. mitschicken. Aber auch die Sperrung bestimter User-Agents (in Deinem Fall PHP) von Seiten des Google-Servers käme in Frage.

    viele Grüße
    Achim Schrepfer

  3. Vielen Dank fuer die Hilfe;
    hab unterdessen doch noch ein Workaround gefunden, und zwar unter http://php3.de/manual/en/function.fopen.php.
    Das Problem scheint bei der fehlenden Unterstuetzung von HTTP 1.0 zu liegen:

    I've found that some servers don't support HTTP/1.0 and will actually return a 403 error (forbidden).  This is especially true with Google (my favorite search engine).  So, in order to get around this limitation of the fopen command I wrote a routine to use HTTP/1.1 instead (i wrote a simple check for a 403 from fopen first, but this is the important piece)...
    <START CODE>
    $GrabURL = "/search";
    $sockhandle = fsockopen("www.google.com", 80, &$errno, &$errstr);
    if(!$sockhandle) {
     print "server not available!";
    } else {
     $request = "GET $GrabURL HTTP/1.1\r\n";
    $request .= "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)\r\n";
     $request .= "Host: www.google.com\r\n";
    $request .= "Connection: Close\r\n\r\n";
     fputs($sockhandle, $request);
     $line = fgets($sockhandle, 1024); //Request Method
    $line = fgets($sockhandle, 1024); //Close Method
     $line = fgets($sockhandle, 1024); //Server Type
     $line = fgets($sockhandle, 1024); //Date
     $line = fgets($sockhandle, 1024); //Transfer-Encoding
     $line = fgets($sockhandle, 1024); //Content-Type
     $line = fgets($sockhandle, 1024); //Cache-control
    $line = fgets($sockhandle, 1024); //Set-Cookie
     $line = fgets($sockhandle, 1024); //End Header "space"
     $content = "";
     while (!feof($sockhandle)) {
       $line = fgets($sockhandle, 1024); //Packet length
       $length = hexdec($line);
       $content .= fread($sockhandle, $length); //Packet data
     }
     print $content;
    }
    fclose($sockhandle);
    <END CODE>
    If you have any questions feel free to email me, to see this code working in action visit http://google.compholio.com/.  If you are curious as to why I did this it's because the custom google search doesn't show up properly if you set the links to be white, so I tacked on some HTML to turn the links the appropriate color but not screw everything else up.   As of this posting my IP address was in the process of changing, so if you can't reach the site try again in a day or so.

    1. Hallo Andreas,

      $request .= "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)\r\n";

      Wenn Du schon einen UA fälscht, dann fälsche ihn doch bitte auf einen alternativen Browser wie z.B.

      Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20021130
      Mozilla/5.0 (compatible; Konqueror/3; Linux)

      oder auch Opera. Halt irgendetwas, das nicht IE ist...

      Grüße,

      Christian

      P.S.: das hat keine technischen sondern eher ideoligische Gründe ;-)

      --
      Sollen sich alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen und nicht mehr davon erfasst haben als eine Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst.
                            -- Albert Einstein
      1. Fehler wurde eingesehen und korrigiert :)
        Dankeschön.

        Andreas.

  4. Es ist doch kein Problem
    http://webdienst.webdienst.de/readgoogle/

    Gruß Robert