Re[6]: как скачать не всю web-страницу для экономии трафика?
От: Аноним  
Дата: 28.11.08 10:04
Оценка:
Здравствуйте, hattab, Вы писали:

H>Здравствуйте, Аноним, Вы писали:


А>>делается запрос на "www.rbc.ru", в начале страницы котировки валют, остальное не надо.


H>Нужен именно rbc? Может подойдет http://www.cbr.ru/scripts/XML_daily.asp?date_req=28%2F11%2F2008 или http://foxrate.org/ (там есть пример использования)


Я так и знал, что этим закончится
Нет, реальная задача совсем не о rbc. Есть сервер с нужной инфой и зажравшимся админом. Структура страницы не меняется уже пару лет, после меняющейся нужной инфы (первые 5 КБ) идет 30 КБ словесного мусора.
Re[7]: как скачать не всю web-страницу для экономии трафика?
От: Аноним  
Дата: 28.11.08 10:12
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, <Аноним>, Вы писали:

А>>Мне нужно точно знать что прога уже загрузила определенный кусок htm страницы, а не играть в угадайку
А>>Почему все так сложно??
А>>И на каком принципе работают File Downloaders с докачками кусков?
S>Они работают на хидере Range. Попробуй скормить в даунлоадер страничку www.rbc.com


HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(@"http://www.rbc.com");
HttpWebResponse webresponse;
webrequest.AddRange(1000);
webresponse = (HttpWebResponse)webrequest.GetResponse();
StreamReader streamr = new StreamReader(webresponse.GetResponseStream());
long lo = webresponse.ContentLength;
string WebPageStr = streamr.ReadLine();

?
Fiddler показал что скачано те-же 30К.
Re[7]: как скачать не всю web-страницу для экономии трафика?
От: Аноним  
Дата: 28.11.08 10:21
Оценка:
Здравствуйте, rameel, Вы писали:

R>Здравствуйте, <Аноним>, Вы писали:


А>>Мне нужно точно знать что прога уже загрузила определенный кусок htm страницы, а не играть в угадайку

А>>Почему все так сложно??

R>Документация к прочтению обязательна


R>1) http://msdn.microsoft.com/en-us/library/781fwaz8.aspx

R>2) http://msdn.microsoft.com/en-us/library/system.net.downloadprogresschangedeventargs.aspx

Неплохо, но к сожалению WebClient отсутствует в .NET Compact Framework (прога существует для десктопов и КПК).
Re[7]: как скачать не всю web-страницу для экономии трафика?
От: Аноним  
Дата: 28.11.08 10:28
Оценка:
Здравствуйте, matumba, Вы писали:

M>Здравствуйте, Аноним, Вы писали:


А>>>А почему бы не использовать метод WebRequest.Abort() ?


А>>Мне нужно точно знать что прога уже загрузила определенный кусок htm страницы, а не играть в угадайку

А>>Почему все так сложно??
А>>И на каком принципе работают File Downloaders с докачками кусков?

M>Они работают на принципе "лучше свой велосипед, но гарантированно рабочий".

M>Не сочтите за сложность, бросайте эти поделия типа WebRequest и сделайте небольшой
M>враппер для низкоуровневого сокета — сто крат окупится. А сам запрос до безобразия простой:
M>
M>GET / HTTP/1.0
M>Host: www.rbc.ru

M>

M>(не забудьте пустую строку после Host)
M>Посылаете его в сокет, читаете ответ и обрываете как только в буфере встретилась ключевая последовательность (это и гибче с точки зрения будущих изменений дизайна RBC).
M>Эта схема будет работоспособна и в случае, если сервер не поддерживает докачку частями.

M>PS

M>А что, кроме RBC никто курса валют не знает? Не помню точно, но вроде как есть ресурсы, сразу отдающие gif с котировками.

Что вы прицепились? rbc взял для примера.
Есть сайт у которого со страницы надо выцарапывать денежный баланс и детализацию (при этом необходимо в хедерах поддерживать параметры входа и куки),
все работает, но загвоздка в оптимизации трафика. Полагаю сокеты не поддерживают хедеры? Если ошибаюсь — не сочтите за труд ткнуть носом в пример
Re[8]: как скачать не всю web-страницу для экономии трафика?
От: itsprt  
Дата: 28.11.08 10:57
Оценка:
M>>
M>>GET / HTTP/1.0
M>>Host: www.rbc.ru

