Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Веб-сервисы и WCF
Войти
Регистрация
Восстановить пароль
 
deepz
62 / 62 / 53
Регистрация: 04.10.2013
Сообщений: 263
#1

WebClient и Ajax

13.08.2018, 17:25. Просмотров 70. Ответов 2
Метки нет (Все метки)

Всем привет, я пытаюсь получить таблицу с сайта: https://raexpert.ru/about/disclosure/sovereign_calendar
Но есть одна проблема, которую я не могу решить.
Оказалось, что сайт не сразу создает эту таблицу, а выполняется js код, точнее ajax.
И результат его(js кода) работы, формирует страницу.
Каким образом можно получить html разметку с данными таблицы.

С помощью WebBrowser, я тоже пытался сделать, но там аналогичный результат был, всё та же разметка, с кусками js кода.

Возможно ли как-нибудь составить запрос по аналогии ajax в c# и отправить его на этот сайт, и чтобы результатом выполнения запроса, была нужная мне разметка с таблицей?

Только я не совсем понял, какой кусок на сайте выполняется и подгружает таблицу.

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
 public class RAExpertCalendar
    {
        private static string PHPSESSID { get; set; }//пробовал думал, может id сессии нужно (в итоге он не нужен)
        protected class RatingWebClient : WebClient//этот класс создавался только для того, что бы получить phpsessid
        {
            protected override WebRequest GetWebRequest(Uri uri)
            {
                WebRequest w = base.GetWebRequest(uri);
                w.Timeout = 1200 * 1000;
                ((HttpWebRequest)w).AllowAutoRedirect = false;
                return w;
            }
            protected override WebResponse GetWebResponse(WebRequest request) //WebException
            {
                request.Headers["Cookie"] = request.Headers["Cookie"];
                var response = base.GetWebResponse(request);
 
                if (!string.IsNullOrEmpty(response.Headers["Set-Cookie"]) && response.Headers["Set-Cookie"].Contains("PHPSESSID"))
                    PHPSESSID = GetHttpHeaderParam(response.Headers["Set-Cookie"], "PHPSESSID");
                return response;
            }
        }
        private static string GetHttpHeaderParam(string text, string param)//вытаскивает phpsessid из всей куки ответа
        {
            var ipos = text.LastIndexOf(param + "=");
            if (ipos != -1)
            {
                ipos += param.Length + 1;
                var sb = new StringBuilder(256);
                while (ipos < text.Length)
                {
                    char c = text[ipos++];
                    if (c == ';' || c == '\r') break;
                    sb.Append(c);
                }
                return sb.ToString();
            }
            return string.Empty;
        }       
 
        private void GetData()
        {
            HtmlDocument html = new HtmlDocument();
            try
            {
                using ( RatingWebClient wc  = new RatingWebClient())//поптыка со своим классом сделать
                {
                    html.LoadHtml(Encoding.UTF8.GetString(wc.DownloadData("https://raexpert.ru/about/disclosure/sovereign_calendar")));//не имеет значения кукую из ссылок здесь сперва открывать. 
 
                    wc.Headers["Accept"] = "text/html, application/xhtml+xml";
                    wc.Headers.Add(HttpRequestHeader.AcceptLanguage, @"ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3");
                    wc.Headers.Add(HttpRequestHeader.KeepAlive, "true");
                    wc.Headers.Add(HttpRequestHeader.Cookie,
                     "PHPSESSID=" + PHPSESSID +
                     "; _ym_uid=1533899167511528086; _ym_d=1533899167; _ga=GA1.2.799191842.1533899168; lang=ru; lang_id=1; _ym_visorc_3619=w; _gid=GA1.2.775770309.1534150025; _ym_isad=2");
                    wc.Headers.Add(HttpRequestHeader.Host, "raexpert.ru");
                    wc.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0");
                    
                    html.LoadHtml(Encoding0.UTF8.GetString(Decompress(wc.DownloadData(Url))));//Url=https://raexpert.ru/about/disclosure/sovereign_calendar - тут уже с заполненными header-ами отправляем post запрос
                }
 
                using (var webClient = new WebClient())//а тут аналогичная ситуация, но подумал, может если сайт вернет сжатую страницу, и там будут все данные, но тоже не помогло
                {
                        webClient.Headers["Accept"] = "text/html, application/xhtml+xml";
                        webClient.Headers.Add(HttpRequestHeader.AcceptEncoding, @"gzip");//тут в сжатом формате
                        webClient.Headers.Add(HttpRequestHeader.AcceptLanguage, @"ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3");
                        webClient.Headers.Add(HttpRequestHeader.KeepAlive, "true");
                        webClient.Headers.Add(HttpRequestHeader.Cookie,
                         "PHPSESSID=" + PHPSESSID +
                         "; _ym_uid=1533899167511528086; _ym_d=1533899167; _ga=GA1.2.799191842.1533899168; lang=ru; lang_id=1; _ym_visorc_3619=w; _gid=GA1.2.775770309.1534150025; _ym_isad=2");
                        webClient.Headers.Add(HttpRequestHeader.Host, "raexpert.ru");
                        webClient.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0");
 
                        MemoryStream zipStream = new MemoryStream();//ну и пытаюсь расшифровать ответ
                        Stream stream = webClient.OpenRead(Url);
                        GZipInputStream gz = new GZipInputStream(stream);
                        int _bytesRead = 1;
                        byte[] buffer = new byte[8192];
 
                        while (_bytesRead != 0)
                        {
                            _bytesRead = gz.Read(buffer, 0, buffer.Length);
                            zipStream.Write(buffer, 0, _bytesRead);
                        }
                        zipStream.Seek(0, SeekOrigin.Begin);
                        html.Load(zipStream, Encoding.UTF8);
                }
                if (html.DocumentNode == null) //
                   throw new ApplicationException(@"Сайт вернул пустую разметку.");               
                var calendar = html.DocumentNode.SelectNodes(@"//div[@class='table-scroll']/table/tbody/tr");
                if (calendar == null)
                {
                    throw new ApplicationException($"На сайте {Url}, не удалось найти таблицу.");
                }                                        
            }
            catch (ApplicationException aex)
            {
               Console.WriteLine(aex.Message)";                
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message)";
            }
        }
 
        byte[] Decompress(byte[] data)
        {
            using (var compressedStream = new MemoryStream(data))
            using (var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress))
            using (var resultStream = new MemoryStream())
            {
                zipStream.CopyTo(resultStream);
                return resultStream.ToArray();
            }
        }              
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2018, 17:25
Ответы с готовыми решениями:

