Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.85/34: Рейтинг темы: голосов - 34, средняя оценка - 4.85
sloosar
2 / 2 / 1
Регистрация: 20.07.2009
Сообщений: 55
1

Сохранение HTML кода страницы.

25.07.2009, 12:27. Просмотров 6412. Ответов 25
Метки нет (Все метки)

Как можно без TWebBrowser сохранить HTML код WEB страницы?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2009, 12:27
Ответы с готовыми решениями:

Как сохранить часть HTML кода с веб страницы?
Веб-страница с результатами поиска, к примеру 50 ссылок. Мне нужно сохранить все ссылки. Открываю...

Сохранение RichEdit в HTML
Доброго времени суток, народ! Есть один вопросик у меня. Я делаю конструктор электронных учебных...

SynEdit. Сохранение rtf в html
Доброй ночи, народ. Кто-нибудь работал с компонентом SynEdit в С++ Builder 6? Я искал решение,...

Сохранение страницы со всеми картинками - перевод с делфи
Добрый день! Прошу помощи. Есть код на Delphi: unit Unit1; interface uses Windows,...

StringGrid (Оптимизация кода) - Загрузка и Сохранение
Добрый день! Для сохранения StringGrid в файл использую TStringList *Table = new...

25
Otaka
1837 / 694 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
25.07.2009, 14:03 2
Загляни сюда:
Связь с интернетом
В этой теме рассматривалось то, как скачать страницу с нета и извлечь оттуда информацию. Должно помочь.
0
sloosar
2 / 2 / 1
Регистрация: 20.07.2009
Сообщений: 55
25.07.2009, 14:34  [ТС] 3
Что то там мутный исходник.
Можно и с TWebBrowser, Только мне нужно реализовать много поточность запросов.
0
Otaka
1837 / 694 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
25.07.2009, 15:30 4
Даже и не знаю как с WebBrowser. А ничего мутного в том исходнике нет. Идет последоватеьность InternetOpen,InternetOpenUrl, InternetReadFile(эти функции инкапсулированы в класс TInetFile). Достаточно все просто.
0
25.07.2009, 15:30
sloosar
2 / 2 / 1
Регистрация: 20.07.2009
Сообщений: 55
25.07.2009, 19:08  [ТС] 5
Цитата Сообщение от Otaka Посмотреть сообщение
Даже и не знаю как с WebBrowser. А ничего мутного в том исходнике нет. Идет последоватеьность InternetOpen,InternetOpenUrl, InternetReadFile(эти функции инкапсулированы в класс TInetFile). Достаточно все просто.
Можите пожалуйста привести пример, простого сохранения HTML кода в TStringList или аналогичному ему типу.
0
Otaka
1837 / 694 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
25.07.2009, 19:27 6
Вот тебе пример небольшой программы качалки. Очень просто. Тока я там сохраняю в файл.
0
Вложения
Тип файла: rar Downloader.rar (13.1 Кб, 232 просмотров)
sloosar
2 / 2 / 1
Регистрация: 20.07.2009
Сообщений: 55
25.07.2009, 21:36  [ТС] 7
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
void TForm1::GetHtmlCode(AnsiString Url)
 {
TInetFile*f=new TInetFile();
f->OpenFile(Url.c_str());
int b=8;
char buff[2048];
TFileStream*ef=new TFileStream(Url,fmCreate);
try
{
while(b>0)
        {
        b=f->Read(buff,2048);
        ef->Write(buff,b);
        Application->ProcessMessages();
        }
}catch(...)
        {
        ShowMessage("Ошибка");
        delete f;
        delete ef;
 
        }
delete f;
delete ef;
 Label1->Caption = buff[1];
 //
 }
Вот написал такую процедуру, не компилируется, что я делаю не так???
0
Otaka
1837 / 694 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
25.07.2009, 22:03 8
Ну, когда спрашиваешь об ошибке, копируй сюда то, что сообщает тебе компилятор.
Скорей всего, тебе надо сделать Project/Add to project/(найди в каталоге с билдером папку lib, а там wininet.lib её и добавь).
А еще у тебя открывается файл где-то в сети с таким вот Url, а потом ты пытаешься создать файл на своем компе с путем Url. Как так?
Нужно:
C++
1
2
3
4
5
6
void TForm1::GetHtmlCode(AnsiString Url,AnsiString path)
{
...
TFileStream*ef=new TFileStream(path,fmCreate);
...
}
1
sloosar
2 / 2 / 1
Регистрация: 20.07.2009
Сообщений: 55
26.07.2009, 15:28  [ТС] 9
Спасибо всё работает.
Ещё один вопрос может правда не в тему.
Как использовать прокси в єтом алгоритме?
0
Otaka
1837 / 694 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
26.07.2009, 15:52 10
В TInetFile стоит параметр INTERNET_OPEN_TYPE_PRECONFIG, поэтому, вроде как, если выставлены настройки прокси сервера в ИнетЕксплорере, то должно работать сразу же. Не знаю, не пробовал. Нужно играться с параметрами функции InternetOpen
0
sloosar
2 / 2 / 1
Регистрация: 20.07.2009
Сообщений: 55
26.07.2009, 16:11  [ТС] 11
Мне просто нужно по ходу выполнения программы менять прокси.
0
Otaka
1837 / 694 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
26.07.2009, 16:45 12
Вот каким должен быть вызов InternetOpen:
C++
1
2
3
4
HINTERNET session = InternetOpen("Our Agent", 
  INTERNET_OPEN_TYPE_PROXY, 
  "192.168.0.1:3128", /* наш прокси 192.168.0.1 порт 3128 */
  "", 0);
