Предлагаю вам класс для граббинга Яндекс wordstat, написанный на php.
С помощью этого класса вы сможете автоматизировать получение данных с сервиса wordstat.yandex.ru.
Пару слов о связанной с этим проблеме: сложность получения данных состоит в том, что данные приходят в зашифрованном виде, ключь для расшифровки задается случайно сгенерированным набором базовых функций JavaScript а также куском UserAgent браузера + некий fuid01 аккаунта пользователя yandex.
Ниже представлен пример использования и сам класс, загружающий и декодирующий данные.
Для его работы необходимо curl, а так-же заполнить $cookie и $agent реальными данными учетки почтового yandex-аккаунта.
Пример использования:
$ws = new wordstat(); $raw = $ws->load('я люблю bsbteam :)'); $ret = $ws->decode($raw); print_R($ret);
Код класса
class wordstat { var $cookie = ''; var $agent = ''; var $curl; var $vars = array(); function __construct() { $this->curl = curl_init(); if (empty($this->cookie)) die("cookie is empty!"); curl_setopt($this->curl, CURLOPT_USERAGENT, $this->agent); curl_setopt($this->curl, CURLOPT_HTTPHEADER, array('Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language: ru,en-us;q=0.7,en;q=0.3')); curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($this->curl, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($this->curl, CURLOPT_MAXREDIRS, 7); } function __destruct() { curl_close($this->curl); } function load($words) { $post = array( 'filter=all', 'map=world', 'page=1', 'page_type=words', 'period=monthly', 'regions=', 'sort=cnt', 'type=list', 'words=' . urlencode($words) ); curl_setopt($this->curl, CURLOPT_POST, 1); curl_setopt($this->curl, CURLOPT_HEADER, 0); curl_setopt($this->curl, CURLOPT_COOKIE, $this->cookie); $loc = 'http://wordstat.yandex.ru/stat/words'; $ref = 'http://wordstat.yandex.ru/'; curl_setopt($this->curl, CURLOPT_REFERER, $ref); curl_setopt($this->curl, CURLOPT_URL, $loc); curl_setopt($this->curl, CURLOPT_POSTFIELDS, implode('&', $post)); $ret = curl_exec($this->curl); return $ret; } function decode($in) { $out = ''; if (preg_match('~fuid01=(.*?);~', $this->cookie, $m)) $fuid01 = $m[1]; else die("no fuid01\n"); if ($arr = json_decode($in, true)) { if (isset($arr['key']) && isset($arr['data'])) { $magicHash = substr($this->agent, 0, 25) . $fuid01 . $this->parse($arr['key']); $data_len = strlen($arr['data']); $magicHash_len = strlen($magicHash); for ($i = 0; $i < $data_len; $i++) $out.= chr((ord($arr['data'][$i]) ^ ord($magicHash[$i % $magicHash_len]))); $out = urldecode($out); $out = json_decode($out, true); } else die(print_R($arr, true)); } return $out; } function parse($str) { $str = $this->parse_math($str); $str = $this->parse_method($str); $str = $this->parse_vars($str); $str = $this->parse_function($str); return $str; } function parse_inline($str) { while (preg_match('~return\s*function\s*\(\s*(.*?)\s*\)\s*\{(.*?)\}\s*\((".*?")\)~', $str, $m)) { $str = $m[2]; $str = str_replace($m[1] . '.', $m[3] . '.', $str); foreach ($this->vars as $key => $value) { $str = str_replace($key . '.', '"' . $value . '".', $str); } $str = $this->parse_method($str); } while (preg_match('~return\s*function\s*\(\s*\)\s*\{(.*?)\}\s*$~', $str, $m)) { $str = $m[1]; foreach ($this->vars as $key => $value) { $str = str_replace($key . '.', '"' . $value . '".', $str); } $str = $this->parse_method($str); } $str = preg_replace('~^\s*return\s*"(.*?)"\s*$~', '$1', $str); return $str; } function parse_function($str) { if (preg_match('~([;\s])([a-z0-9]+)\s*\(\s*"(.*?)"\s*\)[\s;]*~', $str, $m)) { $str = str_replace($m[0], $m[1], $str); $func = $m[2]; $args = $m[3]; if (preg_match('~var ' . $func . '\s*=\s*function\s*\((.*?)\)\s*\{\s*(.*?)\s*\}\s*;\s*~', $str, $m)) { $this->vars[$m[1]] = $args; $str = $m[2]; $str = $this->parse_vars($str); $str = $this->parse_inline($str); } } elseif (preg_match('~([;\s])([a-z0-9]+)\s*\(\s*\)[\s;]*$~', $str, $m)) { $str = str_replace($m[0], $m[1], $str); $func = $m[2]; if (preg_match('~var ' . $func . '\s*=\s*function\s*\((.*?)\)\s*\{\s*(.*?)\s*\}\(\s*(.*?)\s*\)\s*;\s*~', $str, $m)) { if (preg_match('~^"(.*?)"$~', $m[3], $n)) { $m[3] = $n[1]; } $this->vars[$m[1]] = $m[3]; $str = $m[2]; $str = $this->parse_vars($str); $str = $this->parse_inline($str); } } else { die("[stop] " . $str . "\n"); } return $str; } function parse_vars($str) { while (preg_match('~var\s+([a-z0-9]+)\s*=\s*"([a-z0-9]+)"[;\s]~', $str, $m)) { $str = str_replace($m[0], '', $str); $this->vars[$m[1]] = $m[2]; } while (preg_match('~var\s+([a-z0-9]+)\s*=\s*([a-z0-9]+)[;\s]~', $str, $m)) { if (isset($this->vars[$m[2]])) { $str = str_replace($m[0], '', $str); $this->vars[$m[1]] = $this->vars[$m[2]]; } else { break; } } return $str; } function parse_method($str) { $mark = 'internalvariable'; $var = ''; while (preg_match('~"([a-z0-9]+)"\.([a-z]+)\s*\(\s*([\'"a-z0-9\-]+)*\s*\)~', $str, $m)) { if ($m[1] != $mark || $var == '') { if (!empty($var)) $str = str_replace('"' . $mark . '"', $var, $str); $var = $m[1]; } switch ($m[2]) { case 'split': $m[3] = preg_replace('~^\'(.*?)\'$~', '$1', $m[3]); if ($m[3] == '') { $var = str_split($var); } else { $var = explode($m[3], $var); } $str = str_replace($m[0], '"' . $mark . '"', $str); break; case 'join': $m[3] = preg_replace('~^\'(.*?)\'$~', '$1', $m[3]); if ($m[3] == '') { $var = join($var); } else { $var = implode($m[3], $var); } $str = str_replace($m[0], '"' . $mark . '"', $str); break; case 'reverse': if (is_array($var)) $var = array_reverse($var); else $var = strrev($var); $str = str_replace($m[0], '"' . $mark . '"', $str); break; case 'concat': if (preg_match('~[a-z]~', $m[3]) && isset($this->vars[$m[3]])) { $var = $var . $this->vars[$m[3]]; } else { $var = $var . $m[3]; } $str = str_replace($m[0], '"' . $mark . '"', $str); break; case 'substr': $var = substr($var, $m[3]); $str = str_replace($m[0], '"' . $mark . '"', $str); break; default: die('method not found: ' . print_R($m, true)); } } $str = str_replace($mark, $var, $str); return $str; } function parse_math($str) { while (preg_match('~\(([0-9]+)\s*\^\s*([0-9]+)\)~', $str, $m)) { $str = str_replace($m[0], "(" . (string) ((int) $m[1] ^ (int) $m[2]) . ")", $str); } return $str; } }