WebClient асинхронная загрузка файлов
здравствуйте у меня возникла проблема при асинхронной загрузке файлов с помощью...

Кеширование результата работы Webclient.DownloadStringAsync() (Windows Phone 8 Webclient)
Всем привет. Приложение для Windows Phone 8. Запускаю под дебагом. ...

Глюки WebCLient'a
Подскажите пожалуйста почему может быть такая тема. Вот примерно такой код ...

Загрузка файлов WebClient
Имеется WebClient, который через метод OpenReadAsync загружает файл, и...

webclient или webBrowser
Проблема вот какая возникла и никак не могу найти как такое решить. Есть сайт...

2
insite2012
Модератор
Эксперт .NET
4849 / 3804 / 1094
Регистрация: 12.10.2013
Сообщений: 11,096
Записей в блоге: 2
13.08.2018, 17:49 #2
Цитата Сообщение от deepz Посмотреть сообщение
Каким образом можно получить html разметку с данными таблицы.
Через Selenium, например.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
 
namespace deepzDemo {
    class Program {
        static void Main(string[] args) {
            IWebDriver driver = new ChromeDriver();
            driver.Manage().Window.Size = new System.Drawing.Size(200, 100);
            driver.Navigate().GoToUrl("https://raexpert.ru/about/disclosure/sovereign_calendar");
            string pageSource = driver.PageSource;
        }
    }
}
1
deepz
62 / 62 / 53
Регистрация: 04.10.2013
Сообщений: 263
13.08.2018, 18:45  [ТС] #3
Спасибо, за ответ, пригодится ещё.

Оказывается вся разметка вернулась, и она оказалась слишком большой по длине, что не влезла в отображаемое окно.
И я не заметил (item-...'top'), троеточие.

В окне как бы отображалось начало и конец, а в середине были троеточие. Заметил только тогда, когда записал, весь результат запроса на сайт, в блокнот. И там была вся разметка.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2018, 18:45

WebClient не качает файл
WebClient перестал качать файл, раньше все было отлично а теперь не качает. В...

Класс WebClient и безопасность
Использую класс WebClient, для того чтобы залить файл на ftp. Пошуршав...

Описание класса WebClient
Интересует максимально широкое описание класса WebClient и всех его методов....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru