我希望这是一项简单的任务,但是需要那些精通CefSharp的人来解决它.
我有一个我想从中检索HTML的网址.问题是这个特定的URL实际上并没有在GET上分发页面.相反,它将一大堆Javascript推送到浏览器,然后浏览器执行并生成实际呈现的页面.这意味着涉及HttpWebRequest和HttpWebResponse的常用方法不起作用.
我看了很多不同的“无头”选项,而我认为最符合我需求的选择有很多原因是CefSharp.Offscreen.但我不知道这件事是如何起作用的.我看到有几个可以订阅的事件,以及一些配置选项,但我不需要像嵌入式浏览器那样的东西.
我真正需要的是一种做这样的事情的方式(伪代码):
string html = CefSharp.Get(url);
订阅事件时我没有问题,如果需要等待Javascript执行并生成呈现的页面.
最佳答案 如果你无法获得Chromium的无头版本来帮助你,你可以试试node.js和jsdom(
https://github.com/tmpvar/jsdom).一旦节点启动并运行,便于安装和播放.你可以在Github README上看到简单的例子,他们下拉URL,运行所有的javascript,包括任何自定义的javascript代码(例如:jQuery位来计算某些类型的元素),然后你在内存中有HTML来做你想做的事情.您可以只执行$(‘body’).html()并获取一个字符串,就像在伪代码中一样. (这甚至适用于生成SVG图形的东西,因为那只是更多的XML树节点.)
如果您需要将此作为需要分发的较大C#应用程序的一部分,那么您使用CefSharp.Offscreen的想法听起来很合理.一种方法可能是首先使用CefSharp.WinForms或CefSharp.WPF,然后你可以在字面上看到东西,然后在这一切都工作的时候尝试CefSharp.Offscreen.您甚至可以在屏幕浏览器中运行一些JavaScript来下载body.innerHTML并将其作为字符串返回到C#端,然后再无头.如果这样做,其余的应该很容易.
也许从CefSharp.MinimalExample(https://github.com/cefsharp/CefSharp.MinimalExample)开始并进行编译,然后根据您的需要进行调整.您需要能够在C#代码中设置webBrowser.Address,并且您需要知道页面何时已加载,然后您需要使用JavaScript代码调用webBrowser.EvaluateScriptAsync(“.. JS code ..”)(如一个字符串),它将执行所描述的操作(将bodyElement.innerHTML作为字符串返回).