Jump to content

Рабочий парсер Ядекс Маркет


Recommended Posts

А у вас норм свойства парсит? Мне предлагает видимо каптчу ввести, но картинка каптчи битая:

 

 

 

 

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=
 
Link to post
Share on other sites
  • 2 weeks later...
  • 3 weeks later...
  • 9 months later...
// Для использования прокси используйте строки:
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

Link to post
Share on other sites

И у вас он работает?

да, работал на локалке, иначе не сбрасывал бы... 

 

возможно вам яша отдает страницу геоположения... но по парсу страницы характеристик этот скрипт верен... 

 

на днях выкладываю на хост движок, проверю и профикшу, потом сброшу и тот вариант.

 

Проверяйте свои настройки местоположения, пробуйте заходить через прокси... точного ответа дать сейчас не смогу.

Link to post
Share on other sites
  • 3 weeks later...
  • 2 years later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...