Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/12: Рейтинг темы: голосов - 12, средняя оценка - 4.83
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
1

Переход по страницам

14.04.2014, 14:51. Просмотров 2207. Ответов 28
Метки нет (Все метки)

Задача такая:
Есть ресурс http://sberbank-ast.ru/SupplierList.aspx (ASP.NET), нужно из под C# (обычное клиентское приложение) редиректиться на следующую по счёту страницу.
Проблема в том, что мне нужно программно нажать на кнопку перехода, которая в свою очередь вызывает java-script:

HTML5
1
2
3
4
5
6
<td>
                    
                    Страница
                    1
                    [B]<a id="ctl00_ctl00_phWorkZone_nextPage" href="javascript:__doPostBack('ctl00$ctl00$phWorkZone$nextPage','')">>></a>[/B]
                </td>
Как это сделать из клиентского приложения C# и какие вообще есть способы решения данной задачи?

Дополнительно:

Интересно было бы узнать, как можно вычислить количество страниц на указанном ресурсе (если это вообще возможно)?

Каждую страничку я буду записывать в файл.

Пока код выглядит примерно так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
for (int i = 0; i<15000; i++)
            {
                HttpWebRequest WebRequestObject = (HttpWebRequest)HttpWebRequest.Create("http://sberbank-ast.ru/SupplierList.aspx");
                
                HttpWebResponse Response = (HttpWebResponse)WebRequestObject.GetResponse();
                Stream WebStream = Response.GetResponseStream();
                StreamReader Reader = new StreamReader(WebStream);
                string content = Reader.ReadToEnd();
                StreamWriter writer = new StreamWriter("C:\\sb-ast\\htmlBot_"+i+".html");
                writer.Write(content);
                Reader.Close();
                writer.Close();
            }
По сути мне каждый раз нужно будет посылать запрос, но уже на следующую страницу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2014, 14:51
Ответы с готовыми решениями:

Переход по страницам в вк
Вот нашёл на просторах киберфорума код для авторизации во вконтакте, без API:...

Поиск по страницам HTML
Всем добрый день! Мне вот поставили задачу и мне нужна помощь. нужно сделать...

Переход по страницам. Глюки. Нужна подсказка
Нужно осуществить переход (next, previous) по страницам . При этом метод POST я...

Поисковил по текстовым страницам и БД
Кто может подсказать, какой-нибудь поисковик одновременно индексирующий...

Ограничение доступа к страницам на сайте.
Есть у меня две страницы. Одна общая с формой перехода на другую страницу в...

28
Монфрид
1211 / 1021 / 293
Регистрация: 07.03.2012
Сообщений: 3,243
Завершенные тесты: 2
14.04.2014, 15:01 2
ну был бы это сайт рога-и-копыта.ру, вы бы наверно без труда такое сделали. Но это сайт сбера, и ваш айпишник забанят после первой сотни обращений к странице
0
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
14.04.2014, 15:28  [ТС] 3
Пока не забанили, хотя я всего навсего сливаю всё ту же первую страницу (но каждый раз гружу её заново) )))
0
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
16.04.2014, 11:02  [ТС] 4
А вот и решение...

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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
using System;
using System.IO;
using System.Net;
using System.Web;
using System.Security.Policy;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Xml.XPath;
using HtmlAgilityPack;
using mshtml;
using System.Threading;
 
namespace HTMLBot
{
    class Program
    {
        
        
        
    public static string DownloadWebPage(string Url, string vs)
       {
           // открываем соединение
           WebRequest request = WebRequest.Create(Url);
           //задаем начальные аргументы
           string args = "__EVENTTARGET=ctl00%24ctl00%24phWorkZone%24nextPage&__EVENTARGUMENT=&__VIEWSTATE=";
           // заголовки
           //WebRequestObject.UserAgent = "Opera/9.51 (Windows NT 5.1; U; ru)";//или другой
           //WebRequestObject.Referer = "http://www.ru/";
           
            // если надо через прокси
//            string proxyAddress = "";
//            string username = "";
//            string password = "";
//
//            if (proxyAddress.Length>0 && username.Length>0 && password.Length>0)
//            {
//               WebProxy myProxy = new WebProxy();
//               Uri newUri = new Uri(proxyAddress);
//               myProxy.Address = newUri;
//               myProxy.Credentials = new NetworkCredential(username, password);
//               WebRequestObject.Proxy = myProxy;
//           }
            
 
            request.Method = "POST";
            if (vs == "")
            {
                
                args = "__EVENTTARGET=&__EVENTARGUMENT=";
            
            }
            else {args+=vs;}
            
            
            byte[] byteArray = Encoding.Default.GetBytes (args);
            // Задаём тип содержимого
            request.ContentType = "application/x-www-form-urlencoded";
            // Задаём длину контента
            request.ContentLength = byteArray.Length;
            // Получаем в поток данные из запроса
            Stream dataStream = request.GetRequestStream ();
            // Записываем данные
            dataStream.Write (byteArray, 0, byteArray.Length);
            // закрываем поток
            dataStream.Close ();
            
            // Получаем ответ
            WebResponse Response = request.GetResponse();
            Console.WriteLine (((HttpWebResponse)Response).StatusDescription);
            dataStream = Response.GetResponseStream();
            StreamReader Reader = new StreamReader(dataStream);
            
            // читаем полностью поток
            string PageContent = Reader.ReadToEnd();
            //Console.WriteLine (PageContent);
            // убираем за собой!
            Reader.Close();
            dataStream.Close();
            Response.Close();
            
            return PageContent;
       }
        
