使用CefSharp和Javascript实现网络爬虫-Javascript和C#交互
在爬虫实现过程中,采用Javascript的DOM操作来抓取目标数据,并通过CefSharp提供的Javascript和C#交互方法,把目标数据传递给C#代码进行处理。上一篇介绍了采用Javascript的DOM操作来抓取目标数据,这一篇介绍CefSharp中Javascript和C#之间的调用和交互,以及使用C#委托实现回调处理。
一、CefSharp中Javascript和C#之间的调用和交互
1、C#调用Javascript
private ChromiumWebBrowser myBrowser;
myBrowser.GetBrowser().MainFrame.ExecuteJavaScriptAsync("console.log('helloworld');");
2、Javascript调用C#,实现数据上报
(1)C#暴露接口定义
public class AsyncJavascriptBindingClass{
public int ReceiveMsg (int nType, string msg){
Console.WriteLine("AsyncJavascriptBindingClass. ReceiveMsg: " + nType + "," + msg);
}
}
(2)C#暴露接口注册
myBrowser.JavascriptObjectRepository.ResolveObject += (_sender, _e) =>{
var repo = _e.ObjectRepository;
if (_e.ObjectName == "boundAsync"){
repo.Register("boundAsync", new AsyncJavascriptBindingClass(), isAsync: true);
}
};
(3)在Javascript中调用
async function sendMsg(type,msg){
await CefSharp.BindObjectAsync('boundAsync');
var result = await boundAsync. ReceivMsg(type,msg);
};
sendMsg (1, 'hello C#');
二、C#委托使用
当C#代码接收到Javascript传递的目标数据后,常常需要通知其他处理线程进行后续处理,例如通知主界面线程改变当前访问的URL地址等,这里介绍我在实现爬虫过程中使用C#委托实现回调机制。
(1)定义委托类
public delegate void CallBackDelegate(string msg);
(2)在AsyncJavascriptBindingClass中触发回调函数
public class AsyncJavascriptBindingClass{
public CallBackDelegate callBack;
public AsyncJavascriptBindingClass(CallBackDelegate _callBack){
this.callBack = _callBack;
}
public int ReceivMsg (int nType, string msg){
callback(msg); //todo
}
}
(3)在主界面对象WindowForm中实现回调函数
private void CallBack(string msg){
//your code
}
myBrowser.JavascriptObjectRepository.ResolveObject += (_sender, _e) =>{
var repo = _e.ObjectRepository;
if (_e.ObjectName == "boundAsync"){
repo.Register("boundAsync", new AsyncJavascriptBindingClass(CallBack), isAsync: true);
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!