C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Извлечение из Интернет-страницы..., ...всех ссылок на другие сайты.
R@kot
  Отправлено: 16.12.2004, 03:50


Не зарегистрирован







Требуется сделать вот что: в проге нужно загрузить сайт и, просканировав главную страницу, составить список всех имеющихся ссылок на другие сайты.
Кто-нибудь подскажите как это можно сделать и какие компоненты использовать!

Пока я смог придумать только один-единственный (и на мой взгляд совсем уж извращённый smile.gif ) ) способ: сохранить загруженную страницу на диск и из полученного html-файла выкорчевать все ссылки с помощью обычного файлового вывода (как из txt-файла). Но даже при таком подходе для меня существует ПРОБЛЕМА: как сохранить загруженную Интернет-страницу???

Помогите кто сможет, плиииииизззз!!! sad.gif
AVC
Отправлено: 16.12.2004, 09:10


Ветеран

Группа: Модератор
Сообщений: 1583



Я бы наверное пошел по такому пути — загрузил страницу в CppWebBrowser и просмотрел бы коллекцию link'ов. Дальше по обстановке.
(Давно интересовал вопрос: а может ли робот найти ссылки, определенные в скрипте, а динамически генерируемые?)
ART-CODE
Отправлено: 16.12.2004, 11:52


Не зарегистрирован







smile.gif
Вопрос в догонку — а может-ли ЮЗЕР найти ссылки, определенные в скрипте, если у его браузера выключено выполнение скриптов (шутка)

Ответ по существу:
робот увидит 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, а как коллекцию линков просмотреть-то? wink.gif
R@kot
Отправлено: 17.12.2004, 02:57


Дежурный стрелочник

Группа: Участник
Сообщений: 32



ART-CODE, Э-э-э... Дяденька, а вы сейчас с кем разговаривали? wink.gif Какой робот? Какие клики мышкой? Мне же нужно, чтобы всё автоматически происходило без моего участия (в последствие я намереваюсь вообще не показывать пользователю загруженную страницу, а просто предоставить ему список ссылок с указанного им сайта)!
R@kot
Отправлено: 17.12.2004, 03:02


Дежурный стрелочник

Группа: Участник
Сообщений: 32



Aptem, в этом-то, в принципе, и заключался мой вопрос — как написать функцию, выдёргивающую код из загруженной страницы sad.gif
AVC
Отправлено: 17.12.2004, 09:36


Ветеран

Группа: Модератор
Сообщений: 1583



Подобное было тут Парсинг HTML в древовидную структуру
Aptem
Отправлено: 19.12.2004, 19:08


Мастер участка

Группа: Участник
Сообщений: 349



QUOTE (R@kot @ 17/12/2004, 04:04)
Aptem, в этом-то, в принципе, и заключался мой вопрос — как написать функцию, выдёргивающую код из загруженной страницы  sad.gif

Вот вам функция, выдергивающая 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 ** )? ) );
wink.gif

И по-моему, особенно непонятный (даже мне) символ после ( void ** ) — кстати, у меня он почему-то отображается в виде вопросительного знака. Может, где-то ошибка? wink.gif Подскажи, если не сложно.
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..."
wink.gif
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 );
}



Я совсем забыл сказать, что нужно подключить библиотеку:
CODE

#include <mshtml.h>


Отредактировано 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 ** )&#968; ) );



ψ — все интереснее biggrin.gif
Aptem
Отправлено: 21.12.2004, 18:19


Мастер участка

Группа: Участник
Сообщений: 349



Вообщем, я не знаю, что у вас там с правильным отображением и где вы нашли ψ.

Я прикрепил файлик!


User Attached Image Скачать файл
source.txt


R@kot
Отправлено: 22.12.2004, 01:55


Дежурный стрелочник

Группа: Участник
Сообщений: 32



Aptem, как ни странно, но в твоём ответе всё равно отображается тот самый непонятный символ. Однако в прикреплённом тобой файле всё тип-топ. biggrin.gif Проверил, всё работает! Классно! Огромное СПАСИБО!!! biggrin.gif

Кстати, ко мне можешь обращаться "на ты", поскольку я пока не в том возрасте и не с тем опытом, чтобы именоваться "на вы", поэтому как-то неуютно себя чувствую smile.gif Рад был с вами пообщаться, уважаемый! wink.gif и ещё раз спасибо за помощь!
Aptem
Отправлено: 22.12.2004, 04:08


Мастер участка

Группа: Участник
Сообщений: 349



QUOTE (R@kot @ 22/12/2004, 02:57)
Aptem, как ни странно, но в твоём ответе всё равно отображается тот самый непонятный символ. Однако в прикреплённом тобой файле всё тип-топ. biggrin.gif Проверил, всё работает! Классно! Огромное СПАСИБО!!! biggrin.gif

Кстати, ко мне можешь обращаться "на ты", поскольку я пока не в том возрасте и не с тем опытом, чтобы именоваться "на вы", поэтому как-то неуютно себя чувствую smile.gif Рад был с вами пообщаться, уважаемый! wink.gif и ещё раз спасибо за помощь!

Рад был помочь!
Gedeon
Отправлено: 22.12.2004, 11:39


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (Aptem @ 21/12/2004, 19:21)
Вообщем, я не знаю, что у вас там с правильным отображением и где вы нашли ψ.

теперь понятно ψ — это символ греческого алфавита так и называется пси, а у вас в коде psi (если это тоже поменяется, то пси по английски), вот его что-то и отображает как греческую букву.

Еще пробуем
&pi (пи)

Отредактировано Gedeon — 22/12/2004, 12:44

Вернуться в Вопросы программирования в C++Builder