Статья описывает один из способов получения данных от поисковой системы Яндекс с помощью сервиса распознавания каптчи.
Для этого нам необходимо:
- ресурс в сети с доступом по FTP (для закачки файлов) и доступным PHP (для выполнения команд)
- регистрация на сервисе rucaptcha.соm с оплаченным профилем (от туда необходимо взять API)
Принцип работы:
- Берем необходимый поисковый адрес
- Отправляем адрес Яндексу(запрашиваем)
- Проверяем, спрашивает ли у нас Яндекс ввод каптчи?
- Если нет то мы уже получили страницу от Яндекс
- Если спрашивает, тогда получаем изображение и необходимые поля формы
- Шлем изображение в rucaptcha.соm и в цикле ждем ответ
- Получили ответ (распознанный текст) и шлем текст с полями формы Яндексу
- В результате получаем страницу Яндекса с необходимой информацией (если конечно распознали правильно)
1. Поисковый адрес — их можно найти в Интернет или скопировать из адресной строки браузера.
$url = 'http://yandex.ru/yandsearch?text=url:alneo.ru*&numdoc=50';
2. Отправка данных будет происходить с помощью функции get_webpage
$page = get_webpage($url);
function get_webpage($url,$cookie){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2) Gecko/20100115 Firefox/3.6'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_TIMEOUT_MS, '10000'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); curl_setopt($ch, CURLOPT_FRESH_CONNECT, FALSE); curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE); curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); $data = curl_exec($ch); if ($data) return $data; else return 'CURL failed'; }
3. Отправка поискового запроса(страницы) и Проверка записаны в одну функцию get_serp_page
function get_serp_page($url){//ПОЛУЧАЕМ ТЕКСТ И ПРОВЕРЯЕМ ЕСТЬ ЛИ КАПТЧА $page = get_webpage($url); preg_match('|<img src="(.*)" class="b-captcha__image">|isU', $page, $matches); if(isset($matches[1])){ $page = break_captcha($page,$matches[1]); } return $page; }
здесь происходит отправка страницы Яндексу и разбор с помощью регулярных выражений ответа (ищем картинку с циферками, уже букавками русскими)
6. Отправка каптчи в сервис распознавания с помощью функции break_captcha
$page = break_captcha($page,$matches[1]);
- $page — текст страницы с каптчей
- $matches[1] — картинка(адрес, атрибут src) каптчи
function break_captcha($page,$src_img){//АНАЛИЗИРУЕМ КАПТЧУ preg_match_all("#spravka=(.*?);#", $page, $t); $cookie = $t[1]; preg_match('|name="key" value="(.*)">|isU', $page, $t); $key = $t[1]; preg_match('|name="retpath" value="(.*)">|isU', $page, $t); $retpath = $t[1]; $captcha = file_get_contents($src_img); file_put_contents('ya_cap.gif', $captcha); $text=recognize("ya_cap.gif","вставить свой API key",false,"rucaptcha.com"); $m1=array('%2A','%26amp%3B');$m2=array('*','%26'); $yurl = 'http://yandex.ru/checkcaptcha?key='.urlencode($key).'&retpath='.str_replace($m1,$m2,urlencode($retpath)).'&rep='.rawurlencode($text).''; $page = get_webpage($yurl,$cookie); if (stripos($page, 'введите цифры с картинки') > 0){ echo "<br>Снова капча :-( <br>"; exit(); } return $page; }
здесь получаем поля формы key и retpath, поле spravka — не используется, куки берутся при использовании cURL и сохраняются/загружаются в/из файл cookie.txt с помощью CURLOPT_COOKIEJAR/CURLOPT_COOKIEFILE
$captcha = file_get_contents($src_img);
file_put_contents(‘ya_cap.gif’, $captcha);
сохраняем каптчу в файл
и отправляем с помощью recognize в распознавание (необходимо подключить API отдельным файлом)
Далее идет преобразование адреса в нормальный вид (иначе получим 404 страницу)
и опять получаем страницу но уже страницу а не каптчу (если правильно распознали)