IE - могу взять HTML коды из фреймов, но не всегда. Как?
От: VMin Россия  
Дата: 23.09.04 19:18
Оценка:
Простенький код для получения HTML кодов:

IWebBrowser2* pWebBrowser = NULL;
LPDISPATCH lpDispatch;
IHTMLDocument2 *lpHtmlDocument = NULL;

HRESULT hr = GetDlgControl(IDC_EXPLORER1, __uuidof(IWebBrowser2*), (void**)&pWebBrowser);

if(pWebBrowser)
{
pWebBrowser->get_Document(&lpDispatch);
pWebBrowser->Release();
}
else return -2;

if(lpDispatch)
{
lpDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&lpHtmlDocument);
lpDispatch->Release();
}
else return -3;

IHTMLElement *pb=0;
BSTR p=0;
if(lpHtmlDocument)
{
IHTMLFramesCollection2* pIFrameCol;
IHTMLDocument2 * pIFrameDoc;
long pp=0;
if (SUCCEEDED(lpHtmlDocument->get_frames(&pIFrameCol)))
{
pIFrameCol->get_length(&pp);
if(pp!=0)
{
//Есть фреймы
for(long i=0;i<pp;i++)
{
VARIANT frameRequested;
VARIANT frameOut;
frameRequested.vt = VT_UINT;//VT_I4 ;
frameRequested.bstrVal = (BSTR)i;
pIFrameCol->item(&frameRequested, &frameOut);

pIFrameCol->QueryInterface(IID_IHTMLDocument2,(void**)&pIFrameDoc);

IHTMLWindow2* pIFrameWindow;
frameOut.pdispVal->QueryInterface(IID_IHTMLWindow2,
(void**)&pIFrameWindow);

pIFrameWindow->get_document(&pIFrameDoc);

if(pIFrameDoc)
{
// всё беру............ get_innerHTML()........
}
else
{
// не могу взять и как взять по другому не придумывается
}
}
}
}
}
else return -4;
//////////////// Конец КОДА /////////////////////////
Так вот! С этого сайта и большинства других все фреймы забираю без проблем
(например: http://www.rsdn.ru/?Info/Howtoask.xml)
А с другого (например: http://www.realtor.org/rodesign.nsf/pages/FS_FREALTOR?OpenDocument)
третий (последний pp==2) фрейм возвращает pIFrameDoc=0, хотя на экране всё вижу и забрать
код мышкой (по-детски) могу спокойно.

Как можно это сделать "по-взрослому"?
Подскажите другой путь, истинный путь.
Это я Вас как математик математика спрашиваю:
Что такое математика?
Один из законов Божьих или это сам Бог и есть? (ХХ век)

По-моему Математика — это Слово Божие. (22.03.05)
Re: IE - могу взять HTML коды из фреймов, но не всегда. Как?
От: VMin Россия  
Дата: 23.09.04 20:20
Оценка:
Посылаю в догонку:
Уже понял, что не могу взять никакую страницу фрейма если она находится
на другом сайте от основной.

Но от этого пока не легче.
Пытаюсь думать .....................
Это я Вас как математик математика спрашиваю:
Что такое математика?
Один из законов Божьих или это сам Бог и есть? (ХХ век)

По-моему Математика — это Слово Божие. (22.03.05)
Re: IE - могу взять HTML коды из фреймов, но не всегда. Как?
От: AndrewJD США  
Дата: 27.09.04 17:28
Оценка:
Здравствуйте, VMin, Вы писали:

VM>Простенький код для получения HTML кодов:


VM>Так вот! С этого сайта и большинства других все фреймы забираю без проблем

VM>(например: http://www.rsdn.ru/?Info/Howtoask.xml)
VM>А с другого (например: http://www.realtor.org/rodesign.nsf/pages/FS_FREALTOR?OpenDocument)
VM>третий (последний pp==2) фрейм возвращает pIFrameDoc=0, хотя на экране всё вижу и забрать
VM>код мышкой (по-детски) могу спокойно.

VM>Как можно это сделать "по-взрослому"?

VM>Подскажите другой путь, истинный путь.

В первую очередь необходимо прочитать это
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[2]: IE - могу взять HTML коды из фреймов, но не всегда. К
От: VMin Россия  
Дата: 29.09.04 15:55
Оценка:
Здравствуйте, AndrewJD, Вы писали:

AJD>В первую очередь необходимо прочитать это


Прочитал.Спасибо.
Как я понял секьюрити (cross-domain scripting security ) не позволяет
взять фрейм с чужого домена .
(поправте если ошибаюсь)
Здесь (на www.rsdn.ru) нашел рекомендацию писать свою секьюрити для IE.
Но пока не хочется, да и пока не знаю как, хотя разобраться можно во всём.

Нет проблем сделать полную симуляцию-эмуляцию мыша и клавы. (С понедельника возьмусь)
Но тогда придется на каждую новую задачу (а их будет много) делать слишком много настроек.
А ведь время-то жалко.

Может Вам всё-таки известен ответ или человек который знает ответ.

Пока.
Буду ждать, ну и думать тоже............
Это я Вас как математик математика спрашиваю:
Что такое математика?
Один из законов Божьих или это сам Бог и есть? (ХХ век)

По-моему Математика — это Слово Божие. (22.03.05)
Re[3]: IE - могу взять HTML коды из фреймов, но не всегда. К
От: AndrewJD США  
Дата: 29.09.04 16:11
Оценка:
Здравствуйте, VMin, Вы писали:

VM>Может Вам всё-таки известен ответ или человек который знает ответ.


VM>Пока.

VM>Буду ждать, ну и думать тоже............

Еще раз, что нужно конкретно сделать?
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[4]: IE - могу взять HTML коды из фреймов, но не всегда. К
От: VMin Россия  
Дата: 29.09.04 17:11
Оценка:
Здравствуйте, AndrewJD, Вы писали:

AJD>Здравствуйте, VMin, Вы писали:


AJD>Еще раз, что нужно конкретно сделать?


Есть страница http://1011.com/val/get.html с одним фреймом от другого домена http://wsprod01.realtors.org/NrdsSearch/app/servlet/NrdsSearch?action=homeMember
Последний линк сам по себе из адресной строки IE нормально не открывается.
Т.е. работает только через фрейм.
есть код:

IWebBrowser2* pWebBrowser = NULL;
LPDISPATCH lpDispatch;
IHTMLDocument2 *lpHtmlDocument = NULL;

HRESULT hr = GetDlgControl(IDC_EXPLORER1, __uuidof(IWebBrowser2*), (void**)&pWebBrowser);

if(pWebBrowser)
{
    pWebBrowser->get_Document(&lpDispatch);
    pWebBrowser->Release();
}
else return -2;

if(lpDispatch)
{
    lpDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&lpHtmlDocument);
    lpDispatch->Release();
}
else return -3;

IHTMLElement *pb=0;
BSTR p=0;
if(lpHtmlDocument)
{
    IHTMLFramesCollection2* pIFrameCol; 
    IHTMLDocument2 * pIFrameDoc;
    long pp=0;
    if (SUCCEEDED(lpHtmlDocument->get_frames(&pIFrameCol))) 
    {
        pIFrameCol->get_length(&pp);
        if(pp!=0)
        { 
            //Есть фреймы для http://1011.com/val/get.html pp==1
            for(long i=0;i<pp;i++)
            {
                VARIANT frameRequested;
                VARIANT frameOut;
                frameRequested.vt = VT_UINT;//VT_I4 ;
                frameRequested.bstrVal = (BSTR)i;
                pIFrameCol->item(&frameRequested, &frameOut);

                pIFrameCol->QueryInterface(IID_IHTMLDocument2,(void**)&pIFrameDoc);

                IHTMLWindow2* pIFrameWindow;
                frameOut.pdispVal->QueryInterface(IID_IHTMLWindow2, 
                    (void**)&pIFrameWindow);

                pIFrameWindow->get_document(&pIFrameDoc);

                if(pIFrameDoc)
                {
                    // всё беру............ get_innerHTML()........
                }
                else
                {
                    // для для http://1011.com/val/get.html  pIFrameDoc==0
                    // не могу взять и как взять по другому не придумывается
                  }
            }
        }
    }
}
else return -4;
//////////////// Конец КОДА /////////////////////////


Так вот мне хочется плучить pIFrameDoc!=0.


Ого!!!!!!!!!
Только-что сделал "Предосмотр" того что написал — оказалось этот линк —
http://wsprod01.realtors.org/NrdsSearch/app/servlet/NrdsSearch?action=homeMember
Спокойно открывается в новом окне. По-моему это решение!!!!!!!
Буду проверять.

Большое спасибо!
Вы натолкнули меня на путь............. (надеюсь)



Пока.

PS
Но всё-таки интересно найти путь получения pIFrameDoc!=0 для другого домена
из фрейма.
Это я Вас как математик математика спрашиваю:
Что такое математика?
Один из законов Божьих или это сам Бог и есть? (ХХ век)

По-моему Математика — это Слово Божие. (22.03.05)
Re[5]: IE - могу взять HTML коды из фреймов, но не всегда. К
От: AndrewJD США  
Дата: 29.09.04 17:33
Оценка:
Здравствуйте, VMin, Вы писали:

VM>Есть страница http://1011.com/val/get.html с одним фреймом от другого домена http://wsprod01.realtors.org/NrdsSearch/app/servlet/NrdsSearch?action=homeMember

VM>Последний линк сам по себе из адресной строки IE нормально не открывается.
VM>Т.е. работает только через фрейм.

Повидимому сервер wsprod01.realtors.org смотрит referrer откуда пришел запрос


VM>Так вот мне хочется плучить pIFrameDoc!=0.


B что с ним делать ?
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[6]: IE - могу взять HTML коды из фреймов, но не всегда. К
От: VMin Россия  
Дата: 29.09.04 18:49
Оценка:
Здравствуйте, AndrewJD, Вы писали:

AJD>Повидимому сервер wsprod01.realtors.org смотрит referrer откуда пришел запрос


Надо еще узнать с чем едят этот referrer. (пока не знаю)
Удивительно что с http://Localhost/get.html сервер отвечает,
а из папки C:\WebFolder\...\get.html не хочет.

VM>>Так вот мне хочется плучить pIFrameDoc!=0.


AJD>B что с ним делать ?


Вообще далее:
если pIFrameDoc!=0 — разбираю этот pIFrameDoc по косточкам и формирую запросы ->
опять разбираю этот pIFrameDoc по косточкам + навигация по линкам результатов запросов -> ........
кладу конечную информацию в свою базу данных.

Пока.
Это я Вас как математик математика спрашиваю:
Что такое математика?
Один из законов Божьих или это сам Бог и есть? (ХХ век)

По-моему Математика — это Слово Божие. (22.03.05)
Re[7]: IE - могу взять HTML коды из фреймов, но не всегда. К
От: AndrewJD США  
Дата: 29.09.04 22:44
Оценка:
Здравствуйте, VMin, Вы писали:


VM>Надо еще узнать с чем едят этот referrer. (пока не знаю)


referrer — это предидущая страница


AJD>>B что с ним делать ?


VM>Вообще далее:

VM>если pIFrameDoc!=0 — разбираю этот pIFrameDoc по косточкам и формирую запросы ->
VM>опять разбираю этот pIFrameDoc по косточкам + навигация по линкам результатов запросов -> ........
VM>кладу конечную информацию в свою базу данных.

Навскидку могу предложить обрабатывать событие DISPID_DOCUMENTCOMPLETE и там получать IWebBrowser для каждого фрейма и соответственно IHTMLDocument2. Может быть не очень красиво — но зато работает.
Я накидал по-быстрячку примерчик код который сохраняет содержимое всех фреймов в файлы. Работает и на этом http://1011.com/val/get.html урле тоже


void SaveHtml(LPDISPATCH pDispatch, LPCTSTR szFileName) 
{
    USES_CONVERSION;
    if(pDispatch)
    {
        CComQIPtr<IPersistFile> spFile = pDispatch;
        if (spFile)
        {        
            spFile->Save( T2W(szFileName), FALSE);
        }
    }
}





static int g_cnt = 0;

STDMETHODIMP CEventHandler::OnDocumentComplete(IDispatch *pDisp,
                                               VARIANT *URL)
{
    USES_CONVERSION;
    TRACE("OnDocumentComplete(%s)\n", W2T(URL->bstrVal));
    
    CComQIPtr<IWebBrowser2> spWeb = pDisp;
    if (spWeb)
    {
        CComPtr<IDispatch> spDisp;
        spWeb->get_Document(&spDisp);
        if (spDisp)
        {
            CComQIPtr<IHTMLDocument2> spDoc = spDisp;
            if (spDoc)
            {
                TCHAR buf[1024];
                _stprintf(buf, _T("d:\\1\\out_%d.html"), g_cnt++);
                SaveHtml(spDisp, buf);                
            }
            
        }
    }
    
    return S_OK;
}
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[8]: IE - могу взять HTML коды из фреймов, но не всегда. К
От: Аноним  
Дата: 30.09.04 00:50
Оценка:
Здравствуйте, AndrewJD,

Спасибо!
Коды сохранил.

К сожалению раньше пятницы или даже понедельника попробовать не смогу.
Надо поисковик залатать, а то падать часто стал.
Надеюсь сказать "Огромное Спасибо".

Пока.
Re: IE - могу взять HTML коды из фреймов, но не всегда. Как?
От: Аноним  
Дата: 30.09.04 09:40
Оценка:
ты можешь при DocumentComplete2 запоминать в vector все документы которые загрузятся

if ( pDisp != NULL )
{
try
{
Web::IWebBrowserPtr spWebBrowser = pDisp;
IDispatchPtr spDispatch = spWebBrowser->Document;
m_Documents.push_back( spDispatch );
}
catch ( _com_error & )
{
ATLASSERT( 0 );
}
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.