M>>


Это пример простейшего хидера
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[8]: как скачать не всю web-страницу для экономии трафика?
От: matumba  
Дата: 28.11.08 11:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Что вы прицепились? rbc взял для примера.


Какой глупый пример, такие же умные и ответы. Чем конкретнее описана задача, тем легче дать точный ответ.

А>Есть сайт у которого со страницы надо выцарапывать денежный баланс и детализацию (при этом необходимо в хедерах поддерживать параметры входа и куки)


Эти условия уже на порядок сложнее оригинального описания, не находите?
Придётся вам почитать стандарт RFC2616 (и сопутствующие доки).
Ещё вариант — поискать библиотеку для .НЕТ с более надёжным функционалом.

А> Полагаю сокеты не поддерживают хедеры?


Сокеты поддерживают ВСЁ. Но только руками.
Попробуйте протрасировать запрос браузера серверу — там простые строки, а что-куда подставлять подскажет RFC.

Если вам это кажется чересчур сложным, уловите суть проблемы: готовые классы не рассчитаны на подобное кульхацкерское применение, поэтому лучший вариант — скачивать руками.
Re[9]: как скачать не всю web-страницу для экономии трафика?
От: Аноним  
Дата: 28.11.08 14:32
Оценка:
Здравствуйте, matumba, Вы писали:

M>Здравствуйте, Аноним, Вы писали:


А>>Что вы прицепились? rbc взял для примера.


M>Какой глупый пример, такие же умные и ответы. Чем конкретнее описана задача, тем легче дать точный ответ.


А>>Есть сайт у которого со страницы надо выцарапывать денежный баланс и детализацию (при этом необходимо в хедерах поддерживать параметры входа и куки)


M>Эти условия уже на порядок сложнее оригинального описания, не находите?

M>Придётся вам почитать стандарт RFC2616 (и сопутствующие доки).
M>Ещё вариант — поискать библиотеку для .НЕТ с более надёжным функционалом.

А>> Полагаю сокеты не поддерживают хедеры?


M>Сокеты поддерживают ВСЁ. Но только руками.

M>Попробуйте протрасировать запрос браузера серверу — там простые строки, а что-куда подставлять подскажет RFC.

M>Если вам это кажется чересчур сложным, уловите суть проблемы: готовые классы не рассчитаны на подобное кульхацкерское применение, поэтому лучший вариант — скачивать руками.


Все уже было сделано и сдано, остался только этот вопрос по оптимизации (усечению страницы), никак не предполагал, что простейшая операция с файлами не имеет аналогов для веба.
Re[6]: как скачать не всю web-страницу для экономии трафика?
От: Воронков Василий Россия  
Дата: 28.11.08 15:07
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Мне нужно точно знать что прога уже загрузила определенный кусок htm страницы, а не играть в угадайку

А>Почему все так сложно??
А>И на каком принципе работают File Downloaders с докачками кусков?

Не, ну вы даете. Читайте поток асинхронно и все! Все что нужно сделать — создать буфера нужного размере, в который вы будете читать и указать его размер при чтении из стрима. Больше того, что вам нужно он в принципе вычитать не сможет. Для того, чтобы прочитать, скажем, первые 20 байт страницы ranges не нужны вообще. ranges нужны чтобы читать не с нулевого, а с произвольного байта.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re: как скачать не всю web-страницу для экономии трафика?
От: Воронков Василий Россия  
Дата: 28.11.08 15:52
Оценка:
Здравствуйте, <Аноним>, Вы писали:

Вот примерчик:

using System;
using System.IO;
using System.Net;
using System.Text;

class Program
{
    private const int SIZE = 20 * 1024;

