你能用c++加载一个网页,包括JS和动态html并获取渲染的DOM字符串吗?

2024-04-20

是否可以用 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(使用前将#替换为@)

你能用c++加载一个网页,包括JS和动态html并获取渲染的DOM字符串吗? 的相关文章

  • 检查 IE8 是否使用纯 Javascript [重复]

    这个问题在这里已经有答案了 我以前是这样检查的 browser msie browser version 8 但似乎 browser已从 jQuery 的更高版本中删除 So 我怎样才能用纯javascript检查这一点 I tried i
  • 更改 jQuery 中链接的标题

    我有一个 id 为 helpTopicAnchorId 的链接 我想在 jQuery 中更改其文本 我该怎么做呢 helpTopicAnchorId text newText P S the jQuery 文档 http docs jque
  • 是否可以在三元表达式上只放置一个选项?

    我只是好奇这是否可能 或者是否有办法使它成为 C 的有效语法 expression value do nothing here or put some empty block like SomeClass SomeMethod Edit 为
  • GCC 和 -Wconversion

    让我们编译以下程序 int main uint16 t data 0 data uint16 t std round 3 14f return 0 with g Wconversion prog cpp 我们会得到warning conve
  • Electron 中的收据热敏打印机

    我需要找到一种在 javascript 中打印收据的方法Electron 我已经尝试过了QZ TRAY但由于 Electron 它不起作用 我也尝试过节点热敏打印机但它也从来没有对我有用 这里有人知道如何在 javascript Elect
  • 使用来自不同线程的实时数据更新 QTableView 的最佳策略

    我的应用程序现在启动几个线程 如 5 10 个 来从不同源收集数据 它们与主 GUI 线程分离 因此我在 GUI 中感觉不到任何缓慢 并且我可以在后台线程工作时继续工作 一切都很棒 但现在我希望能够在我的主 GUI 中的 QTableVie
  • 如果键不是映射中的初始化键,STL map[key] 返回什么? [复制]

    这个问题在这里已经有答案了 这是一些示例代码 include
  • 对大数据块进行反应非阻塞渲染

    最近我开始学习反应并想知道是否有某种模式可以用于大数据的非阻塞 UI 线程渲染 比方说 我们采取这个例子 https www mendix com tech blog making react reactive pursuit high p
  • ASP.NET 中的 JavaScript 事件处理程序

    我有以下 iframe 控件 旨在成为类似 facebook 的按钮 iframe gt 我在上面定义了 javascript 函数 如下所示
  • 使用 TypeScript / Angular2 循环对象的键/值[重复]

    这个问题在这里已经有答案了 如何使用 TypeScript 迭代对象并能够访问键和值 我的 json 对象看起来像这样 clients 123abc Forename Simon Surname Sample 456def Forename
  • 在C中更改函数内的数组

    我正在学习 C 并且很困惑为什么在 main 中创建的数组不会在函数内部更改 我假设传递的数组是一个指针 并且更改指针应该更改数组 对吧 有人可以解释这种情况下发生了什么吗 谢谢你的帮助 int main int i length 10 i
  • XHR 调用是宏任务还是微任务?

    Ajax 调用被安排为微任务还是宏任务 浏览器之间有什么区别吗 在 JavaScript Ninja 的秘密 第二版一书中 作者指出网络事件被安排为宏任务 因此 XHR 回调与宏任务一起排队
  • 如何自动检索AJAX调用的URL?

    目的是对爬行蜘蛛进行编程 使其能够 1 检索此页面表格中链接的 URL http cordis europa eu fp7 security projects en html http cordis europa eu fp7 securi
  • 使用 JSON.NET 反序列化一些 JSON

    我对 JSON 非常陌生 我需要解析 API 提供的一些内容 谷歌快速搜索出现了JSON NET http james newtonking com pages json net aspx 所以我现在尝试使用它将此 JSON 解析为列表对象
  • .js.erb VS .js

    将 Rails 应用程序的 javascript 放入 js erb 文件而不只是将其放入 application js 文件有什么好处 我有一个企业创建按钮 因此我应该将代码放入 create js erb 文件中 还是使用以下方法将其放
  • vuejs2复制剪贴板问题

    我正在尝试使用https alligator io vuejs vue clipboard copy https alligator io vuejs vue clipboard copy 对于 Vue js 中的复制剪贴板功能 它对于字符
  • WCF - IsOneway 的行为不像 Oneway 操作

    我已在服务的某些方法上定义了 OneWay 属性 但它们的行为并不像 Oneway 调用 我的客户等待呼叫完成并从服务返回 我假设单向操作是非阻塞操作 并且客户端不关心被调用函数会发生什么 它只是调用并忘记它 这是对的吗 问题 调用 Ope
  • 类型 '' 未映射

    我已经尝试修复这个错误有一段时间了 每当我的应用程序尝试创建数据上下文的实例时 我都会收到此错误 下面是代码 using System using System Collections Generic using System Linq u
  • scanf() 不等待用户输入[重复]

    这个问题在这里已经有答案了 我正在使用 c 中的双向链表来制作树 我在该函数中使用递归调用 但不知何故它不起作用 我的代码是 struct node int data struct node right struct node left s
  • 为什么在嵌套类上调用方法时不调用父类的静态构造函数?

    给出以下代码 为什么在 Main 的第一行之后没有调用 Outer 的静态构造函数 namespace StaticTester class Program static void Main string args Outer Inner

随机推荐