Enhill Опубликовано 19 ноября, 2015 Жалоба Поделиться Опубликовано 19 ноября, 2015 Яндекс время от времени меняет свою верстку, что убивает наш любимый парсер. Это рабочий на данный момент парсер (надолго ли?)Скачать Цитата Ссылка на сообщение Поделиться на другие сайты
luxury Опубликовано 19 ноября, 2015 Жалоба Поделиться Опубликовано 19 ноября, 2015 Ну так они специально и меняют что бы не парсили. Цитата Ссылка на сообщение Поделиться на другие сайты
Sageron Опубликовано 19 ноября, 2015 Жалоба Поделиться Опубликовано 19 ноября, 2015 А у вас норм свойства парсит? Мне предлагает видимо каптчу ввести, но картинка каптчи битая: data:image/png;base64,SFRUUC8xLjEgMzAyIE1vdmVkIHRlbXBvcmFyaWx5DQpTZXJ2ZXI6IG5naW54DQpEYXRlOiBUaHUsIDE5IE5vdiAyMDE1IDA4OjE2OjMwIEdNVA0KQ29udGVudC1MZW5ndGg6IDANCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCktlZXAtQWxpdmU6IHRpbWVvdXQ9MTIwDQpYLUZvcndhcmRUb1VzZXItWTogMQ0KTG9jYXRpb246IGh0dHA6Ly9uYS5jYXB0Y2hhLnlhbmRleC5uZXQvaW1hZ2U/a2V5PWMyVTNlWFBpbloycHBVVHYzc2N6VzhhMG53akxRcGFqDQpYLVhTUy1Qcm90ZWN0aW9uOiAxOyBtb2RlPWJsb2NrDQpYLUNvbnRlbnQtVHlwZS1PcHRpb25zOiBub3NuaWZmDQpTdHJpY3QtVHJhbnNwb3J0LVNlY3VyaXR5OiBtYXgtYWdlPTMxNTM2MDAwDQpYLUNvbnRlbnQtVHlwZS1PcHRpb25zOiBub3NuaWZmDQoNCkhUVFAvMS4xIDIwMCBPSw0KU2VydmVyOiBuZ2lueA0KRGF0ZTogVGh1LCAxOSBOb3YgMjAxNSAwODoxNjozMCBHTVQNCkNvbnRlbnQtVHlwZTogaW1hZ2UvZ2lmOyBjaGFyc2V0PXV0Zi04DQpDb250ZW50LUxlbmd0aDogMjU3OQ0KQ29ubmVjdGlvbjogY2xvc2UNCg0KR0lGODlhyAA8APUAAAEBAQ0NDRQUFBwcHCQkJCwsLDMzMzw8PERERExMTFRUVFtbW2RkZGxsbHNzc3x8fP8AAP8VFf8kJP8qKv82Nv88PP9CQv9OTv9WVv9aWv9mZoSEhIyMjJOTk5ubm6SkpKysrLS0tLu7u/+Njf+QkP+lpf+ysv+8vMTExMvLy9PT09zc3P/Dw//Ly+Pj4+zs7P/q6vT09P/x8f///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAADIADwAAAb+wJlwSCwaj8ikcslsOp/QqHRKrVqv2Kz2WaJAIK2teEwum6OliAkGYZ3f8Lh8KhnNZO25fs+H491/Ti8xSS6EfYiJcXgnd20uAIYAKjMhAJcuMx4AASkzACgqAioxCgEBmYqqq1sTGo4sK5ExkzMgBJAukCkPCJ8oCwszGwYzKKzIyVQnEBkkj5EvtR4GkCseBDMiAJ8eqDMGHMrj5E4mEBjQBQYAnhwKuQ4CDAkA0gQNQgAh5f3+RRgs/JEVYhslBg+sNTjgoSGtBAVi0BLxr2K5FmD+5KJFqQAKWS42FCCyT4CHTx0sqkxW4QKsXNJUpIhoDQUAEENAbRhQKuL+yp+JzoXRGG2SgEuXfDUAIGAkqBcCOKwYwJQf0KvJRgn5cEDIihSHisRIsQKrWVYNUqUQd7at27dw48qdS7eu3bti8eqNExarxL18YrxYgQLEhw8eOnxYsUKXixcvlAkeJETiBg4gVEQGDCcGCnoGChxYwHSAAAIFRCdQUPZJXy0vRHBokMBAa8Ecehk48GEz5yiDU4T40MHDa4kqRKgwNENFgMiCXahAEeJAh9dEJmPH4gJFBwYKGHAI0XrGZBcrVFBDQMnucSa+H4BHUKBpXxVsxRL4QChsjA8F+GZECgh1AMJHY6mw3CDbJSHCCx0sgAACHKRAWRKEvKDAAOX+cdbgDAxs9oAHKGSSwAdEvJAAA9txhR1U7R3RAAMbyLdAAtUZsAADDTjwQAcCYigACgVwEOMhfyFByGofXnVIcoRcFkIq5h0RwDFi1VKZAgrkJYRNWBaxwAbbuSDAlNJRlwJVDnSwgQPgUalECgSgQEB72zUomJZxqfDAavw4sNoCDQB5BCRIHoLoEMQkmd0L9FBkRAgEbKdCNUYYIECHT4iSwqZJvpACCB5wICWnjCbQ5E8cHJCAByF4Yt5aCxiAgANyVjLAEQAOgUIAnMbgQQPBDKlkJ0YQIoJ/5hWwAYMSrTqEp5tW9gGxXCIQngIIyGqEA3AR4uMKzA7xwgP+ByBw3RAKPHBEAinN8EIB8Q4RwwYHILSBodshZISkRnxAAKrmrfrpCgK8gMIGCNAoArnmuSACeEdIa5GwXtqL5E4bDGGsEbXEIKgRrXorRIxFoCBAXzEYEKa9bWLnqC5HOCcLB8E8QIpYLnDATcVvUVrlEod8oJUsQZq3Llec2nlMf4SswECu8iI7RApWE4ECBygW4YICBxyQoapGqBBJAQyA0JeowwazQJd2rUCAu8k6WgQAGXaNBAoHWGUuAmQeYUDg2c1obwNwZyeAA/mkDEBDQ+A0IDdkmesdsYRilgLVM7gAblsMGIDdChEq0HhlEjMQQqwMFpFSDOqKtUH+AklLZOcRax6CMMBEfOBvESIE0ATW2YXAwI4ciMCcEma3FcKVRqAA9mV0mxcCBw7A2eOPytsLgC/GFeFBt4XsY8QLBHgSAwc+HaFAvZHzVG7KAgwdgwoblGhxc7uexYvgDNhZf0DAgDaFIBTC8UABx5MKWFXsAKfLUGFi5QILDe1qvnABQ3jWuQNIzl4fKAbRUNC/7NirMiJITLJE4ZbXRGYBAupZm/T3KBG8aTxJAyGwXiCxB/jIhw1owAY+gLIhkOsWQXJBPsz0MvN8wBeoq5idYnBAJUCKAdkoW/3M8sHsqG1oUnsACl7jgI5VJgUbaMB4IJas4SiwUAdKgUz+QuCmDeQPd6erDKUygYKkSY0IjTmCCAoAAgQ0kYrCMA8P4TetEl4lAbwbgt+E0AAPLI8IYhQLfhbwgA+QhUHqGdMDkmchu8VgBSGw42KG8LXmeI1QMjthZVAgwux8xQB6QyH5ZKnFs5iPCB6o3rT0dARIkS4BBLAVfdrlARCs4EIYEsEowdK5ADCSineiogIkkgIRGOYDINjcIYQmlmsg4DVfm+QpzZgdFWQRK+0ogiGxQCmwxKCCKJAjY/ZXmReAYAFSiUED1Pk1BsjrnsMCIgMWOsoQDIJIyUqBAnIpBBecpAhrqtkW4WmyGRAsCbFKFuMqI4BIPuEFYjOPCr7+s4FlYVR003nA3JpZIh6i8jtpi0EiMTqwZJkwBiCopb1WMBKzgMKnTYgBAbpYmQFgSWRQlMK8Psi2Mn4gFOkh1QawyIHHsMwQ3QGBoEKAnZnoSWEgAMEBvcqKHEpBAeyszOeAZi57nC8AYUEY0ZTUgZRargMOeFsCILiBiSoJG/ZSwbUcECbbDUBAEvnKsBrgQ/Bwkoj8NGE/K+jNA/HQbrYkUWaR8IHEVXSp86MfdlBw0coIUyxu9Uq1kpUe9EzpdYeikSbTWCEjKmAz9yzMVn0Eq+F0wFSB3QA1PQOFU4KAAwsNIo/UCM7GDOK6KfBAYJtIhcFccAZPpOgLhoP+yZ0SoYjyUgIIXFoxuAKNm3jFEAlRZjugGqBdByIXD71Tox51gBTRYqVsgugBFaygK0wQzNZ65CMDoUAEH8ge44R4XOIwjkYf1QJQZXWZwu6GCASYZBVQykgiiKBSSDiXKEBrLsT9a6MTK0ACehTEGTngA1OSpcIA1sMNiLhK/omNfGYIWa90s0ZwunAHqDmG2CpgNQFMUSRcw8rkIOZNC4hvMZ2KBFGswLSVEcILsNHRGcwkzOYRQQceIERPPrMyLHsAABDDgTVvDSEPkxkqk/wBKvVHlhliDIJG+4QFlGVVYfkVkqCQgNUoIBgM1VNgK4YuR/XFBR2gEO4c+Rf+aPJyzPbSFpee7NzAdhKrCrrejm6cCmkRugq0aXXdNPYA06b2CEOMFRuVEIOF0jbEmlXYtWKHu3fWTVhSqeBzuTXU2qFyq+GZ0aOFCALOOeHVzW2AAZgqlj/vZzqk8g169/qhFXxDLBwQnb0E+2jT/Xham6LOB7DMo8owIGwJgDQHchhgIlTQuMXx7EqIMVCWEaGvD3m0r81FtMzeu5gCyOV/1uzjzWFIFghwNI+Iay6LfkA52BYMiy2CAmJVrz+fsRUHYiCCgsgxttwBxXF28iFXr04Ecrwkr6WAbVb0RwSnm5ABDMAAD2TYDAt50QBaq7GeF+w4I/8Nw4XQkAM5LjpJTl+CNLirCRRf4c9Zl7qS+NALmRGgxGJPRr/3IA2T2iJhaY97gtmruLjK/e5PsCDe9853ZQQBADs= Цитата Ссылка на сообщение Поделиться на другие сайты
REGNET Опубликовано 23 ноября, 2015 Жалоба Поделиться Опубликовано 23 ноября, 2015 Тоже не работает Цитата Ссылка на сообщение Поделиться на другие сайты
imoto Опубликовано 7 декабря, 2015 Жалоба Поделиться Опубликовано 7 декабря, 2015 Вариант пока что рабочий, по крайней мере у меня, спасибо. Цитата Ссылка на сообщение Поделиться на другие сайты
dima5958555 Опубликовано 11 декабря, 2015 Жалоба Поделиться Опубликовано 11 декабря, 2015 не работает у меня Цитата Ссылка на сообщение Поделиться на другие сайты
mustang75 Опубликовано 26 декабря, 2015 Жалоба Поделиться Опубликовано 26 декабря, 2015 не парсит кортинко (( Цитата Ссылка на сообщение Поделиться на другие сайты
Алексей Склейнов Опубликовано 9 октября, 2016 Жалоба Поделиться Опубликовано 9 октября, 2016 // Для использования прокси используйте строки: define("USE_PROXY", 0); // 1 = использовать прокси define("PROXY", 'xxx.xxx.xxx.xxx:80'); define("PROXY_USER", 'login:password'); // Настройка региона в маркете define("REGION", '101852'); // 213 - москва, список регионов: http://search.yaca.yandex.ru/geo.c2n define("DOMAIN", 'market.yandex.by'); // для России нужно market.yandex.ru session_start(); // Временный файл для хранения cookies // Так как временный файл существует до окончания выполнения скрипта, // сохраняем его содержимое в сессию $cookies_filename = tempnam(sys_get_temp_dir(), 'yandex_market_cookies'); if(!empty($_SESSION['yandex_market_cookies'])) file_put_contents($cookies_filename, $_SESSION['yandex_market_cookies']); // Для изменения региона нужно обратиться сюда $url = 'https://yandex.ru/tune/geo/?retpath=http%3A%2F%2Fmarket.yandex.ru'; get_page($url); // Ключевое слово для поиска $keyword = ''; if(!empty($_GET['keyword'])) $keyword = $_GET['keyword']; // Если нам запостили капчу, отправим ее на проверку if(!empty($_GET['captcha'])) { $page = get_page("https://".DOMAIN."/checkcaptcha?key=".urlencode($_SESSION['captcha_key'])."&retpath=".urlencode(html_entity_decode($_SESSION['captcha_retpath']))."&rep=".urlencode($_GET['captcha'])); } // Адрес страницы с результатами поиска $url = "https://".DOMAIN."/search?text=".urlencode($keyword)."&cvredirect=1"; // Выбираем результаты поиска $page = get_page($url); if(preg_match('/src="(http:.*captchaimg[^"]*)" alt=""\/>/ui', $page, $match)) { $captcha_image = $match[1]; if(preg_match('/<input class="form__key" type="hidden" name="key" value="(.*)"\/><input class="form__retpath"/ui', $page, $match)) { $_SESSION['captcha_key'] = $match[1]; } if(preg_match('/<input class="form__retpath" type="hidden" name="retpath" value="(.*)"\/><div class="form__trigger"/ui', $page, $match)) { $_SESSION['captcha_retpath'] = $match[1]; } } $result = new stdClass(); if(!empty($captcha_image)) { $result->captcha = base64_encode(get_page($captcha_image)); } $result->product = parse_product($page); header("Content-type: application/json; charset=UTF-8"); header("Cache-Control: must-revalidate"); header("Pragma: no-cache"); header("Expires: -1"); print(json_encode($result)); // Функция забирает содержимое страницы по указанному URL function get_page($url, $level=0) { // Имя временного файла, в котором хранятся куки для CURL global $cookies_filename; // Максимальный уровень рекурсии $max_level = 20; if($level >= $max_level) return false; // Должен быть установлен curl if(!function_exists('curl_init')) { trigger_error("curl does not exists"); return false; } // Инициализируем curl $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_VERBOSE, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36"); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookies_filename); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookies_filename); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3', 'Connection: keep-alive' )); // Нужно установить регион $cookies_content = file_get_contents($cookies_filename); $new_cookies_content = preg_replace('/(yandex_gid).*/', "$1\t".REGION, $cookies_content); if($new_cookies_content == $cookies_content) $new_cookies_content .= "\n.yandex.ua\tTRUE\t/\tFALSE\t1\tyandex_gid\t".REGION."\n.yandex.ru\tTRUE\t/\tFALSE\t0\tyandex_gid\t".REGION; file_put_contents($cookies_filename, $new_cookies_content); // Яндекс любит рефереров и реже банит, если реферер правдоподобный // Указываем реферером адрес, запрошенный в прошлый раз if(!empty($_SESSION['yandex_market_last_visited_url'])) curl_setopt($ch, CURLOPT_REFERER, $_SESSION['yandex_market_last_visited_url']); // Настройки прокси: if(USE_PROXY) { curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1); curl_setopt($ch, CURLOPT_PROXY, PROXY); curl_setopt($ch, CURLOPT_PROXYUSERPWD, PROXY_USER); } // Выполняем запрос по адресу $data = curl_exec($ch); /* if(!$data) { trigger_error(curl_error($ch)); return false; } */ // Проверяем код ответа для проверки, нет ли редиректа $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // Больше нам curl не нужен curl_close($ch); // Записываем в сессию куки, которые отложил curl во временный файл $_SESSION['yandex_market_cookies'] = file_get_contents($cookies_filename); // Отделяем тело страницы от заголовка $dataArray = explode("\r\n\r\n", $data, 2); // Делим ответ на заголовок и тело if(count($dataArray)!=2) return false; list($header, $page) = $dataArray; // В случае редиректа рекурсивно следуем за яндексом if($httpCode == 301 || $httpCode == 302) { $matches = array(); preg_match('/Location:([^\n]*)/', $header, $matches); if(isset($matches[1])) { // Рекурсивно запрашиваем страницу по адресу редиректа $page = get_page(trim($matches[1]), $level+1); } } // В случае 404 пробуем еще несколько раз - яндекс часто глючит и отдает 404 if($httpCode == 404) { $page = get_page($url, $level+1); } // Сохраняем последний посещенный URL для реферера $_SESSION['yandex_market_last_visited_url'] = $url; // file_put_contents('yandex_page.tpl', $page, FILE_APPEND | LOCK_EX); // Отдаем тело страницы return $page; } // Функция отдает результат парсинга страницы function parse_product($page) { // Если это страница товара, ишем описание if(preg_match_all('/<div class="n-product-summary-toolbar">(.*)<\/div>/Uuis', $page, $matches)) { // Описание товара $description = '<ul>'.reset($matches[1]).'</ul>'; $result = new stdClass; $result->description = $description; // Страница характеристик if(preg_match_all('/<li class="n-product-tabs__item n-product-tabs__item_name_spec" data-name="spec"><a class="link n-smart-link i-bem" href="(.*?)"/ui', $page, $matches)) { $options_url = 'https://'.DOMAIN.reset($matches[1]); $options_page = get_page($options_url); preg_match_all('/<dl id="product-spec-" class="product-spec"><dt class="product-spec__name"><span class="product-spec__name-inner">(.*?)<.*?<span class="product-spec__value-inner">(.*?)\p{Z}?<\/span><\/dd><\/dl>/uis', $options_page, $matches, PREG_SET_ORDER); $options = array(); foreach($matches as $m) { $option = new stdClass; $option->name = str_replace("\n", "", $m[1]); $option->value = str_replace("\n", "", $m[2]); $options[] = $option; } $result->options = $options; } else return false; } // Иногда яндекс отдает не страницу конкретного товара, а список товаров. В этом случае переходим на страницу первого товара в списке elseif(preg_match_all('/<a class="snippet-card__image link i-bem snippet-card__image_js_inited link_js_inited link_hovered_yes" href="(.*?)"><img/ui', $page, $matches)) { $product_url = 'https://'.DOMAIN.reset($matches[1]); $page = get_page($product_url); return parse_product($page); } else return false; return $result; } свеженький get_info.php по состоянию на 10.10.2016 Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 10 октября, 2016 Жалоба Поделиться Опубликовано 10 октября, 2016 свеженький get_info.php по состоянию на 10.10.2016И у вас он работает? Цитата Ссылка на сообщение Поделиться на другие сайты
KeNs Опубликовано 13 октября, 2016 Жалоба Поделиться Опубликовано 13 октября, 2016 У меня не работает Цитата Ссылка на сообщение Поделиться на другие сайты
Алексей Склейнов Опубликовано 13 октября, 2016 Жалоба Поделиться Опубликовано 13 октября, 2016 И у вас он работает?да, работал на локалке, иначе не сбрасывал бы... возможно вам яша отдает страницу геоположения... но по парсу страницы характеристик этот скрипт верен... на днях выкладываю на хост движок, проверю и профикшу, потом сброшу и тот вариант. Проверяйте свои настройки местоположения, пробуйте заходить через прокси... точного ответа дать сейчас не смогу. Цитата Ссылка на сообщение Поделиться на другие сайты
serg33 Опубликовано 1 ноября, 2016 Жалоба Поделиться Опубликовано 1 ноября, 2016 Спасибо, действительно работает. Не забудьте менять региональные настройки Цитата Ссылка на сообщение Поделиться на другие сайты
Sageron Опубликовано 21 ноября, 2018 Жалоба Поделиться Опубликовано 21 ноября, 2018 Кто знает, этот парсер сейчас работает? А если нет, как на странице ProductAdmin его вообще скрыть? Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.