是否可以用 C++ 加载网页并获取渲染的 DOM?不仅仅是 HTTP 响应,还有 java 脚本运行后(可能是让它运行一段时间后)呈现的 DOM。特别是随着时间的推移可能发生变化的动态 HTML?有这个库吗?
或者,如果不是 c++,您是否知道可以用任何其他语言来完成此操作?
编辑这里有一个示例,可以更好地说明为什么人们可能想要这样做:
想象一下您想要抓取一个用 Angular 编写的网站。你不能只发出一个http请求并使用HTTP响应,因为大多数DOM是在javascript/动态html操作DOM之后渲染的。角度站点的初始 http 响应可能不包含所有内容,其请求并稍后通过 javascript/AJAX/dyanmic html 呈现。
由于 DOM 的实现方式因每个浏览器而异,因此在 C++ 中使用 DOM 的方式也会因浏览器而异。
我将举一个 IE 的例子。您可以使用网页浏览器 https://msdn.microsoft.com/en-us/library/aa752040(v=vs.85).aspxActiveX 控件公开了浏览器2 https://msdn.microsoft.com/en-us/library/aa752127(v=vs.85).aspx界面。从那里您可以调用 IWebBrowser2::get_Document 来获取IHTML文档2 https://msdn.microsoft.com/en-us/library/aa752574(v=vs.85).aspx对象,它是 DOM 的根。
#include "StdAfx.h"
using namespace ATL;
using namespace std;
void ThrowIfFailed(HRESULT hr)
{
if (FAILED(hr))
throw CAtlException(hr);
}
int main()
{
::CoInitialize(nullptr);
try
{
CComPtr<IWebBrowser2> pWebBrowser;
HRESULT hr = ::CoCreateInstance(CLSID_InternetExplorer, nullptr, CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&pWebBrowser));
ThrowIfFailed(hr);
hr = pWebBrowser->put_Visible(VARIANT_TRUE);
ThrowIfFailed(hr);
hr = pWebBrowser->GoHome();
ThrowIfFailed(hr);
CComPtr<IDispatch> pDispatch;
hr = pWebBrowser->get_Document(&pDispatch);
ThrowIfFailed(hr);
CComPtr<IHTMLDocument2> pDocument;
hr = pDispatch->QueryInterface(&pDocument);
ThrowIfFailed(hr);
CComBSTR bstrTitle;
hr = pDocument->get_title(&bstrTitle);
ThrowIfFailed(hr);
wcout << bstrTitle.m_str << endl;
}
catch (const CAtlException& e)
{
wcout << L"Error (" << hex << e.m_hr << L")" << endl;
}
::CoUninitialize();
return 0;
}
此代码只是打开一个 IE 窗口,导航到主页,并将页面标题写入控制台。您还可以通过删除对 IWebBrowser2::put_Visible 的调用来控制 IE 窗口是否变得可见。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)