Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pozycja strony w googlu
Forum PHP.pl > Forum > PHP
mhs
Witam serdecznie,

istnieje jakaś możliwość wyciągnięcia z googli informacji o tym na jakiej pozycji znajduje się dana strona internetowa na określone hasło? Potrzebują przygotować skrypt, który będzie automatycznie sprawdzał co jakiś czas na jakiej pozycji w wyszukiwarce znajduje się strona na określone zapytania. Jednocześnie chciałbym rozwiązanie w pełni legalne, tzn. by nie trzeba było tego obchodzić - tylko coś na co "pozwala" Google.

Pozdrawiam,
Michał.
siemakuba
Google ma API do wyszukiwarki, żeby z niego korzystać potrzebny jest jednak Google SOAP API key. Ten klucz nie jest już rozdawany, więc jedyna szansa twoja to taka, że go już masz lub ma ci kto użyczyć. (szczegóły: http://code.google.com/apis/soapsearch/reference.html)

Za pomocą tego search api dało się zrobić takie sprawdzanie o jakim piszesz. Teraz jest AJAX search api no i chyba nie za bardzo nadaje się do takiego rodzaju działania...

Zawsze możesz robić zapytanie do google.com via PHP i potem parsować wynikowy HTML - mało eleganckie i dość pewnie pracochłonne rozwiązanie, ale w ostateczności można ;)

pozdr.
mhs
@siemakuba Dzięki za odpowiedź.

Niestety parsowanie wynikowych stron raczej nie wchodzi w grę ze względu na zastosowanie skryptów (znaczna ilość domen, znaczna ilość słów kluczowych). Dodatkowo jakiekolwiek zmiany w kodzie strony mogą pociągnąć za sobą konieczności aktualizacji skryptów (przerwę w działaniu usług itd.), a także pewnie samo rozwiązanie jest zbyt czasochłonne w działaniu.

Orientujesz się może jak wygląda sytuacja z innymi wyszukiwarkami typu MSN, Yahoo?

Mam jeszcze jedno pytanie. Z tego co wiem jeżeli chodzi o ilość zapytań jakie można było wykorzystać na jednym kluczu była stosunkowo mała (chyba 1000 zapytań). Czy znasz może inne ograniczenia rozwiązania wcześniej wspomnianego przez Ciebie lub też możesz potwierdzić to z czym osobiście się spotkałem?
siemakuba
Co do MSN czy yahoo - nie orientuję się jak to u nich wygląda, ale warto zajrzeć na ich strony i poszukać. Posiadanie API do usługi jest dość łebdwazerowe, trendi i freszi więc jest szansa, że coś tam mają. (szczególnie Yahoo).

Co do limitu w Google Search API - 1000 zapytań to limit dzienny, więc zależnie od twoich potrzeb może to być albo mało albo dużo. Jedno zapytanie = 10 wyników na dane hasło. Zakładając, że chcesz szukać interesującej cię strony w zakresie pierwszych pięciu stron wyników, poświęcisz na to max 5 zapytań. To daje dziennie możliwość takiego sprawdzenia 200 stron. Na potrzeby prywatne - to aż za wiele, na rozwiązanie, które ma być usługą - pewnie za mało. Nie da się też ukryć, że są serwisy www, które dają ci możliwość takiego sprawdzania i w jakiś sposób na pewno radzą sobie z tym ograniczeniem - może jest jakaś komercyjna opcja na Search API?

pozdr.
Diwi
Dodatkowo wyniki poprzez Google Search API dosyć czesto różnią się od tych w normalnym wyszukiwaniu.

