Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][Regexy][cURL]Pobieranie wyników z Google
Forum PHP.pl > Forum > Przedszkole
infoo1
Mam taki kod:
  1. <?php
  2.    error_reporting(E_ALL);
  3.    ini_set('display_errors',1);
  4.    class google
  5.    {
  6.        public $word;
  7.        public $results    =    1000;
  8.  
  9.        public function get_results_num()
  10.        {
  11.            if(empty($this->word))
  12.            {
  13.                return false;
  14.            }
  15.  
  16.            if (strpos($this->word, "."))
  17.            {
  18.                $this->word    =    substr($this->word, 0, strpos($this->word, "."));
  19.            }
  20.  
  21.            $url = "http://www.google.com/search?num=1&q=".trim(urlencode($this->word));
  22.            $curl = curl_init($url);
  23.  
  24.            curl_setopt($curl, CURLOPT_HEADER, false);
  25.            curl_setopt($curl, CURLOPT_HTTPGET, true);
  26.            curl_setopt($curl, CURLOPT_POST, false);
  27.            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  28.  
  29.  
  30.            $this->curl_result = curl_exec($curl);
  31.            curl_close($curl);
  32.  
  33.            if (preg_match('/(of about <b>([0-9,]+)</b>)/', $this->curl_result, $out))
  34.            {
  35.                $res = $out[2];
  36.                return preg_replace('/,/', '', $res);
  37.            }
  38.            return false;
  39.        }
  40.  
  41.        public function get_results()
  42.        {
  43.            $url = "http://www.google.com/search?num=100&q=".trim(urlencode($this->word));
  44.            $curl = curl_init($url);
  45.  
  46.            curl_setopt($curl, CURLOPT_HEADER, false);
  47.            curl_setopt($curl, CURLOPT_HTTPGET, true);
  48.            curl_setopt($curl, CURLOPT_POST, false);
  49.            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  50.  
  51.  
  52.            $this->curl_result = curl_exec($curl);
  53.            curl_close($curl);
  54.  
  55.            if (preg_match('#<!--m-->(.*?)<h3 class=r><a href="(.*?)" class=1 onmousedown=(.*?)<!--n-->#', $this->curl_result, $out))
  56.            {
  57.                $res = $out[1];
  58.                return preg_split('#<!--m-->(.*?)<h3 class=r><a href="(.*?)" class=1 onmousedown=(.*?)<!--n-->#',$res);
  59.            }
  60.        }
  61.    }
  62.  
  63.    $google            =    new google;
  64.    $google->word    =    $_GET['q'];
  65.    echo $google->get_results_num();
  66.    print_r($google->get_results());
  67.    die;
  68. ?>
Pierwsza funkcja działa dobrze, ale druga - nie. W ogóle nie wchodzi w if-a. Co zrobić, aby ta druga (get_results()) zwróciła mi taką tablicę dla zapytania "a":
  1. <?php
  2.  0 => 'http://pl.wikipedia.org/wiki/A',
  3. 1 => 'http://pl.wikipedia.org/wiki/Witamina_A',
  4. 2 => 'http://a.pl/',
  5. 3 => 'http://www.wrower.pl/',
  6.  4 => 'http://home.agh.edu.pl/polak/slownik/'
  7. )
  8. ?>
zegarek84
w ifa nie "wchodzi" gdyż przeglądając źródło zapytania nie znalazłem sam tego o co pytasz winksmiley.jpg - tzn znalazłem ale w całym kodzie dla przykładu nie ma wogóle np. tego fragmentu z wyrażenia regularnego: <!--m-->, pozatym teraz tylko pytanie gdyż to nic nie zmienia - dlaczego (.*?) a nie tylko (.*), przecież gwiazdka znaczy zero lub wiecej...

analizując wyrażenie jakie widzę to raczej chciałeś sprawdzić czy w kodzie jest cos takiego:
Kod
<h3 class=r><a href="http://pl.wikipedia.org/wiki/A" class=l onmousedown="ble ble skrypt js">
<h3 class=r><a href="http://pl.wikipedia.org/wiki/Witamina_A" class=l onmousedown="return bleble">

poprostu masz źle skonstruowane wyrażenie regularne lub było dobrze ale google zmienilo źródło strony ^^ - w każdym bądź razie teraz nie za bardzo pasuje....

