C#使用CefSharp控件实现爬虫

一、CefSharp介绍

CEF 全称是Chromium Embedded Framework(Chromium嵌入式框架),是个基于Google Chromium项目的开源Web browser控件,支持Windows, Linux, Mac平台。CEFSharp就是CEF的C#移植版本。

就是一款.Net编写的浏览器包,方便你在Winform和WPF中内嵌的Chrome浏览器组件

GitHub地址:https://github.com/cefsharp/CefSharp

安装

使用Nuget包引用

把项目改成64位

切换到X64

安装完之后工具栏应该会多出来这个控件(直接拖动用不了!)

二、使用

1、获得页面源代码

注意:

1、GetSourceAsync获取源码的方法是异步操作

2、判断页面加载完成,会触发FrameLoadEnd页面加载完成事件。使用CEF无法确定一个网站是否已经完全加载完成,我们只能在它每一次加载完成时,处理它的页面源码。(如果需要主动等待网站加载完成,可以试试使用Selenium)

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        ChromiumWebBrowser WebBrowser;

        private void Form1_Load(object sender, EventArgs e)
        {
            var settings = new CefSettings()
            {
                UserAgent = "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Mobile Safari/537.36",
            };

            //Perform dependency check to make sure all relevant resources are in our output directory.
            Cef.Initialize(settings, performDependencyCheck: true, browserProcessHandler: null);

            // cefsharp提供的浏览器控件,一般用它充满窗口就搞定了
            WebBrowser = new ChromiumWebBrowser("http://www.163.com")
            {
                // 填充整个父控件
                Dock = DockStyle.Fill
            };
            WebBrowser.FrameLoadEnd += new EventHandler<FrameLoadEndEventArgs>(FrameEndFunc);

            // 添加到窗口的控件列表中
            this.panel1.Controls.Add(WebBrowser);

        }
        private void FrameEndFunc(object sender, FrameLoadEndEventArgs e)
        {
            MessageBox.Show("加载完毕");
            this.BeginInvoke(new Action(() =>
            {
                String html = WebBrowser.GetSourceAsync().Result;
                richTextBox1.Text = html;
            }));
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            // 结束时要销毁
            Cef.Shutdown();
        }
    }
}

效果:可以加载很多原生webbrowser不能加载的内容 可以适应iframe

2、执行页面中的js函数

测试的js代码

<html>
<body>
<button type="button" onclick="test(1,2)">测试按钮</button>
</body>
<script type="text/javascript">
function test(a,b)
{
   var c = testfunc(a,b);
   alert(c);
}
function testfunc(a,b)
{
    return a+b;
}

</script>
<html>

调用页面中的testfunc函数

private void button3_Click(object sender, EventArgs e)
{
    using (StreamReader sr = new StreamReader("JavaScript1.html"))
    {
        string html = sr.ReadToEnd();
        WebBrowser.LoadHtml(html, "http://testpage/");
    }
}

private void button4_Click(object sender, EventArgs e)
{
    String script = "testfunc(99,1)";
    var result = this.WebBrowser.EvaluateScriptAsync(script).Result.Result;
    MessageBox.Show(result.ToString());
}

效果

3、常用方法

//浏览网址:
WebBrowser = new ChromiumWebBrowser("https://www.baidu.com");
// 或
WebBrowser.Load("https://www.baidu.com");

// 获取HTML(整体):
WebBrowser.GetSourceAsync().Result;

 // 获取HTML(特定Frame):
 WebBrowser.GetBrowser().GetFrame(“SI2_mem_index”).GetSourceAsync().Result;

//执行网页上的JavaScript:
 ExecuteJavaScriptAsync("document.getElementById('username').onkeydown();");

 //模拟左键点击:
 WebBrowser.GetBrowser().GetHost().SendMouseClickEvent(x, y, MouseButtonType.Left, false, 1, CefEventFlags.None);
 Thread.Sleep(50);
 WebBrowser.GetBrowser().GetHost().SendMouseClickEvent(x, y, MouseButtonType.Left, true, 1, CefEventFlags.None);

实例地址:https://github.com/zhaotianff/CSharpCrawler

