Перейти к содержанию
Официальный форум поддержки Simpla

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


Рекомендуемые сообщения

Яндекс время от времени меняет свою верстку, что убивает наш любимый парсер.

 

Это рабочий на данный момент парсер (надолго ли?)

Скачать
 

Ссылка на сообщение
Поделиться на другие сайты

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

 

 

 

 

data:image/png;base64,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
 
Ссылка на сообщение
Поделиться на другие сайты
  • 2 недели спустя...
  • 3 недели спустя...
  • 9 месяцев спустя...
// Для использования прокси используйте строки:
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

Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

 

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

 

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

Ссылка на сообщение
Поделиться на другие сайты
  • 3 недели спустя...
  • 2 года спустя...

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...