        public static void Main(string[] args)
        {
            if (!File.Exists("C:\\sb-ast\\viewstate.txt"))
            {
                File.CreateText("C:\\sb-ast\\viewstate.txt").Close();
            }
            StreamReader reader = new StreamReader("C:\\sb-ast\\viewstate.txt");
 
            string vs = reader.ReadToEnd();
 
            for (int i = 0; i<15000;i++) //заранее не смог узнать сколько страниц на портале, так что гадаем...
            {
                Thread.Sleep(500);
                reader.Close();
 
            
                HtmlDocument doc = new HtmlDocument();
                doc.LoadHtml(DownloadWebPage("http://sberbank-ast.ru/SupplierList.aspx", vs));
                
                string node = doc.GetElementbyId("ctl00_ctl00_phWorkZone_xmlData").Attributes["value"].Value;
                vs = HttpUtility.UrlEncode(doc.GetElementbyId("__VIEWSTATE").Attributes["value"].Value);
                Console.WriteLine(i+ " | "+vs);
                StreamWriter viewstate = File.CreateText("C:\\sb-ast\\viewstate.txt");
                
                viewstate.Write(vs);
 
                viewstate.Close();
 
                string temp = node;
                temp = temp.Replace("&lt;", "<");
                temp = temp.Replace("&rt", ">");
                XDocument d = XDocument.Parse(temp);
                d.Save("C:\\sb-ast\\test"+i+".xml");
 
                reader = new StreamReader("C:\\sb-ast\\viewstate.txt");
 
                vs = reader.ReadToEnd();
 
            }
 
 
    
            Console.WriteLine("Done!");
            Console.ReadKey();
        }
    }
    
}
1
Alexeyjke
6 / 6 / 3
Регистрация: 28.04.2014
Сообщений: 170
29.04.2014, 11:18 5
_arty_, Спасибо мил человек! Прям аналогичная задача была.
И как, работает? Ты делал паузу между запросами, чтоб не забанили?
0
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
29.04.2014, 11:20  [ТС] 6
Да, работает, и да, я сделал паузу чтоб не забанили, но код уже переделал (добавил фильтр по регионам и сливаю по каждому региону - так быстрее) и паузу убрал, не банят.
0
Alexeyjke
6 / 6 / 3
Регистрация: 28.04.2014
Сообщений: 170
29.04.2014, 11:35 7
Вот мне тоже в своём варианте надо сливать по каждому сообщению (заходить с фильтром, парсить, выходить), сливать в sql, а потом по листам жагать и повторять. Можешь выложить код с фильтром и по регионам?
0
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
29.04.2014, 12:22  [ТС] 8
Пожалуйста:
HTMLBot.zip

Сразу предупреждаю, бот может работать нестабильно (тут скорее вина не бота, а самого сайта СБ-АСТ), но в целом он свою работу делает и делает хорошо. Сливает с сайта сбербанка информацию в xml-файлы.
1
Alexeyjke
6 / 6 / 3
Регистрация: 28.04.2014
Сообщений: 170
29.04.2014, 12:57 9
Спасибо. Вот жаль мне вытаскивать не div надо.. Походу придётся к регулярным выражениям примкнуть!
0
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
29.04.2014, 13:43  [ТС] 10
Пользуйся HTMLAgilityPack и будет тебе счастье.
0
Alexeyjke
6 / 6 / 3
Регистрация: 28.04.2014
Сообщений: 170
29.04.2014, 16:50 11
я так понимаю ты спецом запоминаешь viewstate? А что если у меня нажатие на след. лист не nextpage, а у каждой свой номер? тоесть eventtarget с цифрой в конце:
ctl00$MainContent$UcTopDataPager$ctl00$ctl01
ctl00$MainContent$UcTopDataPager$ctl00$ctl02
ctl00$MainContent$UcTopDataPager$ctl00$ctl03

