Я так и знал, что этим закончится
Нет, реальная задача совсем не о 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-страницу для экономии трафика?
Неплохо, но к сожалению 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-страницу для экономии трафика?
Здравствуйте, Аноним, Вы писали:
А>Что вы прицепились? 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-страницу для экономии трафика?
Здравствуйте, <Аноним>, Вы писали:
А>Мне нужно точно знать что прога уже загрузила определенный кусок htm страницы, а не играть в угадайку А>Почему все так сложно?? А>И на каком принципе работают File Downloaders с докачками кусков?
Не, ну вы даете. Читайте поток асинхронно и все! Все что нужно сделать — создать буфера нужного размере, в который вы будете читать и указать его размер при чтении из стрима. Больше того, что вам нужно он в принципе вычитать не сможет. Для того, чтобы прочитать, скажем, первые 20 байт страницы ranges не нужны вообще. ranges нужны чтобы читать не с нулевого, а с произвольного байта.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re: как скачать не всю web-страницу для экономии трафика?
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-страницу для экономии трафика?
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Хинт — хотя мы можем попросить у сервера вернуть нам 20 * 1024 байт, он в действительности, собака, может вернуть меньше. Потому и цикл.
Цикла можно избежать, если читать через BinaryReader. Он не вернет меньше, чем заказано.
Re[3]: как скачать не всю web-страницу для экономии трафика?
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-страницу для экономии трафика?
Здравствуйте, <Аноним>, Вы писали:
А>Насчет асинхронности — можете дать пример? Как я вижу в хелпе — буфера указывают лишь минимальный размер (т.е. если страница больше — буфер автоматически увеличится). А>Есть несколько типов Ranges, они могут читать кусок сначала, кусок из середины, кусок от конца.
С асинхронностью я на самом деле загнул — это совсем необязательно. Пример того, как вычитать только нужный кусок страницы я уже приводил.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[9]: как скачать не всю web-страницу для экономии трафика?
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Здравствуйте, <Аноним>, Вы писали:
А>>Насчет асинхронности — можете дать пример? Как я вижу в хелпе — буфера указывают лишь минимальный размер (т.е. если страница больше — буфер автоматически увеличится). А>>Есть несколько типов Ranges, они могут читать кусок сначала, кусок из середины, кусок от конца.
ВВ>С асинхронностью я на самом деле загнул — это совсем необязательно. Пример того, как вычитать только нужный кусок страницы я уже приводил.
Ха, ха, и еще раз, ха.
Если посмотреть ваш пример через Fiddler2, в момент
HttpWebResponse resp = (HttpWebResponse)req.GetResponse()
загружается ВСЯ страница. Разумеется в стримовой примочке читается байтовый буфер, но стрим внутри к этому моменту УЖЕ содержит ВСЮ страницу.
Re[10]: как скачать не всю web-страницу для экономии трафика
Здравствуйте, Аноним, Вы писали:
А>Ха, ха, и еще раз, ха.
А>Если посмотреть ваш пример через Fiddler2, в момент А>HttpWebResponse resp = (HttpWebResponse)req.GetResponse() А>загружается ВСЯ страница. Разумеется в стримовой примочке читается байтовый буфер, но стрим внутри к этому моменту УЖЕ содержит ВСЮ страницу.
В Silverlight'овской версии класса HttpWebRequest есть свойство AllowReadStreamBuffering. При установке этого свойства в false можно читать поток ответа не дожидаясь его полной загрузки.
К сожалению в HttpWebRequest из обычного .Net такого проперти нет...
Re[10]: как скачать не всю web-страницу для экономии трафика
Здравствуйте, <Аноним>, Вы писали:
А>Ха, ха, и еще раз, ха.
А>Если посмотреть ваш пример через 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-страницу для экономии трафика