pozatym dalej chyba zamiast z preg_split to chyba prościej było skożystać z preg_match_all winksmiley.jpg
EarthCitizen
Było dobrze, ale rzeczywiście google zmieniło sourca... Sam miałem ten problem smile.gif a co do (.*?) a nie (.*) to jest to poprawnie, bez ? wyrażenie znajdzie wszystko od początku szukanego zapytania do końca w całym kodzie, a nie w każdym wierszu.

Jak mnie ktoś nie ubiegnie, to wkleję wyrażenie, które działa - szukam smile.gif
zegarek84
ja cię ubiegnę bez ifa działa a mi się nie chce kombinować ;p - w curlu pousuwał jeszcze nagłówki przeglądarki a chciał wyniki "polskie"

tu się wyświetli poprawna tablica dla polskich linków - trzeba zamienić:
"http://www.google.com/search?num=100&q="
na:
"http://www.google.com/search?num=100&hl=pl&q="

i bez nagłówków z kolei żródło z curla znowu jest całkiem inne jak w mozilli - najpierw trzeba było sobie wyświetlić źródło z curla ;p - do poprawnej liczby wyników niech poprawi sobie pierwszą funkcję - wie gdzie bład no i niech spowrotem wrzuci ifa którego usunąłem gdyż nie chciało mi się tak sprawdzać warunków ;p - kod co działa tak jak miał ;p (no prawie ale czemu ja go mam dopieszczać ;p)
  1. <?php
  2.   error_reporting(E_ALL);
  3.   ini_set('display_errors',1);
  4.   class google
  5.   {
  6.       public $word;
  7.       public $results    =    1000;
  8.  
  9.       public function get_results_num()
  10.       {
  11.           if(empty($this->word))
  12.           {
  13.               return false;
  14.           }
  15.  
  16.           if (strpos($this->word, "."))
  17.           {
  18.               $this->word    =    substr($this->word, 0, strpos($this->word, "."));
  19.           }
  20.  
  21.           $url = "http://www.google.com/search?num=1&q=".trim(urlencode($this->word));
  22.           $curl = curl_init($url);
  23.  
  24.           curl_setopt($curl, CURLOPT_HEADER, false);
  25.           curl_setopt($curl, CURLOPT_HTTPGET, true);
  26.           curl_setopt($curl, CURLOPT_POST, false);
  27.           curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  28.  
  29.  
  30.           $this->curl_result = curl_exec($curl);
  31.           curl_close($curl);
  32.  
  33.           if (preg_match('/(of about <b>([0-9,]+)</b>)/', $this->curl_result, $out))
  34.           {
  35.               $res = $out[2];
  36.               return preg_replace('/,/', '', $res);
  37.           }
  38.           return false;
  39.       }
  40.  
  41.       public function get_results()
  42.       {
  43.           $url = "http://www.google.com/search?num=100&hl=pl&q=".trim(urlencode($this->word));
  44.           $curl = curl_init($url);
  45.  
  46.           curl_setopt($curl, CURLOPT_HEADER, false);
  47.           curl_setopt($curl, CURLOPT_HTTPGET, true);
  48.           curl_setopt($curl, CURLOPT_POST, false);
  49.           curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  50.  
  51.  
  52.           $this->curl_result = curl_exec($curl);
  53.           curl_close($curl);
  54.  
  55. //<h3 class=r><a href="http://pl.wikipedia.org/wiki/A" class=l>
  56. //tu było jeszcze sprawdzenie warunku czy to co szukamy jest na stronie - napisz jeszcze raz kożystając z poprawniejszego wyrażenie regularnego ;)
  57.              preg_match_all('/<h3 class=r><a href="([^"]+)" class=l>/',$this->curl_result,$matches);
  58. return $matches[1];
  59.  
  60.       }
  61.   }
  62.  
  63.   $google            =    new google;
  64.   $google->word='a';  //tutaj sobie daj tego geta co skasowałem ;p
  65.   echo $google->get_results_num();echo '<pre>';
  66.   print_r($google->get_results());echo '</pre>';
  67.   die;
  68. ?>

i pierwsza funkcja jest do poprawy gdyż poprawnie powinno być 17,780,000,000 - po prostu na zaś patrzeć w źródło z curla bo google rejonizuje ;p
infoo1
Dziękuję za pomoc. Kod już działa biggrin.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.