- PVSM.RU - https://www.pvsm.ru -

Полный список кодов регионов Яндекса

Данная статья предназначена для тех, кто работает с анализом поискового продвижения в Яндекс или занимается рекламой в директ. Полученные здесь регионы используются так же в объявлениях (Директ) и могут быть полезны при написании программ для работы с API Директ. Так же регионы можно использовать в отчетах Яндекс Метрики для получение статистики только по определенным регионам, если этого требует задача.

Ниже я расскажу, как получить актуальный список регионов, но для этого необходим доступ к API Яндекс Маркета.

Письмо в службу поддержки
Я написал в поддержку xml.yandex.ru [1] с просьбой предоставить список регионов или добавить возможность поиска региона через это же API. Ответ получил достаточно быстро, но ничего нового не узнал. Поддержка предложила использовать список регионов, выложенный в открытый доступ по ссылке: yandex.ru/yaca/geo.c2n [2].

Также они отметили, что предоставлять доступ к списку регионов у них нет возможности (впрочем это подразделение API «XML», вероятно не имеет доступа к списку регионов, хотя и использует их коды в своем функционале).

Как получить список всех регионов
Ранее я уже находил в интернете несколько архивов со списком регионов за 2009 и 2011 года, но опять-таки все они были неполные.

В поисках решения я заметил, что регионы в сервисе Яндекс Погода имеют те же идентификаторы. Таким образом можно спарсить большое число регионов пройдя по всему каталогу стран и городов в каталоге [3] Яндекс Погоды.

Я начал подготовку к написанию скрипта и обнаружил, что в этом каталоге отсутствуют некоторые населенный пункты (города / деревни).

Поискав в различных API Яндекса была найдена функция в API «Яндекс Маркет» [4], для получения необходимых регионов. Используя это API можно получить не только города, но и их районы и даже список станций метро (правда зачем это может понадобиться неизвестно).

Получение полного актуального списка регионов

MySql - Структура таблицы для хранения регионов

CREATE TABLE `regions` (
  `id` int(11) NOT NULL,
  `google_id` int(11) DEFAULT NULL,
  `mail_id` int(11) DEFAULT NULL,
  `coords` varchar(32) NOT NULL,
  `countryCode` varchar(2) NOT NULL,
  `type` varchar(24) NOT NULL,
  `name_ru` varchar(64) NOT NULL,
  `areaName_ru` varchar(64) NOT NULL,
  `name_en` varchar(64) NOT NULL,
  `areaName_en` varchar(64) NOT NULL,
  `childrenCount` smallint(6) NOT NULL,
  `parentId` int(11) NOT NULL,
  `status` tinyint(1) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

MySql - данные первого родительского региона

INSERT INTO `regions` (`id`, `google_id`, `mail_id`, `coords`, `countryCode`, `type`, `name_ru`, `areaName_ru`, `name_en`, `areaName_en`, `childrenCount`, `parentId`) VALUES
(10000, NULL, NULL, '', '', 'OTHER', 'Земля', '', '', '', 8, 0, 0)

PHP функция для получение регионов

Функция получается для родительского региона все регионы — потомки. После этого ее необходимо вызвать еще раз, для получения подпотомков и т.д.
usleep() — необходимо для соблюдения ограничений API Маркета (не более 10 запросов в секунду).

// Возможные типы регионов:
// CONTINENT — континент;
// REGION — регион;
// COUNTRY — страна;
// COUNTRY_DISTRICT — федеральный округ;
// SUBJECT_FEDERATION — субъект федерации;
// CITY — город;
// VILLAGE — поселок, село, деревня;
// CITY_DISTRICT — район города;
// METRO_STATION — станция метро;
// OTHER — другой тип населенного пункта.
function import_regions(){
	$api_key = 'ВАШ_КЛЮЧ';
	$limit = 30;

	$regions_ids = dbh()->sel('`id`')->from('regions')->where('`status` = 0')->limit(1000)->fetchAll(PDO::FETCH_COLUMN);
	$regions_ids = 1000;

	foreach($regions_ids as $region_id){
		$page = 1;
		$count_pages = 1;

		while($page <= $count_pages){
			$url = "http://api.partner.market.yandex.ru/v1/georegion/$region_id/children.json?count=$limit&page=$page&api_key=$api_key";

			$res = m('user')->get_content_new($url);
			$res = json_decode($res);
			if(isset($res->errors)){
				echo $res->errors[0];
				exit();
			}

			foreach($res->georegions->items as $item){
				if($item->id == -1) continue;

				$data = array(
					'id' => $item->id,
					'name_ru' => $item->name,
					'parentId' => $item->parentId,
					'childrenCount' => $item->childrenCount,
					'type' => $item->type,
					'status' => ($item->childrenCount == 0)
				);

				echo $item->name.'<br>';
				dbh()->insert('regions')->set($data, true)->exec();
				usleep(100000);
			}

			$count_pages = ceil($res->georegions->total / $limit);
			$page++;
		}

		dbh()->update('regions')->set(array('status' => 1))->where("`id` = '$region_id'")->exec();
	}
}

Список регионов Яндекса (только страны, области и населенные пункты)
Файл состоит из 5 колонок: id|name|region_name|coutryCode|type|parentId. Всего около 25000 регионов.
Список регионов Яндекса (.csv в .zip) [5].

Автор: Artemeey

Источник [6]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/php-2/108354

Ссылки в тексте:

[1] xml.yandex.ru: https://xml.yandex.ru

[2] yandex.ru/yaca/geo.c2n: https://yandex.ru/yaca/geo.c2n

[3] каталоге: https://pogoda.yandex.ru/region

[4] функция в API «Яндекс Маркет»: https://tech.yandex.ru/market/partner/doc/dg/reference/get-regions-id-children-docpage/

[5] Список регионов Яндекса (.csv в .zip): https://topvisor.ru/files/other/yandex_regions.zip

[6] Источник: http://habrahabr.ru/post/274647/