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

#1 1 февраля 2019 в 17:38
Поделитесь у кого есть нормальная?

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

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

В общем кто знает где взять, нидхэлп!
#2 2 февраля 2019 в 05:20
350 тысяч городов в России?
Вы уверены?
Я в ручную импортирую 1000 городов с координатами, но 350 тысяч…
#3 2 февраля 2019 в 06:34
Александр, d России чуть более 1100 гродов, возможно там населенные пункты ещё? типа хутора, села и т.п.

А каким образом копируете? т.е. цикл как определяет что полный список выдан, а не популярный.
#5 2 февраля 2019 в 12:54
Александр,

need_all1 – возвращать все города. 0 – возвращать только основные города.
флаг, может принимать значения 1 или 0

Параметры все?
а ключ какой используете? Сервисный ключ доступа не весь список дает!!!
#6 2 февраля 2019 в 13:07
kirkr, Работаю с ключом доступа пользователя. Need_all изменял, он не существенно прибавляет количество городов с 900 к до милиона, хотя должно быть больше 2,2 млн
#7 2 февраля 2019 в 16:46
Там ошибка в алгоритме парсинга, не могу понять как исправить, сейчас для примера если городов больше 1000 получаем 1000, если больше 3000 тысяч то получаем 1002, если больше 6000 тысяч то получаем 1005
#8 2 февраля 2019 в 17:48
как бы так и есть, он определяет количество страниц, например 7 при 6000+ городов и проходит все 7 (или 6???) сдвигаясь на 1 город вместо 1000, получаются теже самые города +1

  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
#9 3 февраля 2019 в 08:41
Неужели нет знатаков в прекрасное воскресное утро?)
#10 4 февраля 2019 в 04:21
  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 сколько городов он получил.
#11 4 февраля 2019 в 06:43
kirkr, спасибо за ответ и комментарии в коде, примерно так и понятно, на кануне после размышлений сделал так:
  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, логично что он никуда не попадает и найти его в инстанте нельзя при выборе города, вот тут надо понять как быть???
#12 4 февраля 2019 в 07:04
Александр,
выведите $count а потом уже рассуждать. Он скажет сколько городов отдает скрипт Вам!

Далее уже смотрите логику скрипта.
#13 4 февраля 2019 в 07:49
kirkr, я пишу фактически от того что получаю в базу
#14 4 февраля 2019 в 11:17
Александр,
ну смотрите
foreach ($regions as $key => $region)
это переборка массива.

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

т.е. для всех городов условие юзаете. А только потом уже заносите в базу. И если в этом условие не только 0 значение есть, а для это надо проверить дамп массива, то Вы сами режете список городов.
#15 4 февраля 2019 в 13:05
kirkr, с этим спасибо, помогли, ок.

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

Иерархия в инстанте не позволяет выбирать город без региона, а назначить "вручную" регионы для такого количества городов нереально, вот тут надо какое то изящное решение.
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.