Sprawdzanie pozycji strony w wynikach wyszukiwania jest raczej codziennością dla wszystkich tych, którzy mogą mieć coś wspólnego z SEO.
Ręczne sprawdzanie jest raczej żmudnym zajęciem. Warto więc proces ten sobie nieco ułatwić. Potrzebne nam będzie to tego PHP + curl + troszkę wolnego czasu.
Ze względu na fakt, że nie będziemy korzystać z Google API, przyda nam się klasa do pobierania plików opisana wcześniej.
Zasadza działania jest prosta. Zupełnie tak jakbyśmy sami sprawdzali pozycję w wyszukiwarce:
- wchodzimy na google.com/google.pl
- wpisujemy szukaną frazę
- szukamy swojej strony na liście wyników
Warto więc by nasza klasa posiadała dwie metody (mogą być statyczne):
- queryUrl
- getPosition
Pierwsza będzie budowała adres strony URL z wynikami wyszukiwania, druga będzie analizowała treść strony i zwracała pozycję na której znajduje się szukana strona (o ile znajduje się).
O ile w pierwszym przypadku to bardzo prosta funkcja:
/**
* Tworzy adres URL do zapytania google
*
* @param string $query - szukana szukana fraza
* @param string $lang - język wyszukiwania
* @param int $num - liczba wyników na stronie
* @param int $start - pozycja od której zaczynamy szukać
* @param string $dataCenter - odpytywany data center
* @return string url
*/
function queryUrl( $query, $lang = 'pl', $num = 10, $start = 0, $dataCenter = 'www.google.pl')
{
return 'http://'. $dataCenter
. '/search?num='. $num
. '&hl='. $lang
. '&q='. urlencode($query)
. '&lr='. $lang
. '&start='. $start;
}
Co dla wywołania:
google::queryUrl('bank')
, wygeneruje nam stringa w postaci:
http://www.google.pl/search?num=10&hl=pl&q=bank&lr=pl&start=0
…to druga będzie wymagała lekkiej złożoności. Po pierwsze pobierzemy stronę z wynikami z googla, następnie ją przeanalizujemy, jeżeli znajdziemy szukaną stronę to dobrze (zwracamy wynik), jeżeli nie – szukamy dalej (pobieramy kolejną stronę z wynikami).
/**
* PObieramy pozycję strony
*
* @param string $url - szukana strona
* @param string $keyword - szukana fraza
* @param int $packSize - liczba wyników na stronie
* @param int $pages - ile maksymalnie stron przeszukujemy
* @return array
*/
function getPosition( $url, $keyword, $packSize = 10, $pages = 10)
{
// pozycja startowa
$_s_position = 0;
// pozycja końcowa (brak danych)
$_e_position = '-';
// wyrażenie do przeszukania
$_reg_exp = '/<h3 class=r><a href="([^"]+)" class=l>/';
for($pack = 0; $pack < $pages; $pack++)
{
// generujemy adres strony
$_google_url = google::queryUrl($keyword, 'pl', $packSize, $_s_position);
// obliczamy pozycje początkową
$_s_position = $packSize * $pack;
// pobieramy plik z wynikami wyszukiwania
$_google_result = curl::getFile($_google_url);
// wyciągami linki do serwisów
preg_match_all($_reg_exp, $_google_result->data, $_results);
$_results = array_pop($_results);
// przeszukujemy tablicę
foreach($_results as $key => $value)
{
// jeżeli znaleźliśmy, przerywamy pobieranie kolejnych stron
if(strpos($value, $url) !== false)
{
$_e_position = $_s_position + $key + 1;
$pack = $pages;
}
}
}
// pozycja strony
$res['position'] = $_e_position;
return $res;
}
Wywołanie google::getPosition('nordea.pl', 'bank'); powinno zwrócić jednoelementową tablicę z kluczem position. Jeżeli wartość jest inna niż myślnik – poprawnie udało się znaleźć adres strony wynikach wyszukiwania.
Niestety nie ma róży bez kolców. Po pierwsze (jak dobrze pamiętam) regulamin googla nie zezwala na automatyczne wykonywanie requestów do wyszukiwarki (chyba). Po drugie limit zapytań do google w przeciągu 24h. Po trzecie – jeżeli google zmieni sposób wyświetlania wyników, prawdopodobnie będziemy musieli poprawić wyrażenie regularne wyciągające adresy URL do serwisów. Plusem jest fakt, że wyniki są o wiele dokładniejsze niż ma to miejsce przy korzystaniu z GoogleAPI.