Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Авторизация на сайте и сохранение страницы


Автор: falconna 19.4.2011, 14:21
День добрый. Есть такое задание: необходимо авторизоваться на сайте, перейти по ссылке и сохранить xml-код страницы.
Пыталась реализовывать при помощи WebBrowser и HttpWebRequest-HttpWebResponse.
В первом случае авторизация проходит успешно, но доступен лишь хтмл-код нужной страницы.
Во втором - выдается сообщение "Удаленный сервер возвратил ошибку: (401) Несанкционированный". Куки я сохраняю, но каким-то образом информация об авторизации теряется. Код:
Код

public void GetXML(string url)
        {
            string Output = null;
            string accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, */*\r\n";
            string useragent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon; .NET CLR 2.0.50727; .NET CLR 3.0.04506.590)";
            string sCookies = "";

            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://hh.ua/logon.do?username=Мой_Логин&password=Мой_пароль");
            request.Method = WebRequestMethods.Http.Get;
            request.Accept = accept;
            request.UserAgent = useragent;
            request.KeepAlive = true;
            try
            {
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                //Сохраняем куки
                if (!String.IsNullOrEmpty(response.Headers["Set-Cookie"]))
                {
                    sCookies = response.Headers["Set-Cookie"];
                }
            }
            catch (WebException WE)
            {
                // Сообщение об ошибке
                MessageBox.Show(WE.Message);
                return;
            }

            request = (HttpWebRequest)HttpWebRequest.Create(url);
            if (!String.IsNullOrEmpty(sCookies))
            {
                request.Headers.Add(HttpRequestHeader.Cookie, sCookies);
            }

            try
            {
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                //Считываем данные из запроса
                StreamReader DataRead = new StreamReader(response.GetResponseStream());
                //Записываем в строку
                Output = DataRead.ReadToEnd();
                StreamWriter sw = File.CreateText(@"C:\resumesSearch.xml");
                sw.WriteLine(Output);
                sw.Close();
                DataRead.Close();
            }
            catch (WebException WE)
            {
                //Сообщение об ошибке
                MessageBox.Show(WE.Message);
                return;
            }
        }


Будьте добры, подскажите, в чем может быть ошибка?
Ну или посоветуйте, есть ли у WebBrowser возможность сохранения страниц в xml-формате (использование конвертеров типа sgml reader толку не дает).

Автор: DenWPF 19.4.2011, 14:56
не чего вам не вернет в xml. Вы достаете html и конвертируете его в xml если конечно это удастся.

Автор: falconna 19.4.2011, 15:08
DenWPF, а еще ведь есть webClient со всякими Download-методами. Они тоже не помогут?

Автор: DenWPF 19.4.2011, 15:11
Пойми, то что ты делаешь, это (почти) тоже самое что зайти через браузер на сайт и просмотреть исходных код, и ты увидишь именно html.

Если html валидный то можно легко его конвертировать.

Автор: falconna 19.4.2011, 15:21
DenWPF, ну гм... При просмотре в браузере HTML-кода нужной мне страницы отображается именно xml, а не хтмл. Вот я и подумала, что при скачивании ее тоже могу получить нужный формат. Разве нет?

Автор: DenWPF 19.4.2011, 16:04
аааа так бы и говорил. 

только я не понял, xml тебе в чем нужен ? в файле? 
тогда просто строку сохрани, а можешь через, вроде,  XmlDocument xd = new XmlDocument();  xd.Load(файл)  либо должно быть xd.LoadXml(строка)

Автор: falconna 19.4.2011, 16:57
DenWPF, Ну это понятно. Проблема была в том, что при помощи WebBrowser (свойство DocumentText) нельзя было (в данном конкретном случае) получить строку xml, а потому и в xml-документ загружать было нечего. 
В общем, проблему уже решила. Но большое спасибо за участиеsmile

Вот. Может кому-то пригодится.
Код

static void GetXML(string url, string login, string password, string path)
        {
            //Создаем запрос
            WebRequest request = WebRequest.Create(url);
            //Задаем данные аутентификации
            request.Credentials = new NetworkCredential(login, password);
            try
            {
                //Отправляем запрос, получаем код страницы
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream dataStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(dataStream);
                //Считываем данные
                string responseFromServer = reader.ReadToEnd();
                //Записываем в файл
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(responseFromServer);
                doc.Save(path);
                reader.Close();
                dataStream.Close();
                response.Close();
                Console.WriteLine("Готово!");
                Console.ReadLine();
            }
            catch (WebException WE)
            {
                //Сообщение об ошибке
                Console.WriteLine(WE.Message);
                Console.ReadLine();
                return;
            }
        }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)