    static void Main()
    {
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://rbc.ru");        
        using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
        using (Stream stream = resp.GetResponseStream())
        using (Stream fs = File.Create("C:\\Test.htm"))
        {        
            int read = 0;
        
            while (read < SIZE)
            {
                byte[] buffer = new byte[SIZE];            
                int count = stream.Read(buffer, 0, buffer.Length);                
                Console.WriteLine("Read:" + count);        
                fs.Write(buffer, 0, count);
                read += count;
            }
        }
    }
}



Accept-Range ему параллельно.
Хинт — хотя мы можем попросить у сервера вернуть нам 20 * 1024 байт, он в действительности, собака, может вернуть меньше. Потому и цикл.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[2]: как скачать не всю web-страницу для экономии трафика?
От: Воронков Василий Россия  
Дата: 28.11.08 15:59
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

Поправочка:

using System;
using System.IO;
using System.Net;
using System.Text;

class Program
{
    private const int SIZE = 20 * 1024;

    static void Main()
    {
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://rbc.ru");        
        using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
        using (Stream stream = resp.GetResponseStream())
        using (Stream fs = File.Create("C:\\Test.htm"))
        {        
            int read = 0;
        
            while (read < SIZE)
            {
                byte[] buffer = new byte[SIZE - read];            
                int count = stream.Read(buffer, 0, buffer.Length);                
                Console.WriteLine("Read:" + count);        
                fs.Write(buffer, 0, count);
                read += count;
            }
        }
    }
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[2]: как скачать не всю web-страницу для экономии трафика?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 28.11.08 16:14
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Хинт — хотя мы можем попросить у сервера вернуть нам 20 * 1024 байт, он в действительности, собака, может вернуть меньше. Потому и цикл.


Цикла можно избежать, если читать через BinaryReader. Он не вернет меньше, чем заказано.
Re[3]: как скачать не всю web-страницу для экономии трафика?
От: Воронков Василий Россия  
Дата: 28.11.08 16:25
Оценка:
Здравствуйте, samius, Вы писали:

S>Цикла можно избежать, если читать через BinaryReader. Он не вернет меньше, чем заказано.


Через ReadBytes? Ну да, я посмотрел — он, собственно, сам этот цикл и воспроизводит. Будем знать
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[8]: как скачать не всю web-страницу для экономии трафика?
От: Sinclair Россия https://github.com/evilguest/
Дата: 29.11.08 18:08
Оценка: +1
S>>Они работают на хидере Range. Попробуй скормить в даунлоадер страничку www.rbc.com
А>Fiddler показал что скачано те-же 30К.
Я же тебе говорю — возьми любой "даунлоадер с докачкой", и убедись, что он тоже не может скачать top.rbc.ru по частям. Не все сайты поддерживают частичную докачку.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[7]: как скачать не всю web-страницу для экономии трафика?
От: Аноним  
Дата: 01.12.08 11:25
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Здравствуйте, <Аноним>, Вы писали:


А>>Мне нужно точно знать что прога уже загрузила определенный кусок htm страницы, а не играть в угадайку

А>>Почему все так сложно??
А>>И на каком принципе работают File Downloaders с докачками кусков?

ВВ>Не, ну вы даете. Читайте поток асинхронно и все! Все что нужно сделать — создать буфера нужного размере, в который вы будете читать и указать его размер при чтении из стрима. Больше того, что вам нужно он в принципе вычитать не сможет. Для того, чтобы прочитать, скажем, первые 20 байт страницы ranges не нужны вообще. ranges нужны чтобы читать не с нулевого, а с произвольного байта.


Насчет асинхронности — можете дать пример? Как я вижу в хелпе — буфера указывают лишь минимальный размер (т.е. если страница больше — буфер автоматически увеличится).
Есть несколько типов Ranges, они могут читать кусок сначала, кусок из середины, кусок от конца.
Re[8]: как скачать не всю web-страницу для экономии трафика?
От: Воронков Василий Россия  
Дата: 01.12.08 13:30
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Насчет асинхронности — можете дать пример? Как я вижу в хелпе — буфера указывают лишь минимальный размер (т.е. если страница больше — буфер автоматически увеличится).

А>Есть несколько типов Ranges, они могут читать кусок сначала, кусок из середины, кусок от конца.

С асинхронностью я на самом деле загнул — это совсем необязательно. Пример того, как вычитать только нужный кусок страницы я уже приводил.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[9]: как скачать не всю web-страницу для экономии трафика?
От: Аноним  
Дата: 01.12.08 14:33
Оценка: +2
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Здравствуйте, <Аноним>, Вы писали:


А>>Насчет асинхронности — можете дать пример? Как я вижу в хелпе — буфера указывают лишь минимальный размер (т.е. если страница больше — буфер автоматически увеличится).

А>>Есть несколько типов Ranges, они могут читать кусок сначала, кусок из середины, кусок от конца.

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



Ха, ха, и еще раз, ха.

Если посмотреть ваш пример через Fiddler2, в момент
HttpWebResponse resp = (HttpWebResponse)req.GetResponse()
загружается ВСЯ страница. Разумеется в стримовой примочке читается байтовый буфер, но стрим внутри к этому моменту УЖЕ содержит ВСЮ страницу.
Re[10]: как скачать не всю web-страницу для экономии трафика
От: Аlexey  
Дата: 01.12.08 15:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ха, ха, и еще раз, ха.


А>Если посмотреть ваш пример через Fiddler2, в момент

А>HttpWebResponse resp = (HttpWebResponse)req.GetResponse()
А>загружается ВСЯ страница. Разумеется в стримовой примочке читается байтовый буфер, но стрим внутри к этому моменту УЖЕ содержит ВСЮ страницу.

В Silverlight'овской версии класса HttpWebRequest есть свойство AllowReadStreamBuffering. При установке этого свойства в false можно читать поток ответа не дожидаясь его полной загрузки.
К сожалению в HttpWebRequest из обычного .Net такого проперти нет...
Re[10]: как скачать не всю web-страницу для экономии трафика
От: Воронков Василий Россия  
Дата: 01.12.08 16:08
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Ха, ха, и еще раз, ха.


А>Если посмотреть ваш пример через Fiddler2, в момент

А>HttpWebResponse resp = (HttpWebResponse)req.GetResponse()
А>загружается ВСЯ страница. Разумеется в стримовой примочке читается байтовый буфер, но стрим внутри к этому моменту УЖЕ содержит ВСЮ страницу.

Вы уверены, что там прям вся страница? Когда гиговый файл таким образом качаешь, он тоже весь выкачивается на момент req.GetResponse()? А то может у меня выход в интернет со скоростью 1ГБ в секунду. А если вообще в память не влезет?

На самом деле он читает столько, сколько влезет в буфер. Размер буфера устанавливается через ServicePoint.ReceiveBufferSize — и я точно не помню, но сдается мне, что он куда меньше 20КВ по умолчанию.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[11]: как скачать не всю web-страницу для экономии трафика
От: Аноним  
Дата: 02.12.08 10:28
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Здравствуйте, <Аноним>, Вы писали:


А>>Ха, ха, и еще раз, ха.


А>>Если посмотреть ваш пример через Fiddler2, в момент

А>>HttpWebResponse resp = (HttpWebResponse)req.GetResponse()
А>>загружается ВСЯ страница. Разумеется в стримовой примочке читается байтовый буфер, но стрим внутри к этому моменту УЖЕ содержит ВСЮ страницу.

ВВ>Вы уверены, что там прям вся страница? Когда гиговый файл таким образом качаешь, он тоже весь выкачивается на момент req.GetResponse()? А то может у меня выход в интернет со скоростью 1ГБ в секунду. А если вообще в память не влезет?


ВВ>На самом деле он читает столько, сколько влезет в буфер. Размер буфера устанавливается через ServicePoint.ReceiveBufferSize — и я точно не помню, но сдается мне, что он куда меньше 20КВ по умолчанию.


Уж не знаю, но страница в 110 КБ пролезает при этом. А битва идет за каждый GPRS килобайт
Re[12]: как скачать не всю web-страницу для экономии трафика
От: Ziaw Россия  
Дата: 02.12.08 10:36
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Уж не знаю, но страница в 110 КБ пролезает при этом. А битва идет за каждый GPRS килобайт


Поставьте свой сервер который по запросу будет отдавать 20 байт.
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.