Ja u siebie (http://www.diwi.pl/sprawdzanie_pozycji/) wykorzystuję parsowanie wyników Google, szybkie i zawsze podaje dokładny wynik smile.gif . Jak chcesz funkcje to mogę Ci ją wysłać jak coś na PW

Pozdrawiam
mhs
siemakuba Dzięki za informacje. Będę dalej szukał rozwiązań.
impuls2003
Kompletna klasa do Google
Zniknal tylko RealPageRank (Zawsze = 0).
Testy na www.pc2.pl LOGIN: DEMO HASLO: DEMO123

Klasa została wykorzystana na w/w stronie w: Słowa kluczowe, Podstrony, Adresy referencyjne.

Funkcja getrealrank wymaga PHP5, pozostałe chodza na PHP4. getrealrank mozna sobie odpuscic.

  1. <?
  2.  
  3. define("GOOGLE_MAGIC", 0xE6359A60);
  4.  
  5. class GOOGLE {
  6.  
  7. public function google_pozycja_strony($strona,$zapytanie)
  8.  {
  9.  $sLinkRegExp = '/<h2 class=r><a href="([^"]+)" class=l>/';
  10.  $sURLTpl = 'http://www.google.pl/search?hl=pl&q=%s&num=100';
  11.  $sQ = $zapytanie;
  12.  $sSite = $strona;
  13.  $rC = curl_init();
  14.  curl_setopt($rC, CURLOPT_HEADER, 0);
  15.  curl_setopt($rC, CURLOPT_RETURNTRANSFER, 1);
  16.  curl_setopt($rC, CURLOPT_VERBOSE, 1);
  17.  curl_setopt($rC, CURLOPT_REFERER, 'www.google.pl');
  18.  curl_setopt($rC, CURLOPT_URL, sprintf($sURLTpl, urlencode($sQ)));
  19.  $sData = curl_exec($rC);
  20.  curl_close($rC);
  21.  preg_match_all($sLinkRegExp, $sData, $aResults);
  22.  $aResults = array_pop($aResults);
  23.  $iPosition = '-';
  24.  foreach($aResults as $iKey => $sRow) 
  25. {
  26. if(strpos(strip_tags($sRow), 'http://' . $sSite) !== false) 
  27.  {
  28.  $iPosition = $iKey + 1;
  29.  }
  30. }
  31.  if ($iPosition != '-' && $iPosition != '0') return "<font color='#FFFF00'>Pozycja GOOGLE ".($iPosition-1)."</font>";
  32.  else return "<font color='#FFFF00'>-</font>";
  33.  }
  34.  
  35. private function zeroFill($a, $b) 
  36.  { 
  37.  $z = hexdec(80000000);
  38.  if ($z & $a) 
  39. {
  40. $a = ($a>>1);
  41. $a &= (~$z);
  42. $a |= 0x40000000;
  43. $a = ($a>>($b-1));
  44. }
  45.  else 
  46. {
  47. $a = ($a>>$b);
  48. }
  49.  return $a;
  50.  }
  51.  
  52. private function toInt32(& $x)
  53.  { 
  54.  $z = hexdec(80000000); 
  55.  $y = (int)$x; 
  56.  if($y==-$z&&$x<-$z)
  57. { 
  58. $y = (int)((-1)*$x);// this is the hack, make it positive before 
  59. $y = (-1)*$y; // switch back the sign 
  60. } 
  61.  $x = $y; 
  62.  }
  63.  
  64. private function mix($a,$b,$c) 
  65.  { 
  66.  $a -= $b; $a -= $c; $this -> toInt32($a); $a = (int)($a ^ ($this -> zeroFill($c,13))); 
  67.  $b -= $c; $b -= $a; $this -> toInt32($b); $b = (int)($b ^ ($a<<8)); 
  68.  $c -= $a; $c -= $b; $this -> toInt32($c); $c = (int)($c ^ ($this -> zeroFill($b,13))); 
  69.  $a -= $b; $a -= $c; $this -> toInt32($a); $a = (int)($a ^ ($this -> zeroFill($c,12))); 
  70.  $b -= $c; $b -= $a; $this -> toInt32($b); $b = (int)($b ^ ($a<<16)); 
  71.  $c -= $a; $c -= $b; $this -> toInt32($c); $c = (int)($c ^ ($this -> zeroFill($b,5))); 
  72.  $a -= $b; $a -= $c; $this -> toInt32($a); $a = (int)($a ^ ($this -> zeroFill($c,3))); 
  73.  $b -= $c; $b -= $a; $this -> toInt32($b); $b = (int)($b ^ ($a<<10)); 
  74.  $c -= $a; $c -= $b; $this -> toInt32($c); $c = (int)($c ^ ($this -> zeroFill($b,15))); 
  75.  return array($a,$b,$c); 
  76.  } 
  77.  
  78. private function GoogleCH($url, $length=null, $init=GOOGLE_MAGIC) 
  79.  {
  80.  if(is_null($length)) 
  81. {
  82. $length = sizeof($url);
  83. }
  84.  $a = $b = 0x9E3779B9;
  85.  $c = $init;
  86.  $k = 0;
  87.  $len = $length;
  88.  while($len >= 12) 
  89. {
  90. $a += ($url[$k+0] +($url[$k+1]<<8) +($url[$k+2]<<16) +($url[$k+3]<<24));
  91. $b += ($url[$k+4] +($url[$k+5]<<8) +($url[$k+6]<<16) +($url[$k+7]<<24));
  92. $c += ($url[$k+8] +($url[$k+9]<<8) +($url[$k+10]<<16)+($url[$k+11]<<24));
  93. $mix = $this -> mix($a,$b,$c);
  94. $a = $mix[0];
  95. $b = $mix[1];
  96. $c = $mix[2];
  97. $k += 12;
  98. $len -= 12;
  99. }
  100.  $c += $length;
  101.  switch($len) /* all the case statements fall through */
  102. {
  103. case 11: $c+=($url[$k+10]<<24);
  104. case 10: $c+=($url[$k+9]<<16);
  105. case 9 : $c+=($url[$k+8]<<8);
  106. case 8 : $b+=($url[$k+7]<<24);
  107. case 7 : $b+=($url[$k+6]<<16);
  108. case 6 : $b+=($url[$k+5]<<8);
  109. case 5 : $b+=($url[$k+4]);
  110. case 4 : $a+=($url[$k+3]<<24);
  111. case 3 : $a+=($url[$k+2]<<16);
  112. case 2 : $a+=($url[$k+1]<<8);
  113. case 1 : $a+=($url[$k+0]);
  114. }
  115.  $mix = $this -> mix($a,$b,$c);
  116.  return $mix[2];
  117.  }
  118.  
  119. private function strord($string) 
  120.  {
  121.  for($i=0;$i<strlen($string);$i++) 
  122. {
  123. $result[$i] = ord($string{$i});
  124. }
  125.  return $result;
  126.  }
  127.  
  128. private function getrank($url, $prefix="info:", $datacenter="www.google.pl") 
  129.  {
  130.  $url = $prefix.$url;
  131.  $ch = $this -> GoogleCH($this -> strord($url));
  132.  $file = "http://$datacenter/search?client=navclient-auto&ch=6$ch&features=Rank&q=$url";
  133.  $oldlevel = error_reporting(0);
  134.  $data = file($file);
  135.  error_reporting($oldlevel);
  136.  if(!$data || preg_match("/(.*).(.*)/i", $url)==0) return "N/A";
  137.  $rankarray = explode (":", $data[2]);
  138.  $rank = trim($rankarray[2]);
  139.  if($rank=="") return "N/A";
  140.  return $rank;
  141.  }
  142.  
  143. private function getrealrank($url, $datacenter="www.google.pl")
  144.  {
  145.  $url = "info:".$url;
  146.  $ch = $this -> GoogleCH($this -> strord($url));
  147.  $file = "http://$datacenter/search?client=navclient-auto&ch=6$ch&q=$url";
  148.  //echo $file."<br />";
  149.  $data = file($file);
  150.  $tekst = ""; foreach ($data as $row) { $tekst .= $row."n"; }
  151.  $Iterator = new SimpleXMLIterator($tekst);
  152.  $Iterator->rewind();
  153.  $infoarray = $Iterator -> RES;
  154.  $nonwwwurl = str_replace("www.", "", $url);
  155.  $urlpermutationsarray = array($url, 
  156. "http://".$url, 
  157. "http://www.".$url, $url."/", 
  158. "http://".$url."/", 
  159. "http://www.".$url."/", 
  160. $nonwwwurl, 
  161. "http://".$nonwwwurl, 
  162. "http://www.".$nonwwwurl, 
  163. $nonwwwurl."/", 
  164. "http://".$nonwwwurl."/", 
  165. "http://www.".$nonwwwurl."/"); 
  166.  
  167.  for($i=0; $i<count($infoarray); $i++)
  168. {
  169. $urlU = $infoarray -> R[$i] -> U;
  170. //echo $urlU."<br />";
  171. $urlrank = $infoarray -> R[$i] -> RK;
  172. //echo $urlrank."<br />";
  173. foreach($urlpermutationsarray as $permutation){ if(strtolower($permutation)==strtolower($urlU)) return $urlrank; }
  174. }
  175.  return "-";
  176.  }
  177.  
  178. public function bierz_page_rank ($url)
  179.  {
  180.  $z = parse_url ($url);
  181.  $zz = $z['host'].$z['path'];
  182.  $zz1 = $z['host'];
  183.  if ($zz)
  184. {
  185. $rank1 = $this -> getrank($zz);
  186. $rank2 = $this -> getrank($zz1);
  187. $rank3 = $this -> getrealrank($zz);
  188. $rank4 = $this -> getrealrank($zz1);
  189. return "<font color='#FFFF00'>Google Page Ranking:".$rank1."(".$rank3."),".$rank2."(".$rank4.")</font>";
  190. }
  191.  else return "";
  192.  }
  193.  
  194.  }
  195.  
  196. $GOOGLE = new GOOGLE;
  197.  
  198. ?>
free
Impuls masz blad w 7 lini

Impuls masz blad w 7 lini
kubarek
nie ma błędu
pewnie używasz php4, a tam nie ma słowa kluczowego public
impuls2003
W zasadzie mozna funkcje "function google_pozycja_strony($strona,$zapytanie)" wyjac z klasy i stosowac oddzielnie smile.gif

Jesli np. Google zmieni wzor wyswietlania wynikow, trzeba bedzie zmienic regulke REGEXP.

Pozostałe funkcje w klasie sa stosowane tylko przy braniu PR strony.

Przy moich STAT wkrada sie czasami blad, a czasami nie ze pokazuje za duzo podstron istniejacych - musze dojsc wlasnie dlaczego. I jak URL jest w UTF8 to albo krzaczy albo nie pokazuje wcale. Jak URL jest dluzszy od 650 znaków tez nie pokazuje.

A tak na marginesie jesli komus sie przyda ta klasa, bede sie bardzo cieszyl smile.gif
Trudno bylo znalezc rozwiazanie pobierania PageRanking na maszynach - serwerach 64-bitowych.

Jesli ktos ma jakies funkcje do pobierania danych z Google, np. ilosc linkow wychodzacych BackLinks bede wdzieczny za kod.

Pozdrawiam.

P.S. Tak na marginesie. Wszystkie przydatne rzeczy dotyczace PHP wrzucam do dzialu download na PC2.pl

Jest tam m.in. klasa ktora odczytuje pliki excela, nawet Office 2003
sf
pozycja w google tongue.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.