Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][Regexy][cURL]Pobieranie wyników z Google
infoo1
post
Post #1





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 12.11.2008

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
zegarek84
post
Post #2





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


w ifa nie "wchodzi" gdyż przeglądając źródło zapytania nie znalazłem sam tego o co pytasz (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Ten post edytował zegarek84 22.01.2009, 00:27:24
Go to the top of the page
+Quote Post
EarthCitizen
post
Post #3





Grupa: Zarejestrowani
Postów: 286
Pomógł: 70
Dołączył: 13.01.2009

Ostrzeżenie: (0%)
-----


Było dobrze, ale rzeczywiście google zmieniło sourca... Sam miałem ten problem (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował EarthCitizen 22.01.2009, 00:28:08
Go to the top of the page
+Quote Post
zegarek84
post
Post #4





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


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

Ten post edytował zegarek84 22.01.2009, 11:42:21
Go to the top of the page
+Quote Post
infoo1
post
Post #5





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 12.11.2008

Ostrzeżenie: (0%)
-----


Dziękuję za pomoc. Kod już działa (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.12.2025 - 23:59