none
Как загрузить динамически-создаваемую страницу RRS feed

  • Вопрос

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

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


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    29 июня 2012 г. 14:45
    Отвечающий

Ответы

  • Если вам нужно извлечь пару цифр - там может тянуть сразу данные, а не пустую страницу? Взять fiddler, и посмотреть каким запросом страница вытягивает данные. Потом сделать точно такой же запрос из кода. Там скорее всего какой-то json, есть куча способов разобрать его прямо нормальные .net-овые объекты.
    • Помечено в качестве ответа Abolmasov Dmitry 3 июля 2012 г. 8:29
    30 июня 2012 г. 11:43
  • создать свежее консольное приложение, подключить пакет http://nuget.org/packages/newtonsoft.json,

    using System;
    using System.Net;
    using System.Text.RegularExpressions;
    
    namespace ConsoleApplication4
    {
        class RecognitionInfo
        {
            public string UserId { get; set; }
            public int Points { get; set; }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                using (var client = new WebClient())
                {
                    string nickname = "pashapash";
    
                    var statsPage = client.DownloadString(String.Format("http://social.msdn.microsoft.com/profile/{0}/?ws=usercard-inline", nickname));
                    
                    var userIdRegex = new Regex(@"http\://api\.recognition\.microsoft\.com/v1/user/[^/]*/detail");
                    string detailApiUrl = userIdRegex.Match(statsPage).Value;
    
                    var rawData = client.DownloadString(detailApiUrl);
                    var recognitionData = Newtonsoft.Json.JsonConvert.DeserializeObject<RecognitionInfo>(rawData);
    
                    Console.WriteLine(recognitionData.Points);
                }
            }
        }
    }
    


    • Помечено в качестве ответа LXGDARKEditor 30 июня 2012 г. 12:29
    30 июня 2012 г. 12:23

Все ответы

  • А как именно происходит извлечение?
    30 июня 2012 г. 10:10
    Модератор
  • Пробовал с помощью WebClient.DownloadString и HttpWebRequest - результат одинаковй пустая шкурка без данных. Смотрел в фидлере запросы при открытии страницы в браузере, там видно что запускается выполнение скриптов из jqery, но программно  этого я делать не умею, ни когда раньше не нужно было. Сейчас вот решил пополнить знания.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    30 июня 2012 г. 10:14
    Отвечающий
  • Да, они загружают текст(Html и скрипты), но потом нужен интерпретатор(браузер) чтобы всё это отобразить и выполнить, скрипты сами тоже загружают и модифицируют Html при выполнении. Чтобы скрипты выполнялись нужна среда, наподобии WebBrowser.
    30 июня 2012 г. 10:29
    Модератор
  • То есть оптимальный вариант фоново грузить WebBrowser'ом а потом брать код готовой страницы?


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    30 июня 2012 г. 10:31
    Отвечающий
  • Да, можно. Только потом чем визуализировать этот код, если не браузером?
    30 июня 2012 г. 10:57
    Модератор
  • Мне из всего кода нужно извлечь пару цифр. Если бы именно эти цифры не появлялись динамически и проблем бы не было.

    Вообще мне казалось, что стандартные средства .Net позволяют имитировать работу браузера, или я не прав?


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    30 июня 2012 г. 10:59
    Отвечающий
  • В WebBrowser-е все цифры покажутся, но вот при попутке сохранить страницу в файл, они опять пропадут. Так что придется парсить "на лету", то что в него загружено.
    30 июня 2012 г. 11:36
    Отвечающий
  • Если вам нужно извлечь пару цифр - там может тянуть сразу данные, а не пустую страницу? Взять fiddler, и посмотреть каким запросом страница вытягивает данные. Потом сделать точно такой же запрос из кода. Там скорее всего какой-то json, есть куча способов разобрать его прямо нормальные .net-овые объекты.
    • Помечено в качестве ответа Abolmasov Dmitry 3 июля 2012 г. 8:29
    30 июня 2012 г. 11:43
  • Проблема вот в чем. Я как то сам разок пробовал работать с jqery. Принцип работы такой - задаешь нужному тегу некий ID, а затем скрипт срабатывая в нужный момент (например при загрузке страниц) извлекает данне из нужнорго места и вставляет их внутрь тега с заданным id. Так же происходит и здесь. То есть скрипт модифицирует страницу. Значит нужно либо как то заставить скрипт модифицировать тот html что я получаю (а тут как я понимаю только варианта с WebBrowser), либо извлечь результат работ скрипта, но тут идей ноль.

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


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    30 июня 2012 г. 11:53
    Отвечающий
  • Какое именно значение из профиля надо вытянуть?
    30 июня 2012 г. 12:00
  • Ну для начала количество баллов, но в образовательных целях конечно хотелось бы понять как втянуть любое динамически создаваемое значение.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    30 июня 2012 г. 12:01
    Отвечающий
  • создать свежее консольное приложение, подключить пакет http://nuget.org/packages/newtonsoft.json,

    using System;
    using System.Net;
    using System.Text.RegularExpressions;
    
    namespace ConsoleApplication4
    {
        class RecognitionInfo
        {
            public string UserId { get; set; }
            public int Points { get; set; }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                using (var client = new WebClient())
                {
                    string nickname = "pashapash";
    
                    var statsPage = client.DownloadString(String.Format("http://social.msdn.microsoft.com/profile/{0}/?ws=usercard-inline", nickname));
                    
                    var userIdRegex = new Regex(@"http\://api\.recognition\.microsoft\.com/v1/user/[^/]*/detail");
                    string detailApiUrl = userIdRegex.Match(statsPage).Value;
    
                    var rawData = client.DownloadString(detailApiUrl);
                    var recognitionData = Newtonsoft.Json.JsonConvert.DeserializeObject<RecognitionInfo>(rawData);
    
                    Console.WriteLine(recognitionData.Points);
                }
            }
        }
    }
    


    • Помечено в качестве ответа LXGDARKEditor 30 июня 2012 г. 12:29
    30 июня 2012 г. 12:23
  • Честно сказать немного стыдно осознавать, что ларчик просто открывался. Ведь в фидлере была видна страница с детализацией по профилю, и ссылка на нее есть в шкурке профиля, то есть можно обойтись и без Json просто получить страницу такого вида
    "http\://api\.recognition\.microsoft\.com/v1/user/[^/]*/detail"
    из извлечь из нее нужные данные. Json тут не основной игрок, а просто помощник. Спишу на то что когда смотрел запрос в фидлере был уже вечер пятницы :) и я просто проморгал.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    30 июня 2012 г. 13:00
    Отвечающий