При нажатии на каждый лист - у каждого передаётся уже другой вьюстейт. Евенттаргет то можно с счётчиком плюсовать.
0
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
29.04.2014, 16:54  [ТС] 12
1. Viewstate
Да, предыдущий viewstate нужен для post-запроса для открытия следующей страницы, всё это можно увидеть с помощью IE+httpanalyzer, либо любой другой браузер (Chrome, Firefox, Opera).
2. ctl00$MainContent$UcTopDataPager$ctl00$ctl01 - не номер страницы, а думается мне, что это просто какой-то фильтр.
0
Alexeyjke
6 / 6 / 3
Регистрация: 28.04.2014
Сообщений: 170
29.04.2014, 17:25 13
Так и есть. у меня сайт http://fedresurs.ru/Messages
тут надо по определенной дате вытаскивать сообщения.
Нужны все типы, но за опр. дату.
Когда выбираем дату и вводим ок выдаёт список сообщения. так вот надо в каждый зайти и счесть инфу о них, а потом, когда все сообщения на странице прочтены, переключить на 2 лист, и так до конца.
Если посмотреть заголовки, то у каждой страницы свой вьюстейт. вот не знаю как переключать
0
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
29.04.2014, 21:21  [ТС] 14
Цитата Сообщение от Alexeyjke Посмотреть сообщение
Так и есть. у меня сайт http://fedresurs.ru/Messages
тут надо по определенной дате вытаскивать сообщения.
Нужны все типы, но за опр. дату.
Когда выбираем дату и вводим ок выдаёт список сообщения. так вот надо в каждый зайти и счесть инфу о них, а потом, когда все сообщения на странице прочтены, переключить на 2 лист, и так до конца.
Если посмотреть заголовки, то у каждой страницы свой вьюстейт. вот не знаю как переключать
Надо в post-запрос передавать целевое событие, которое переключает страницы, посмотри внимательно мой запрос:
Код
__EVENTTARGET=ctl00%24ctl00%24phWorkZone%24nextPage
У тебя это может быть что-то другое, также стоит помнить, что все данные запроса передаются в формате URI, поэтому в моём проекте есть некий анализатор, который может подсказать что тебе нужно подставить вместо красивой функции (названия), например "nextpage"
0
Alexeyjke
6 / 6 / 3
Регистрация: 28.04.2014
Сообщений: 170
19.05.2014, 18:00 15
я вот смотрю, у меня еще и _EVENTVALIDATION постоянно разный.. его тоже запоминать надо..?
0
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
19.05.2014, 19:22  [ТС] 16
Цитата Сообщение от Alexeyjke Посмотреть сообщение
я вот смотрю, у меня еще и _EVENTVALIDATION постоянно разный.. его тоже запоминать надо..?
Посмотрел я на fedresurs и понял что ты зря мучаешься с viewstate, там достаточно получить ссылку на последнее сообщение (в ней уже счетчик есть, они все по порядку идут) и запустить цикл по убыванию (так ты будешь листать страницы) и всё, забирай данные со страницы....

Добавлено через 13 минут
Для примера: http://fedresurs.ru/messages/55673, где 55673 - это номер последнего сообщения, запускаем цикл по убыванию и следующим по убыванию сообщением будет http://fedresurs.ru/messages/55672, у меня коллега на работе так и делает....
0
Alexeyjke
6 / 6 / 3
Регистрация: 28.04.2014
Сообщений: 170
20.05.2014, 09:33 17
_arty_, вот тоже сначала так думал. но не всё так просто..
Если ты посмотришь все сообщения подряд, то у них номера идут не подряд (извиняюсь за тавтологию).
Я вот щас тупо 1 страницу с сообщениями открыл, и там такие № сообщений:
('/messages/50418'); - первое
('/messages/50416');
('/messages/50407');
('/messages/48559');
('/messages/48930');
('/messages/50369');
....
('/messages/50344'); - последнее
Соответственно и у другого листа такой же раскидон.
То есть тут нифига нету последовательности, которую можно использовать =(
0
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
20.05.2014, 09:34  [ТС] 18
Цитата Сообщение от Alexeyjke Посмотреть сообщение
Соответственно и у другого листа такой же раскидон.
То есть тут нифига нету последовательности, которую можно использовать =(
Ничего не мешает проверять, загрузилась ли страница по ссылке или нет, затем продолжить перебор....
0
Alexeyjke
6 / 6 / 3
Регистрация: 28.04.2014
Сообщений: 170
20.05.2014, 09:50 19
_arty_ Понял.. Идея хорошая.
А как понять до какого сообщения вниз листать?
Думал сначала взять последнее сообщение от предыдущего дня, но я так понял что некоторые номера сообщений почему то вообще древние вылазят, видать не сразу их публикуют. Не листать же каждый день все 50 000+ сообщений!
0
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
20.05.2014, 09:54  [ТС] 20
У меня в исходнике есть пример, как понять что страниц больше нет, в твоём случае можно проверять на наличие (или заполнение) какого-либо элемента и от этого отталкиваться. Вообще не понимаю, зачем каждый день перебирать fedresurs.ru.
Но если есть такая потребность, ничего не мешает запоминать номер последнего сообщения (оно же в списке будет первым по дате добавления) и запустить цикл вперёд...
0
20.05.2014, 09:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2014, 09:54

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

WPF Переход по страницам и переход со страницы на главную форму
У меня есть главная страница (форма), есть еще одна страница. Хочу при нажатии...

Переход по страницам
Вообщем проблема такова, создаю свою игру закинула один скрипт, пропитала всё...


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

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

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