void __fastcall TForm1::Process()
{
TStringList * Links = new TStringList();
.......
for (int i = 0; i < Links->Count;i++)
CppWebBrowser->Navigate(Links->Strings,NULL,NULL,NULL,NULL);
}
TCppWebBrowser
Код:
Требуется прежде чем переходить по следующей ссылке, дождаться выполнения обработчика OnDocumentComplete. Т.е. алгоритм такой: Идем по первой ссылке, дожидаемся пока страница загрузится и выполнится обработчик, идем по второй ссылке, дожидаемся пока страница загрузится и выполнится обработчик и т.д. пока список ссылок не закончится. У кого-нибудь есть идеи как это сделать?
- может
это проще на сокетах делать ..
Страница не всегда может загрузиться в браузер без помощи человека
- например задаст вопрос о необходимости исп. ActiveX и будет стоять и ждать
твоего ответа..
а на сокетах - все совсем просто:
Код:
//-----------------------------------------
//создаем и подключаем сокет
TClientSocket * HTTP=new TClientSocket(this);
HTTP->Port=StrToIntDef(EditPort->Text,80);
HTTP->Host=EditHost->Text;
HTTP->ClientType=ctNonBlocking;
HTTP->onConnect=HTTPConnectionConnect;
HTTP->onError=HTTPConnectionError;
HTTP->onDisconnect=HTTPConnectionDisconnect ;
HTTP->onRead=HTTPConnectionRead;
HTTP->onWrite=HTTPConnectionWrite;
HTTP->Open();
//если нужно ждать результатов ,то либо HTTP->ClientType=ctBlocking ,либо запускай вертушку while пока не произойдет событие
HTTPConnectionConnect
//-----------------------------------------
//если успешно подключились
void __fastcall THTTPForm::HTTPConnectionConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
/*
здесь заполняем стороку запроса
и отправляем запрос
в первой строке имя хоста и порт не указываются!!!
"GET /index.htm HTTP/1.0"
Имя хоста и порт пишем в специальном поле
"Host: wwweeerrrttyyy.com:8080"
*/
String ConnectStr=
"GET /index.htm HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: ru
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.1.4322)
Host: wwweeerrrttyyy.com:8080"
Socket->SendBuf(ConnectStr.c_str(),ConnectStr.Length());
}
//-----------------------------------------
//когда получили ответ от сервера
void __fastcall THTTPForm::HTTPConnectionRead(TObject *Sender,
TCustomWinSocket *Socket)
{
int ResLen= Socket->ReceiveLength();
char * rb=NULL;
rb=new char [ResLen];
Socket->ReceiveBuf(rb,ResLen);
//теперь в буфере rb твоя страница или картинка- что хочешь ...
//создаем и подключаем сокет
TClientSocket * HTTP=new TClientSocket(this);
HTTP->Port=StrToIntDef(EditPort->Text,80);
HTTP->Host=EditHost->Text;
HTTP->ClientType=ctNonBlocking;
HTTP->onConnect=HTTPConnectionConnect;
HTTP->onError=HTTPConnectionError;
HTTP->onDisconnect=HTTPConnectionDisconnect ;
HTTP->onRead=HTTPConnectionRead;
HTTP->onWrite=HTTPConnectionWrite;
HTTP->Open();
//если нужно ждать результатов ,то либо HTTP->ClientType=ctBlocking ,либо запускай вертушку while пока не произойдет событие
HTTPConnectionConnect
//-----------------------------------------
//если успешно подключились
void __fastcall THTTPForm::HTTPConnectionConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
/*
здесь заполняем стороку запроса
и отправляем запрос
в первой строке имя хоста и порт не указываются!!!
"GET /index.htm HTTP/1.0"
Имя хоста и порт пишем в специальном поле
"Host: wwweeerrrttyyy.com:8080"
*/
String ConnectStr=
"GET /index.htm HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: ru
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.1.4322)
Host: wwweeerrrttyyy.com:8080"
Socket->SendBuf(ConnectStr.c_str(),ConnectStr.Length());
}
//-----------------------------------------
//когда получили ответ от сервера
void __fastcall THTTPForm::HTTPConnectionRead(TObject *Sender,
TCustomWinSocket *Socket)
{
int ResLen= Socket->ReceiveLength();
char * rb=NULL;
rb=new char [ResLen];
Socket->ReceiveBuf(rb,ResLen);
//теперь в буфере rb твоя страница или картинка- что хочешь ...
Насчет запросов наверное можно как-нить отключить чтоб он не спрашивал "Загружать Active-x".
(если я ничего не путаю)
Код:
bool complete=false; /* глобальная переменная
тебе только нужно установить complete=true;
в событии OnDocumentComplete*/
int time_out=50;
int start_time;
void __fastcall TForm1:rocess()
{
TStringList * Links = new TStringList();
.......
for (int i = 0; i < Links->Count;i++)
{
complete=false;
start_time=(int)Time();
CppWebBrowser->Navigate(Links->Strings,NULL,NULL,NULL,NULL);
do{
if(start_time+time_out<(int)Time() )
{
ErrTimeOutNavigate();
break;
}
if(comlete)
{
ParsingHTML();
break;
}
Application->ProcessMessages();
}while(1);
}//for
}
тебе только нужно установить complete=true;
в событии OnDocumentComplete*/
int time_out=50;
int start_time;
void __fastcall TForm1:rocess()
{
TStringList * Links = new TStringList();
.......
for (int i = 0; i < Links->Count;i++)
{
complete=false;
start_time=(int)Time();
CppWebBrowser->Navigate(Links->Strings,NULL,NULL,NULL,NULL);
do{
if(start_time+time_out<(int)Time() )
{
ErrTimeOutNavigate();
break;
}
if(comlete)
{
ParsingHTML();
break;
}
Application->ProcessMessages();
}while(1);
}//for
}
Но лучше вариант с сокетами, а в браузер загружать данные из буфера "rb" - после этого парсить...
Чем лучше "Своя" загрузка страницы с сервера ?
1 - Например ты можешь напороться на страницу, доступ к которой через
пароль - тут браузер выдаст окно ввода пароля (а на сокетах - ты можешь подставить в запрос пароль сам - если,конечно, знаешь его).
2 - Есть еше много случаев, когда браузер будет спрашивать ("ошибка сценария", переход на защищенный сайт "ssl",обращение к пользователю самой страницы через JavaScript и т.д.)
3 - можно быстренько проверить содержание буфера самостоятельно, прежде, чем загружать его в браузер - во многих случаях загрузка будет не нужна (например: сообщение об ошибке поиска страницы 404, отсутствие html тегов вообще и т.д.... )
4 - заляни сюда:
http://www.firststeps.ru/protocol/http/http1.html
do
{
Application->ProcessMessages();
}
while(CppWebBrowser->ReadyState!=4);
Все, всем спасибо за помощь и отклики!