Нужна база городов из ВК

 
Посетитель
small user social cms
Медаль
Сообщений: 466
Поделитесь у кого есть нормальная?

Я сам вытянул, но там не хватает городов в больших регионах (не до конца видимо адекватный скрипт или ВК так отдает сейчас)

Нашёл 13 года на гите, но там у крупных городов нет региона, а таких 350 тысяч(((

В общем кто знает где взять, нидхэлп!
Посетитель
small user social cms
МедальПочетный донор проекта
Сообщений: 641
350 тысяч городов в России?
Вы уверены?
Я в ручную импортирую 1000 городов с координатами, но 350 тысяч...
Реклама
cms
Посетитель
small user social cms
МедальАвторитет форумаПочетный донор проекта
Сообщений: 1364
Александр, d России чуть более 1100 гродов, возможно там населенные пункты ещё? типа хутора,села и т.п.

А каким образом копируете? т.е. цикл как определяет что полный список выдан, а не популярный.
Фриланс по Intantcms 1 и 2 версий.Писать в ЛС. Отзывы заказчиков
Посетитель
small user social cms
Медаль
Сообщений: 466
skewes, kirkr, мне нужен мир, база вк вполне подходит, вот апи https://vk.com/dev/database.getCities

вот как парсю, там есть файлы примеры уроков, только токен надо добавить чтобы заработало https://www.youtube.com/watch?v=caUjr_9zvmk&t=3s
Посетитель
small user social cms
МедальАвторитет форумаПочетный донор проекта
Сообщений: 1364
Александр,
need_all1 – возвращать все города. 0 – возвращать только основные города.
флаг, может принимать значения 1 или 0
Параметры все?
а ключ какой используете? Сервисный ключ доступа не весь список дает!!!
Фриланс по Intantcms 1 и 2 версий.Писать в ЛС. Отзывы заказчиков
Посетитель
small user social cms
Медаль
Сообщений: 466
kirkr, Работаю с ключом доступа пользователя. Need_all изменял, он не существенно прибавляет количество городов с 900 к до милиона, хотя должно быть больше 2,2 млн
Посетитель
small user social cms
Медаль
Сообщений: 466
Там ошибка в алгоритме парсинга, не могу понять как исправить, сейчас для примера если городов больше 1000 получаем 1000, если больше 3000 тысяч то получаем 1002, если больше 6000 тысяч то получаем 1005
Посетитель
small user social cms
Медаль
Сообщений: 466
как бы так и есть , он определяет количество страниц, например 7 при 6000+ городов и проходит все 7 (или 6???) сдвигаясь на 1 город вместо 1000, получаются теже самые города +1

Код PHP:
  1. $regions = Baza::getRegions();
  2. foreach ($regions as $key => $region) {
  3. if ($cities = Vk::getCities($region, 0)) {
  4. $count = $cities->response->count;
  5. if ($count > 999) {
  6. echo "Городов больше тысячи\n";
  7. $pages = ceil($count/999);
  8. echo "Всего страниц - " . $pages . "\n";
  9. for ($offset = 1 ; $offset < $pages ; $offset++) {
  10. echo "Получаем страницу - {$offset}\n";
  11. if ($cities = Vk::getCities($region, $offset)) {
  12. Baza::addCities($cities, $region);
  13. }
  14. sleep(1);
  15. }
  16. } else {
  17. Baza::addCities($cities, $region);
  18. }
  19.  
  20. }
  21. //die;
  22. echo "---count: " . $count . "----";
  23. sleep(1);
  24. }
  25. echo "\n-------Скрипт отработал-------\n";
Вот тут что то не то с $offset
Посетитель
small user social cms
Медаль
Сообщений: 466
Неужели нет знатаков в прекрасное воскресное утро?)
Посетитель
small user social cms
МедальАвторитет форумаПочетный донор проекта
Сообщений: 1364
Код PHP:
  1.  
  2. $regions = Baza::getRegions();
  3. foreach ($regions as $key => $region) {
  4. if ($cities = Vk::getCities($region, 0)) {
  5. $count = $cities->response->count; //вот тут можно вывести переменную $count чтоб понять сколько гродов нашел скрипт
  6. if ($count > 999) { // условие деления на страницы при достижении счетчика более 999
  7. echo "Городов больше тысячи\n";
  8. $pages = ceil($count/999); // в переменной $pages количество страниц целых
  9. echo "Всего страниц - " . $pages . "\n";
  10. for ($offset = 1 ; $offset < $pages ; $offset++) { // тут цикл прохода постранично. ++ увеличиваем номер страницы Но почему pages больше offset ???
  11. echo "Получаем страницу - {$offset}\n";
  12. if ($cities = Vk::getCities($region, $offset)) {
  13. Baza::addCities($cities, $region);
  14. }
  15. sleep(1);
  16. }
  17. } else {
  18. Baza::addCities($cities, $region);
  19. }
  20.  
  21. }
  22. //die;
  23. echo "---count: " . $count . "----";
  24. sleep(1);
  25. }
  26. echo "\n-------Скрипт отработал-------\n";
  27.  
вот и смотрим в переменной $count сколько городов он получил.
Редактировалось: 1 раз (Последний: 4 февраля 2019 в 04:27)
Фриланс по Intantcms 1 и 2 версий.Писать в ЛС. Отзывы заказчиков
Посетитель
small user social cms
Медаль
Сообщений: 466
kirkr, спасибо за ответ и комментарии в коде, примерно так и понятно, на кануне после размышлений сделал так:
Код PHP:
  1. $regions = Baza::getRegions();
  2. foreach ($regions as $key => $region) {
  3. if ($cities = Vk::getCities($region, 0)) {
  4. $count = $cities->response->count;
  5. if ($count > 999) {
  6. echo "Городов больше тысячи\n";
  7. $pages = ceil($count/999);
  8. echo "Всего страниц - " . $pages . "\n";
  9. for ($offset = 0 ; $offset < $pages ; $offset++) {
  10. echo "Получаем страницу - {$offset}\n";
  11. if ($cities = Vk::getCities($region, $offset*1000)) {
  12. Baza::addCities($cities, $region);
  13. }
  14. sleep(1);
  15. }
  16. } else {
  17. Baza::addCities($cities, $region);
  18. }
  19.  
  20. }
  21. //die;
  22. echo "---count: " . $count . "----";
  23. sleep(1);
  24. }
  25. echo "\n-------Скрипт отработал-------\n";
Все регионы с ИД спарсились как нужно и получил 1,7млн+ вместо 2,2+ (уже прогресс)
Но вылезла другая проблема, судя по готовой базе 2013 года, у городов федерального значения ИД региона 0 , это города вроде Москвы или Торонто и их районов, типа Внуково или Пулково в Питере, таких городов и частей больше 350 тысяч и у всех ИД региона 0 (в текстовом поле area хотя там что то вроде "город Москва")) .
В коде выше они не спарсились вообще, поэтому 1,7 а не 2,2 , но основная проблема даже не в этом, что делать с регионом 0 , логично что он никуда не попадает и найти его в инстанте нельзя при выборе города, вот тут надо понять как быть???
Посетитель
small user social cms
МедальАвторитет форумаПочетный донор проекта
Сообщений: 1364
Александр,
выведите $count а потом уже рассуждать. Он скажет сколько городов отдает скрипт Вам!

Далее уже смотрите логику скрипта.
Фриланс по Intantcms 1 и 2 версий.Писать в ЛС. Отзывы заказчиков
Посетитель
small user social cms
Медаль
Сообщений: 466
kirkr, я пишу фактически от того что получаю в базу
Посетитель
small user social cms
МедальАвторитет форумаПочетный донор проекта
Сообщений: 1364
Александр,
ну смотрите
foreach ($regions as $key => $region)
это переборка массива.

Далее ставите ограничение сами же:
if ($cities = Vk::getCities($region, 0))

т.е. для всех городов условие юзаете . А только потом уже заносите в базу. И если в этом условие не только 0 значение есть, а для это надо проверить дамп массива, то Вы сами режете список городов.
Фриланс по Intantcms 1 и 2 версий.Писать в ЛС. Отзывы заказчиков
Посетитель
small user social cms
Медаль
Сообщений: 466
kirkr, с этим спасибо, помогли, ок.

Вопрос в том что получилось у меня 350 к городов с регионом 0, как с ними быть?

Иерархия в инстанте не позволяет выбирать город без региона, а назначить "вручную" регионы для такого количества городов нереально, вот тут надо какое то изящное решение.
В начало страницы
Предыдущая темаСледующая тема Перейти на форум:
Быстрый ответ
Чтобы писать на форуме, зарегистрируйтесь или авторизуйтесь.