深圳全飞鸿

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 255|回复: 3
打印 上一主题 下一主题

CefSharp截取网页内容

[复制链接]

228

主题

466

帖子

2184

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2184
跳转到指定楼层
楼主
发表于 2024-8-25 09:53:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
CefSharp是一个开源的.NET库,用于嵌入Chromium浏览器到.NET应用程序中。要截取事件,您可以使用CefSharp的事件处理机制。以下是一个简单的示例,展示了如何使用CefSharp截取网页加载完成事件
  1. using CefSharp;
  2. using CefSharp.WinForms;
  3. using System;
  4. using System.Windows.Forms;

  5. namespace CefSharpExample
  6. {
  7.     public partial class MainForm : Form
  8.     {
  9.         private ChromiumWebBrowser browser;

  10.         public MainForm()
  11.         {
  12.             InitializeComponent();
  13.             InitializeChromium();
  14.         }

  15.         private void InitializeChromium()
  16.         {
  17.             browser = new ChromiumWebBrowser("https://www.example.com");
  18.             browser.Dock = DockStyle.Fill;
  19.             this.Controls.Add(browser);

  20.             // 注册网页加载完成事件
  21.             browser.FrameLoadEnd += Browser_FrameLoadEnd;
  22.         }

  23.         private void Browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
  24.         {
  25.             if (!e.Frame.IsMain)
  26.                 return;

  27.             if (e.HttpStatusCode == 200)
  28.             {
  29.                 // 在这里处理网页加载完成事件
  30.                 Console.WriteLine("网页加载完成");
  31.             }
  32.             else
  33.             {
  34.                 // 处理加载失败的情况
  35.                 Console.WriteLine($"网页加载失败,状态码:{e.HttpStatusCode}");
  36.             }
  37.         }
  38.     }
  39. }
复制代码







回复

使用道具 举报

228

主题

466

帖子

2184

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2184
沙发
 楼主| 发表于 2024-8-25 09:55:16 | 只看该作者
读取网页源代码
在页面加载完成后处理, 依赖最低环境 4.5.2

  1. async void browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)  
  2. {  
  3.     Log.WriteLog("browser_FrameLoadEnd:" + e.Url);  

  4.     var result = await browser.GetSourceAsync();  
  5. }  
复制代码

如果想在4.0下环境操作需要使用。

  1. var task = browser.GetSourceAsync();  
  2. task.Wait();  
  3. string content = task.Result;  
复制代码

回复 支持 反对

使用道具 举报

228

主题

466

帖子

2184

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2184
板凳
 楼主| 发表于 2024-8-25 09:55:56 | 只看该作者
我已用过的代码:
  1. private void chromiumWebBrowser1_FrameLoadEnd(object sender, CefSharp.FrameLoadEndEventArgs e)
  2.         {
  3.             var task02 = chromiumWebBrowser1.GetBrowser().MainFrame.GetSourceAsync();
  4.             task02.ContinueWith(t =>
  5.             {
  6.                 if (!t.IsFaulted)
  7.                 {
  8.                     string resultStr = t.Result;
  9.                     int iPos = resultStr.IndexOf(@"<td>tcp://");
  10.                     if (iPos > 0)
  11.                     {
  12.                         String ipstr = resultStr.Substring(iPos + 10, 100);
  13.                         iPos = ipstr.IndexOf(@"</td>");
  14.                         if (iPos > 0)
  15.                         {
  16.                             ipstr = ipstr.Substring(0, iPos);
  17.                         }
  18.                         WriteLog(ipstr);
  19.                         Application.Exit();
  20.                     }
  21.                 }
  22.             });

  23.         }
复制代码


回复 支持 反对

使用道具 举报

228

主题

466

帖子

2184

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2184
地板
 楼主| 发表于 2024-8-25 14:35:35 | 只看该作者
兼容性

即使是在Windows上,WebBrowser默认使用的也是IE7引擎。一个不太彻底的解决方案,是通过修改html的meta信息强制指定兼容性IE引擎:

<meta http-equiv="X-UA-Compatible" content="IE=10" />
IE=edge也是一个合理的参数。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|nagomes  

GMT+8, 2025-5-5 05:10 , Processed in 0.024262 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表