Только что делать, если прокси требует авторизации я не знаю.
0
sloosar
2 / 2 / 1
Регистрация: 20.07.2009
Сообщений: 55
26.07.2009, 19:28  [ТС] 13
Как то так???
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
void TForm1::GetHtmlCode(AnsiString Url)
 {
 
 HINTERNET session = InternetOpen("Our Agent",
INTERNET_OPEN_TYPE_PROXY,"38.101.238.64:80","", 0);
 TInetFile*f=new TInetFile();
f->OpenFile(Url.c_str());
 
int b=8;
char buff[1000000];
try
{
while(b>0)
        {
        b=f->Read(buff,1000000);
        Application->ProcessMessages();
        }
}catch(...)
        {
        ShowMessage("Ошибка");
        delete f;
    }
delete f;
 
 Memo1->Lines->Text = buff;
 
 //
 }
0
Otaka
1837 / 694 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
26.07.2009, 21:19 14
Нет, ты посмотри реализацию TInetFile, функция OpenFile.
0
sloosar
2 / 2 / 1
Регистрация: 20.07.2009
Сообщений: 55
27.07.2009, 03:47  [ТС] 15
Не допру я никак.

Добавлено через 6 часов 21 минуту 6 секунд
Дошло .
C++
1
2
3
4
5
6
HINTERNET file;
file = InternetOpen("Our Agent", PRE_CONFIG_INTERNET_ACCESS, 0, 0, 0);
file = InternetOpenUrl(file, Url.c_str(), 0, 0, 0, 0);
char buf[64000];
unsigned long len;
 InternetReadFile(file, buf, sizeof(buf), &len);
0
sloosar
2 / 2 / 1
Регистрация: 20.07.2009
Сообщений: 55
01.08.2009, 16:25  [ТС] 16
А как можно узнать когда страница уже загружена?
0
Otaka
1837 / 694 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
01.08.2009, 16:48 17
Ну, вроде как длина контента определяется вот так:
C++
1
2
3
4
5
6
///class TInetFile
...
if(HttpQueryInfo(hUrl, HTTP_QUERY_CONTENT_LENGTH, buffer, &buflen, &index))
        {
        FSize=StrToInt(buffer);
        }
Но сервер не всегда дает размеры фалйов, а размеры страничек возвращаются вообще редко. Я всегда делел так- читаешь, читаешь, читаешь, и когда уже ничего не приходит(InternetReadFile возвращает 0), тогда, наверное, это конец файла. Но такой способ работает только когда есть нормальный нет, а если страница грузится оочень меделенно, то 0 может возвратится и по истечению определенного тайм-аута.
Не знаю.
0
sloosar
2 / 2 / 1
Регистрация: 20.07.2009
Сообщений: 55
02.08.2009, 14:15  [ТС] 18
C++
1
2
3
4
5
6
7
8
9
10
char buf[6400000];
//----------------------------------------------------------------------
HINTERNET file;
file = InternetOpen("Our Agent", PRE_CONFIG_INTERNET_ACCESS, 0, 0, 0);
file = InternetOpenUrl(file, Url.c_str(), 0, 0, 0, 0);
unsigned long len;
 InternetReadFile(file, buf, sizeof(buf), &len);
 TStringList *GPage = new TStringList;
 GPage->Text = buf;
 GPage->SaveToFile("c://page.html");
Почему в buf сохраняется не весь код?
0
Otaka
1837 / 694 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
02.08.2009, 15:46 19
Ты так резво в стеке выделяешь 6 мегабайтов. У меня вылетает ошибка стека. Так делать нехорошо.
Ты копируй по небольшим порциям, по 5-10 кб, и загоняй результат в какой нибудь TMemoryStream(это чтобы не вылезти за пределы массива). Если ты пару раз будешь вызывать InternetReadFile, а в результате в буффер будет записано 0 байтов, то скорее всего это конец.
0
sloosar
2 / 2 / 1
Регистрация: 20.07.2009
Сообщений: 55
02.08.2009, 17:36  [ТС] 20
А как это при вызове
C++
1
InternetReadFile
дописывать в
C++
1
TMemoryStream
новый контент?

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
02.08.2009, 17:36
StackOverflow
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2009, 17:36

Скачивание html страницы.
Мне надо сначала пройти авторизацию на сервере потом скачать html код. Как скачать я знаю через...

Парсинг HTML страницы
Всем доброго дня. Кто делал парсинг HTML стриницы с помощью CppWebBrowser и OleObject. Как считать...

Парсинг html страницы
Доброго времени суток! Мне нужно сделать парсинг html страницы из WWW. Подскажите пожалуйста,...


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

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

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