powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Время между станциями метро Москва
15 сообщений из 15, страница 1 из 1
Время между станциями метро Москва
    #39109547
stuffhappens
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, доброго дня.

Есть необходимость разово выгрузить время проезда между всеми станциями метро Москвы. Судя по всему, эту информацию проще всего получить через Яндекс.Метро: https://metro.yandex.ru/moscow

Нужный результат получается если отправить запрос вида
https://metro.yandex.ru/moscow?from=53&to=61&route=0
где после from и to идут id-шники станций.

Вопрос в том, как получить связь названия станции и ее id. Посмотрел скрипт _index.ru.js, там есть функция getStationArray, но то ли это? Как ее вызвать и сохранить результат?

Спасибо.
...
Рейтинг: 0 / 0
Время между станциями метро Москва
    #39109552
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз разово - не проще тупо вручную, чем долго искать автоматизацию. Тем более номера станций вдоль линий идут подряд (разве что крайние станции надо перепроверить - свежевведенные)
...
Рейтинг: 0 / 0
Время между станциями метро Москва
    #39109553
stuffhappens
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Станций не так мало, и я не заметил, чтобы номера шли подряд. Например, Мякинино-Строгино.
...
Рейтинг: 0 / 0
Время между станциями метро Москва
    #39109557
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мякинино - станция относительно новая, добавлена позже. Строгино-Крылатское, например, уже идут подряд.

Например, Бульвар Рокоссовского - Юго-Западная - номера подряд 1-19.
Тропарево - отдельно - ее открыли недавно.
Тут на полчаса работы всего.
...
Рейтинг: 0 / 0
Время между станциями метро Москва
    #39109708
stuffhappens
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

К сожалению, вопросы на этом не закончились.
Даже если знать id и давать запрос в виде
https://metro.yandex.ru/moscow?from=53&to=61&route=0
ответный html не содержит элемента со временем в пути. Он то ли javascript'ом потом добавляется, то ли еще как-то.

Для скачки пробовал использовать класс, как описано здесь:
http://stackoverflow.com/questions/1307800/view-generated-source-after-ajax-javascript-in-c-sharp

Как можно получить ответ с необходимым html элементом?
...
Рейтинг: 0 / 0
Время между станциями метро Москва
    #39109729
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так проанализируй отладчиком браузера обмен с сервером.
...
Рейтинг: 0 / 0
Время между станциями метро Москва
    #39109779
stuffhappens
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

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

Попробовал создать WinForms приложение с элементом WebBrowser.

Есть следующий код:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
        private void btnGo_Click(object sender, EventArgs e)
        {
            webBrowser.Navigate(@"https://metro.yandex.ru/moscow?from=96&to=62&route=0");
            while (webBrowser.IsBusy)
            {
                Application.DoEvents();
            }

        }

        private void btnGetHtml_Click(object sender, EventArgs e)
        {
            File.WriteAllText(@"C:\subway.html", webBrowser.DocumentText);
        }



Сначала жму на GO (вызывается btnGetHtml_Click), когда в браузере отображается время в пути жму на GetHtml (вызывается btnGetHtml_Click). При этом в сохраненном файле время в пути отсутствует. Как такое может быть? Если смотреть в Chrome, там
Код: html
1.
<span class="route-list-item__time">&#8776;&nbsp;23 мин.</span>


отображается...
...
Рейтинг: 0 / 0
Время между станциями метро Москва
    #39109785
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В DocumentText, если не ошибаюсь, хранится только то, что загружено первым запросом, изменения DOM там не отражаются.
Вроде бы можно подключиться к DOM загруженного документа в webBrowser, кажется было что-то на эту тему, но сам я не лазил, не подскажу.
...
Рейтинг: 0 / 0
Время между станциями метро Москва
    #39109786
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот что подумал, у яндекс-карт ведь есть АПИ. Сами яндекс-карты умеют строить маршруты "на общественном транспорте". Может попробовать воспользоваться этим АПИ?
...
Рейтинг: 0 / 0
Время между станциями метро Москва
    #39109868
stuffhappens
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

речь о https://tech.yandex.ru/maps/ ? Я не нашел там возможность смотреть время на общественном транспорте...
С dom'ом в WebBrowser тоже не ясно. Про DocumentText в MSDN пишут следующее:
Gets or sets the HTML contents of the page displayed in the WebBrowser control.
Что вызывает вопрос: как так получается, что WebBrowser отображает элемент (его можно посмотреть в Google Chrome), который при этом в свойстве DocumentText не отображается? Как этот элемент можно посмотреть?
...
Рейтинг: 0 / 0
Время между станциями метро Москва
    #39109902
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stuffhappensкак так получается, что WebBrowser отображает элемент (его можно посмотреть в Google Chrome), который при этом в свойстве DocumentText не отображается?если изменения в DOM внесены ява-скриптом.
Хром и другие отладчики как бы восстанавливают html из DOM для удобства отладки. А DocumentText хранит первоначальный текст документа, который был загружен изначальным запросом.
Чтобы было понятно, нажмите правой кнопкой в браузере и выберите "просмотр кода страницы". Это и есть DocumentText (в первоначальном виде).
stuffhappensКак этот элемент можно посмотреть?через DOM
...
Рейтинг: 0 / 0
Время между станциями метро Москва
    #39110114
stuffhappens
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Shocker.Pro,

Спасибо, получилось.

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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
      var htmlDocument = (IHTMLDocument2)webBrowser.Document.DomDocument;
            foreach (IHTMLElement element in htmlDocument.all.OfType<IHTMLSpanElement>())
            {
                var classAttribute = element.className;
                if (classAttribute == "route-list-item__time")
                {
                    var durationText = element.innerHTML;
                    var durationRegex = new Regex(@"^&#8776;(&nbsp;(?<Hours>\d+) ч\.)?(&nbsp;(?<Mins>\d+) мин\.)?");
                    var match = durationRegex.Match(durationText);

                    if (match.Success == false)
                        throw new Exception();

                    var hourText = match.Groups["Hours"].Value;
                    var minText = match.Groups["Mins"].Value;
                    var duration = 0d;

                    if (!String.IsNullOrWhiteSpace(hourText))
                        duration += double.Parse(hourText.Trim()) * 60;

                    if (!String.IsNullOrWhiteSpace(minText))
                        duration += double.Parse(minText.Trim());

                    return duration;

                }
            }
            throw new Exception();
...
Рейтинг: 0 / 0
Время между станциями метро Москва
    #39110118
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну еще справочник станций выложи плиз, чтобы кому-то второй раз ту же работу не делать )
...
Рейтинг: 0 / 0
Время между станциями метро Москва
    #39111530
stuffhappens
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Станции тоже в автоматическом режиме тащил. Делал запросы вида https://metro.yandex.ru/moscow?from=1&to=2&route=0
from фиксировано, to изменяется.

Дальше название станций (from и to) можно вытащить так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  private List<string> GetStations()
        {
            var result = new List<string>();
            var htmlDocument = (IHTMLDocument2)webBrowser.Document.DomDocument;
            foreach (IHTMLElement element in htmlDocument.all.OfType<IHTMLDivElement>())
            {
                var classAttribute = element.className;
                if (classAttribute == "route-details-block__terminal-station")
                {
                    result.Add(element.innerText);
                }
            }
            return result;

        }
...
Рейтинг: 0 / 0
Время между станциями метро Москва
    #39111533
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, ну логично.
Спасибо. )
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Время между станциями метро Москва
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]