到此这篇关于C#使用CefSharp控件实现爬虫的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • CefSharp如何进行页面的缩放(Ctrl+滚轮)

    问题:CefSharp如何进行页面的缩放 摘要:由于CefSharp并没有提供鼠标滚轮事件.只有一个KeyboardHandler事件,因此只能接收到键盘事件. 环境:CefShap.Wpf 了解CefSharp是否有现成方法调用 通过这个不难看出有一个KeyboardHandler可以用来接收键盘的Ctrl按钮.因此通过这个我们可以说就相当于解决了问题的一半了,就是可以通过这个来接收按键.那么鼠标的滚轮又如何接收到呢? CefSharp不能接收到鼠标滚轮 - 困境 相信大伙一开始肯定会想着Ch

  • 使用C# CefSharp Python采集某网站简历并且自动发送邀请短信的方法

    前言 以往爬虫没怎么研究过,最近有个需求,要从某网站采集敏感信息,稍稍考虑了一下,决定利用C# Winform和Python一起来解决这个事件. 整个解决方案不复杂:C#编写WinForm窗体,进行数据分析和采集, Python本来不想用的,一下子没找到C#下Woff字体转Xml的方案,而网上Python的则有很多,所以就加了一个Python项目,虽然就1个脚本. 一.几个步骤: 首先要模拟登录,登录完了进入简历采集,然后模拟下载,下载完了以后就可以看到求职者的电话了. 这个电话号码是使用动态生

  • CefSharp v62修改方法(支持.net4.0)

    吐槽一下,博客园久了没有上,账号没了,重新申请一个. cesharp v62版本,内核采用最新的Cef 62,支持最新的Grid布局. 由于官方的cefsharp 采用.net4.5.2开发.怎么办怎么办.我只能用.net4.0.没办法啊,自己拿源码修改兼容呗. 仔细分析源码发现: 1.net4.5.2 引入了 async/await 关键字. 这个其实国外大神已经有源码放出来了,我们把代码直接引入cefsharp 这个工程. 就可以直接在4.0里使用 async/await; 2.net4.5

  • C#使用CefSharp控件实现爬虫

    一.CefSharp介绍 CEF 全称是Chromium Embedded Framework(Chromium嵌入式框架),是个基于Google Chromium项目的开源Web browser控件,支持Windows, Linux, Mac平台.CEFSharp就是CEF的C#移植版本. 就是一款.Net编写的浏览器包,方便你在Winform和WPF中内嵌的Chrome浏览器组件 GitHub地址:https://github.com/cefsharp/CefSharp 安装 使用Nuget

  • C# cefSharep控件的使用详情

    C# 有一个WebBrowse 控件,但是它是基于IE 的,对HTML5 不友好,为了能够完美地支持HTML5 ,需要使用Google的嵌入式Chrome引擎.cefsharp 包分装了Chome 引擎.下面的程序小试了一下.遇到的问题是如何访问本地文档.网络上介绍的方法有点过时了. 要能够访问本地文件需要下面的代码 // Allow the use of local resources in the browser     BrowserSettings browserSettings = n

  • Bootstrap 树控件使用经验分享(图文解说)

    jquery 树形控件 jquery 树形控件是一款基于jquery+bootstrap.完全通过js和样式手写出来的非常轻量级的控件,它功能简单.用户体验不错.对于一些简单的层级关系展示比较实用. 前言:很多时候我们在项目中需要用到树,有些树仅仅是展示层级关系,有些树是为了展示和编辑层级关系,还有些树是为了选中项然后其他地方调用选中项.不管怎么样,树控件都是很多项目里面不可或缺的组件之一.今天,博主打算结合自己的使用经历和网上找到的一些不错的树控件在这里做一个分享,希望能帮大家找到最合适的控件

  • 使用Lable控件输出九九乘法表

    利用Lable控件输出九九乘法表,具体内容如下 首先建立一个空网站,之后选择添加新项,添加一个Web窗体. 进入.aspx文件之后,在设计界面中添加9个Lable控件.Lable控件在标准组中.得到的源代码是这样的. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="WebForm4.aspx.cs" Inherits="WebForm4" %> <

  • 用htc实现CHECKBOX控件

    复制代码 代码如下: /* 描述:        CHECKBOX控件 版本:        1.1 备注:        CHECKBOX控件背后跟随的文字             是获取CHECKBOX对象的htc_myLabel来显示的             更新添加indeter属性,用来增加不确定的选择 */ <public:component> <public:attach event="oncontentready" onevent="fnI

  • Ext JS框架中日期函数的用法及日期选择控件的实现

    Ext.Date是一个单例,封装了一系列日期操作函数,扩展JavaScript Date的功能,下面列出一些常用的功能. 基本函数: Ext.Date.add(date, interval, value) 给date增加或减少时间,这个函数不改变原有Date对象的值,而是返回一个新的Date对象. Ext.Date.between(date, start, end) 判断date是否在start和end之间. Ext.Date.clearTime(date, clone) 把date的时间设置成

  • 详解支持Angular 2的表格控件

    前端框架一直这最近几年特别火的一个话题,尤其是Angular 2拥有众多的粉丝.在2016年9月份Angular 2正式发布之后,大量的粉丝的开始投入到了Angular 2的怀抱.当然这其中也包括我.如果你想了解Angular 2,推荐官方网站:英文版.中文版.通过快速起步,可以快速体验Angular 2. 公司的一个项目想基于Angular 2的2.4 版本进行开发,目前还在进行前期的调研阶段.我担当的任务就是研究基于Angular 2的UI控件,在官方网站的资源中列出了很多支持Angular

  • Angularjs中使用layDate日期控件示例

    layDate 控件地址:http://laydate.layui.com/ 前情:原来系统中使用的日期控件是UI bootstrap(地址:https://angular-ui.github.io/bootstrap/)里的.后来因为各种原因,要换掉UI bootstrap中的日期控件,改用layDate日期控件. 解决思路:将layDate的初始化及相关代码定义在指令里. 问题关键点:layDate操作的是Html元素的,怎么实现双向绑定,同步Angularjs模板值和Html的元素值. 指

  • AngularJS 文件上传控件 ng-file-upload详解

    网上可以找到的 AngularJS 的文件上传控件有两个: angular-file-upload:https://github.com/nervgh/angular-file-upload ng-file-upload:https://github.com/danialfarid/ng-file-upload 这两个非常类似,连js文件的结构都是一样的.核心的js是.min.js,还都有一个-shim.min.js,用来支持上传进度条和上传暂停等高级功能. 按道理讲shim.js应该是可加可不

  • 学习使用AngularJS文件上传控件

    前段时间做项目遇到一个需求是上传文件,大概需要实现的样式是这样子的,见下图: 需要同时上传两个文件.并且规定文件格式和文件大小.因为前端框架使用angular,且不想因为一个上传功能又引入一个jquery,所以在网上查找基于angular的上传控件,因为angular还算比较新,貌似都没有太成熟的插件,网上的教程也大多是复制粘贴,总之没起倒多大的作用...但是皇天不负有心人,最后还是让我遇到了这个功能强大的插件,让我有种相见恨晚的感觉呀,依靠官方文档和师兄的帮助,终于搞清楚了基本的使用方法.好东

随机推荐