R@kot |
Отправлено: 16.12.2004, 03:50 |
|
Не зарегистрирован
|
Требуется сделать вот что: в проге нужно загрузить сайт и, просканировав главную страницу, составить список всех имеющихся ссылок на другие сайты.
Кто-нибудь подскажите как это можно сделать и какие компоненты использовать!
Пока я смог придумать только один-единственный (и на мой взгляд совсем уж извращённый ) ) способ: сохранить загруженную страницу на диск и из полученного html-файла выкорчевать все ссылки с помощью обычного файлового вывода (как из txt-файла). Но даже при таком подходе для меня существует ПРОБЛЕМА: как сохранить загруженную Интернет-страницу???
Помогите кто сможет, плиииииизззз!!! |
|
AVC |
Отправлено: 16.12.2004, 09:10 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Я бы наверное пошел по такому пути — загрузил страницу в CppWebBrowser и просмотрел бы коллекцию link'ов. Дальше по обстановке.
(Давно интересовал вопрос: а может ли робот найти ссылки, определенные в скрипте, а динамически генерируемые?) |
|
ART-CODE |
Отправлено: 16.12.2004, 11:52 |
|
Не зарегистрирован
|
Вопрос в догонку — а может-ли ЮЗЕР найти ссылки, определенные в скрипте, если у его браузера выключено выполнение скриптов (шутка)
Ответ по существу:
робот увидит HTML страницу так, как увидите ее Вы, кликнув на странице Мышкой и выбрав пункт меню "просмотр HTML-кода"
тогда ему только останется интерпретировать скрипт и предположить о создании им ссылки (такой анализ писать самому -упаришся...) |
|
Aptem |
Отправлено: 16.12.2004, 12:25 |
|
Мастер участка
Группа: Участник
Сообщений: 349
|
Я бы просканировал html-код загруженной страницы и вытащил бы оттуда то, что начинается с www или http !
Для этого нужен TCppWebBrowser и функция, выдергивающая html-код загруженной страницы.
Отредактировано Aptem — 16/12/2004, 13:28
|
|
R@kot |
Отправлено: 17.12.2004, 02:45 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 32
|
AVC, а как коллекцию линков просмотреть-то?
|
|
R@kot |
Отправлено: 17.12.2004, 02:57 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 32
|
ART-CODE, Э-э-э... Дяденька, а вы сейчас с кем разговаривали? Какой робот? Какие клики мышкой? Мне же нужно, чтобы всё автоматически происходило без моего участия (в последствие я намереваюсь вообще не показывать пользователю загруженную страницу, а просто предоставить ему список ссылок с указанного им сайта)!
|
|
R@kot |
Отправлено: 17.12.2004, 03:02 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 32
|
Aptem, в этом-то, в принципе, и заключался мой вопрос — как написать функцию, выдёргивающую код из загруженной страницы
|
|
AVC |
Отправлено: 17.12.2004, 09:36 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Подобное было тут Парсинг HTML в древовидную структуру |
|
Aptem |
Отправлено: 19.12.2004, 19:08 |
|
Мастер участка
Группа: Участник
Сообщений: 349
|
QUOTE (R@kot @ 17/12/2004, 04:04) | Aptem, в этом-то, в принципе, и заключался мой вопрос — как написать функцию, выдёргивающую код из загруженной страницы |
Вот вам функция, выдергивающая HTML-код из TCppWebBrowser и помещающая его в Memo!
CODE |
void __fastcall TForm1::GetHTMLCode ( TCppWebBrowser *WebBrowser, TMemo *SourceMemo )
{
SourceMemo -> Lines -> Clear ();
TMemoryStream* pMemoryStream = new TMemoryStream();
IStream *pIStream;
HGLOBAL hGlobal;
IPersistStreamInit *psi;
const int Size = 0x100000;
if ( WebBrowser -> Document == NULL ) return;
hGlobal = GlobalAlloc ( GPTR, Size );
if ( 0 == hGlobal )
{
ShowMessage ( "GlobalAlloc Error" );
return;
}
OleCheck ( CreateStreamOnHGlobal ( hGlobal, true, &pIStream ) );
try
{
OleCheck ( WebBrowser -> Document -> QueryInterface ( __uuidof( IPersistStreamInit ), ( void ** )&psi ) );
try
{
OleCheck ( psi -> Save ( pIStream, false ) );
pMemoryStream -> SetSize ( Size );
CopyMemory ( pMemoryStream -> Memory, hGlobal, Size );
}
__finally
{
delete psi;
}
}
__finally
{
delete pIStream;
}
SourceMemo -> Lines -> LoadFromStream ( pMemoryStream );
}
|
Я помещаю его в событие TCppWebBrowser'а CppWebBrowser1DocumentComplete и как только страница полностью загружается, то в Memo появляется исходник страницы.
|
|
R@kot |
Отправлено: 20.12.2004, 02:45 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 32
|
Артём, спасибо, что не остался равнодушным, мне очень даже нравится предложенная тобой функция, но вот компилятора немного напрягает строчка:
CODE | OleCheck ( WebBrowser -> Document -> QueryInterface ( __uuidof( IPersistStreamInit ), ( void ** )? ) ); |
И по-моему, особенно непонятный (даже мне) символ после ( void ** ) — кстати, у меня он почему-то отображается в виде вопросительного знака. Может, где-то ошибка? Подскажи, если не сложно.
|
|
Boyko |
Отправлено: 20.12.2004, 11:26 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 88
|
2r@kot
Неправильно сказать
"Press any key to continue or any another key to exit..."
Правильно
"Press any key to continue or another key to exit..."
"Press any key to continue or any other key to exit..."
|
|
Aptem |
Отправлено: 21.12.2004, 07:17 |
|
Мастер участка
Группа: Участник
Сообщений: 349
|
QUOTE (R@kot @ 20/12/2004, 03:47) |
CODE | OleCheck ( WebBrowser -> Document -> QueryInterface ( __uuidof( IPersistStreamInit ), ( void ** )? ) ); |
|
Щас все расскажу...
там должная быть ссылка:
CODE |
OleCheck ( WebBrowser -> Document -> QueryInterface ( __uuidof( IPersistStreamInit ), ( void ** )&psi ) );
|
А вот как выглядит вся функция (наверное когда копировал произошла ошибка):
CODE |
void __fastcall TForm1::GetHTMLCode ( TCppWebBrowser *WebBrowser, TMemo *SourceMemo )
{
SourceMemo -> Lines -> Clear ();
TMemoryStream* pMemoryStream = new TMemoryStream();
IStream *pIStream;
HGLOBAL hGlobal;
IPersistStreamInit *psi;
const int Size = 0x100000;
if ( WebBrowser -> Document == NULL ) return;
hGlobal = GlobalAlloc ( GPTR, Size );
if ( 0 == hGlobal )
{
ShowMessage ( "GlobalAlloc Error" );
return;
}
OleCheck ( CreateStreamOnHGlobal ( hGlobal, true, &pIStream ) );
try
{
OleCheck ( WebBrowser -> Document -> QueryInterface ( __uuidof( IPersistStreamInit ), ( void ** )&psi ) );
try
{
OleCheck ( psi -> Save ( pIStream, false ) );
pMemoryStream -> SetSize ( Size );
CopyMemory ( pMemoryStream -> Memory, hGlobal, Size );
}
__finally
{
delete psi;
}
}
__finally
{
delete pIStream;
}
SourceMemo -> Lines -> LoadFromStream ( pMemoryStream );
}
|
Я совсем забыл сказать, что нужно подключить библиотеку:
Отредактировано Aptem — 21/12/2004, 08:20
|
|
Gedeon |
Отправлено: 21.12.2004, 09:01 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
QUOTE (Aptem @ 21/12/2004, 08:19) | там должная быть ссылка:
CODE |
OleCheck ( WebBrowser -> Document -> QueryInterface ( __uuidof( IPersistStreamInit ), ( void ** )ψ ) );
|
|
ψ — все интереснее
|
|
Aptem |
Отправлено: 21.12.2004, 18:19 |
|
Мастер участка
Группа: Участник
Сообщений: 349
|
Вообщем, я не знаю, что у вас там с правильным отображением и где вы нашли ψ.
Я прикрепил файлик!
|
|
R@kot |
Отправлено: 22.12.2004, 01:55 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 32
|
Aptem, как ни странно, но в твоём ответе всё равно отображается тот самый непонятный символ. Однако в прикреплённом тобой файле всё тип-топ. Проверил, всё работает! Классно! Огромное СПАСИБО!!!
Кстати, ко мне можешь обращаться "на ты", поскольку я пока не в том возрасте и не с тем опытом, чтобы именоваться "на вы", поэтому как-то неуютно себя чувствую Рад был с вами пообщаться, уважаемый! и ещё раз спасибо за помощь!
|
|
Aptem |
Отправлено: 22.12.2004, 04:08 |
|
Мастер участка
Группа: Участник
Сообщений: 349
|
QUOTE (R@kot @ 22/12/2004, 02:57) | Aptem, как ни странно, но в твоём ответе всё равно отображается тот самый непонятный символ. Однако в прикреплённом тобой файле всё тип-топ. Проверил, всё работает! Классно! Огромное СПАСИБО!!!
Кстати, ко мне можешь обращаться "на ты", поскольку я пока не в том возрасте и не с тем опытом, чтобы именоваться "на вы", поэтому как-то неуютно себя чувствую Рад был с вами пообщаться, уважаемый! и ещё раз спасибо за помощь! |
Рад был помочь!
|
|
Gedeon |
Отправлено: 22.12.2004, 11:39 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
QUOTE (Aptem @ 21/12/2004, 19:21) | Вообщем, я не знаю, что у вас там с правильным отображением и где вы нашли ψ. |
теперь понятно ψ — это символ греческого алфавита так и называется пси, а у вас в коде psi (если это тоже поменяется, то пси по английски), вот его что-то и отображает как греческую букву.
Еще пробуем
&pi (пи)
Отредактировано Gedeon — 22/12/2004, 12:44
|
|