Доброго времени суток, Подскажите как поступить, не могу допилить парсер. Сам я не могу назвать себя пока программистом, опыта не хватает. Есть необходимость сделать парсер количества проиндексированых страниц в Яндексе. Ниже код который по моей логике должен быть. Но он не работает. Голову сломал не понимаю почему. Знающие люди подскажите пожалуйста. Снало пытался просто загрузить саму страницу, не грузит. PHP: $ch = curl_init('http://yandex.ru/yandsearch?text=host:google.ru+|+host:www.google.ru&lr=10313'); //Установка опций curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; ru:1'); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_REFERER, 'http://rambler.ru'); curl_exec($ch); curl_close($ch); Нашел в сети чужой код, и в нем ковыряюсь, то же ничего не выходит. PHP: class method_curl { // Инициализация curl function curl_start($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20); curl_setopt($ch, CURLOPT_ENCODING,'gzip,deflate'); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; ru:1"); $data = curl_exec($ch); curl_close($ch); return $data; } // Получаем количество страниц в индексе Яндекса public function yandex_index($site_url) { $content = $this->curl_start('http://yandex.ru/yandsearch?date=&text=&spcctx=notfar&zone=all&wordforms=all&lang=all&within=0&from_day=&from_month=&from_year=&to_day=21&to_month=7&to_year=2009&mime=all&site='.urlencode($site_url).'&rstr=&ds=&numdoc=10'); $content = str_replace(' тыс.','000',$content); $content = str_replace(' млн','000000',$content); $content = str_replace('ничего не найдено','0',$content); preg_match('~<title>[^\d]*(\d+)[^\d]*</title>~',$content,$match); return $match[1]; } } $url = "google.ru"; echo "Яндекс: ".$analiz->yandex_index($url);
В первом коде нужно добавить опцию curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);, и сохранить в переменную результат curl_exec(), если предполагается дальнейшая работа с полученными данными. Во втором коде нужно создать объект класса method_curl: PHP: $analiz = new method_curl; $url = "google.ru"; echo "Яндекс: ".$analiz->yandex_index($url); Но предполагаю, что регулярка из второго кода уже не актуальна.
PHP: $analiz = new method_curl; объект создан, просто в коде случайно вырезал.. там ерунды всякой, случайно и это убрал когда публиковал. По поводу регулярки, да, я ее поправил в скрипте, но он мне грузит не страницу со списком индексации, а страницу типо "Ой" вход похожа на автоматический и бла бла и выкидывает капчу. Следовательно нужно наверное продумать подключение с куками или через прокси, или даже не знаю как еще.. то есть простой парсер не доходит до самой страницы результатов индексации
Используй обертку для CURL https://github.com/shuber/curl , там в архиве README.markdown посмотри, чтобы понять, как составлять запросы с этим классом. Вот для примера: PHP: <?php require_once 'curl.php'; $curl = new Curl; $response = $curl->get('http://yandex.ru/yandsearch?text=antichat'); print_r($response->headers);
Я недавно, может месяц назад, пытался сделать такой парсер. Там не всё так просто. Яндекс намудрил там защиту с куками и капчей. Долго мудохался, вроде бы уже и все куки эмулировал, но всё равно результата нужного не добился.
Вот, добавил куки и изменил регексп. Теперь должно работать: PHP: <?php class method_curl { // Инициализация curl function curl_start($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20); curl_setopt($ch, CURLOPT_ENCODING,'gzip,deflate'); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; ru:1"); curl_setopt($ch, CURLOPT_COOKIEFILE, "./cook.txt"); curl_setopt($ch, CURLOPT_COOKIEJAR, "./cook.txt"); $data = curl_exec($ch); curl_close($ch); return $data; } // Получаем количество страниц в индексе Яндекса public function yandex_index($site_url) { $content = $this->curl_start('http://yandex.ru/yandsearch?date=&text=&spcctx=notfar&zone=all&wordforms=all&lang=all&within=0&from_day=&from_month=&from_year=&to_day=21&to_month=7&to_year=2009&mime=all&site='.urlencode($site_url).'&rstr=&ds=&numdoc=10'); $content = str_replace(' тыс.','000',$content); $content = str_replace(' млн','000000',$content); $content = str_replace('ничего не найдено','0',$content); preg_match('~<br>(\d+)~',$content,$match); return $match[1]; } } $analiz = new method_curl; $url = "google.ru"; echo "Яндекс: нашлось ".$analiz->yandex_index($url); На денвере пробовал? На денвере с cURL'ом какие-то проблемы, куки не сохраняет.
нет, не денвер, апач+пхп+мускул по отдельности ставил. сразу работает, потом через несколько запросов капча выскакивает и начинаются пляски с бубном
Яндекс примерно после 50 запросов первый раз предлагает капчу ввести, вводил в ручную, куки потом подставлял. Но потом, после 10-15 запросов опять просили капчу ввести, и понял я, нечего на яндексе ловить и пошел в гугл и яху.ком, там почему-то ботов не боятся) От прокси мало толку будет, если запросов много, то их(проксей) соответственно тоже нужно будет много.
Выкидывает капчу сразу.. (то есть не грузится нужная страница, а опять та же с капчей. Файл кукисов создался и имеет данные, но это не помогает к сожалению.) Можно как то обойти это дело..? Прокси может использовать..?
На чем запускаешь скрипт? Хотя бы несколько запросов должно без капчи обработать. Какая версия cURL'а установлена? У меня все нормально открывает.
на обычном хостинге.. версия курла cURL support enabled cURL Information libcurl/7.19.7 OpenSSL/0.9.8m zlib/1.2.3
Кстати получилось первый раз подгрузить через прокси очередной... Ура.. Спасибо.. проблема в том что забыл удалить куки когда заходил без прокси...