网上大部分教程的都是使用Nuget下载CefSharp,但是我试了一下,下载速度慢得要命,折腾了好久都没有下载成功,最后只好下载别人提供好的压缩包

同时,使用CefSharp有几个特别注意的地方:

1   你要安装VC ++ Runtime 2013,不然会报  ‘无法加载文件或’CefSharp.Core.dll’程序集或它的一个依赖’ 的错误,下载地址:

https://www.microsoft.com/zh-CN/download/details.aspx?id=40784

2  设置项目对应的解决方案设置目标平台为x86或者x64

3  根据你的系统下载32位或者64位的CefSharp,当然你可以使用vistual studio的包管理工具Nuget下载,我这里提供压缩包版下载地址,解压就可以使用,免费并免积分,如果那天需要积分了,请告知我一声,我调回来,有时候csdn那边会乱调我的资源所需的积分值

64位:https://download.csdn.net/download/zxy13826134783/12277612

32位:https://download.csdn.net/download/zxy13826134783/12277907

首先介绍一下我的开发环境:

vistual studio 2012

window 7

.net framework 4.6 (查阅资料发现有人说CefSharp与.net framework的版本有很大的关系,我测试发现使用vistual studio 2019可以下载最新版CefSharp,而且是把项目对应的解决方案设置目标平台为x86或者x64后才能下载,但到导入项目时出现诡异的警告,运行报错,最后不得不下载别人提供压缩包版的)

详细步骤如下:

1  先安装VC ++ Runtime 2013

2  新建一个winform项目,名为CefSharpDemo1

3   设置项目对应的解决方案设置目标平台为x86或者x64,下面动图是以64位作为演示

4   解压下载好的CefSharp,并在项目中添加下面三个dll(就在解压后的文件夹内)引用:

CefSharp.dll

CefSharp.Core.dll

CefSharp.WinForms.dll

5  把解压后的所有文件拷贝到bin/Debug的目录下(注意是x64那个文件夹内的Debug目录,如果是32位系统,则为x86那个文件夹),具体步骤如下动图:

6  在默认新建的窗体Form1编写代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace CefSharpDemo1
{public partial class Form1 : Form{public Form1(){InitializeComponent();InitBrowser();}public CefSharp.WinForms.ChromiumWebBrowser browser;public void InitBrowser(){CefSharp.Cef.Initialize(new CefSharp.CefSettings());browser = new CefSharp.WinForms.ChromiumWebBrowser("www.baidu.com");this.Controls.Add(browser);browser.Dock = DockStyle.Fill;}}
}

最终运行效果如下动图所示:

2020年6月2日补充:

与javascript进行交互,可实现模拟键盘输入或者鼠标点击操作

//其它初始化操作省略...public CefSharp.WinForms.ChromiumWebBrowser browser=new CefSharp.WinForms.ChromiumWebBrowser(url);//为网页中id号为input J_Input的输入控件设置值browser.GetBrowser().MainFrame.ExecuteJavaScriptAsync("document.getElementById('input J_Input').value='设置的值'")//模拟鼠标点击,模拟鼠标点击classname为btn J_Submit的控件browser.GetBrowser().MainFrame.ExecuteJavaScriptAsync("document.getElementsByClassName('btn J_Submit')[0].click();")

执行javascript方法,获取网页html代码

方法1:获取当前页面html源码,同步完成

 //初始化代码省略...public CefSharp.WinForms.ChromiumWebBrowser browser;private async void btnNext_Click(object sender, EventArgs e){//注意,下面一行代码需要放在带async关键字的方法内string html = await browser.GetBrowser().MainFrame.GetSourceAsync();
}

方法2:网页加载完毕后自动获取,有点问题,在获取淘宝的html源码时,发现注册的方法回调多次,


//注册网页加载完毕后回调的方法,其它初始化代码省略...
browser.FrameLoadEnd+=browser_FrameLoadEnd;private void browser_FrameLoadEnd(object sender, CefSharp.FrameLoadEndEventArgs e){StringBuilder sb = new StringBuilder();sb.AppendLine("function tempFunction() {");sb.AppendLine(" return document.getElementsByTagName('html')[0].innerHTML; ");sb.AppendLine("}");sb.AppendLine("tempFunction();");var task01 = browser.GetBrowser().MainFrame.EvaluateScriptAsync(sb.ToString());task01.ContinueWith(t =>{if (!t.IsFaulted){var response = t.Result;if (response.Success == true){if (response.Result != null){string html = response.Result.ToString();}}}});}

2020年6月6日补充:

案例:抓取淘宝数据,并获取每个商品的历史最高价、历史最低价和现价,帮助用户快速找到那个商品最值得买

案例视频演示地址:https://www.bilibili.com/video/BV1Dg4y1i7mC

案例项目源码地址下载:https://gitee.com/zxy15914507674/shared_resource_name/blob/master/%E6%B7%98%E5%AE%9D%E5%95%86%E5%93%81%E6%8E%A8%E8%8D%90.rar

核心知识点

1  网页源码html的获取

2  使用正则表达式解析html并获取到需要的信息

3   CefSharp与JavaScrtipt交互,模拟键盘输入和鼠标点击(文章前面已经讲述,不再叙述)

网页源码html的获取涉及到

1  请求的方式是POST还是GET请求;

2  是否需要ip代理,请求某些网站重要的数据是需要ip代理,不然会被识别为爬虫

3  请求方式为POST请求时,是否需要发送表单数据

下面的代码是获取网站的html源码,需要ip代理并根据设置并发送表单数据:

   /// <summary>/// 获取网页的源码/// </summary>/// <param name="url">网页url地址</param>/// <param name="Method">POST或者GET</param>/// <param name="formData">formData的数据,没有填null</param>/// <returns></returns>public string GetHtml(string url,string Method,Dictionary<string,string> formData){System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; //加上这一句Uri uri = new Uri(url);HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(uri);//设置请求头myReq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36";myReq.Accept = "*/*";myReq.KeepAlive = false;myReq.AllowAutoRedirect = true;myReq.Headers.Add("Accept-Language", "zh-CN,zh;q=0.9");myReq.ContentType = "application/x-www-form-urlencoded;charset=utf-8";//设置请求的方式,是POST还是GET请求myReq.Method =Method;//设置请求的最长时间,毫秒级别,超过这个时间,就算请求失败myReq.Timeout = 1000;//产生随机数,从List列表中取出代理ip,目的是为了3个ip能轮流请求,这样被识别为爬虫的概率会降低Random r = new Random();int ramdom=r.Next(1, 4);Console.WriteLine(ramdom);//设置代理ip,以:分割,如47.84.102.137:1245通过冒号分割后,str[0]="47.84.102.137",str[1]="1245"string[] str = Ip_Port_List[ramdom].Split(':');string proxyIp =str[0];// str[0];int proxyPort =Convert.ToInt32(str[1]);//设置代理ipmyReq.Proxy = new WebProxy(proxyIp, proxyPort);//添加表单数据,通过formData来判断是否有表单数据需要提交if (formData != null&&formData.Count>0){string formDataParam = "";int index = 0;foreach (var item in formData){//第一个参数一般不需要加&if (index == 0){formDataParam += item.Key + "=" + item.Value;index++;}else{//从第二个参考开始后就需要加&formDataParam +="&"+item.Key + "=" + item.Value;}//最终formDataParam类似这样:formDataParam=param1=value1&param2=value2&param3=value3}myReq.AllowWriteStreamBuffering = true;byte[] buffer = Encoding.UTF8.GetBytes(formDataParam);myReq.ContentLength = buffer.Length;using (Stream requestStream = myReq.GetRequestStream()){requestStream.Write(buffer, 0, buffer.Length);requestStream.Flush();}}HttpWebResponse result;try{result = (HttpWebResponse)myReq.GetResponse();}catch (Exception){return "";}Stream receviceStream = result.GetResponseStream();StreamReader readerOfStream = new StreamReader(receviceStream, System.Text.Encoding.GetEncoding("utf-8"));string strHTML = readerOfStream.ReadToEnd();readerOfStream.Close();receviceStream.Close();result.Close();return strHTML;}

使用正则表达式解析html并获取到需要的信息

1   首先得介绍如何得到淘宝的商品id号,打开淘宝,随便输入商品名称,然后在响应的源码中搜索nid,如下图:

如上图中的"nid":"44839745803",这样的数据格式,如何通过正则表达式获取当前页的所有的商品id呢?

解析的代码在源码中的From1类中的 private async void browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)方法中,核心代码如下:

var html ="获取到的源码";
if (html == null || html.Length == 0)
{Console.WriteLine("获取网页出错");return;
}//匹配的正则表达式
string strPattern = "\"nid\":\"\\d*";
Regex reg = new Regex(strPattern, RegexOptions.IgnoreCase);
MatchCollection mc = reg.Matches(html);
if (mc.Count == 0)
{Console.WriteLine("获取不到数据");
}foreach (Match m in mc)
{string value = m.Value;//接着把"nid":"使用空字符串替换就得到商品的id号了value = value.Replace("\"nid\":\"", "");Console.WriteLine(value);}

2  获取到商品id号后,需要使用第三方解析平台获取价格信息,请求地址:

http://www.tool168.cn/?m=history&a=view&k=https://item.taobao.com/item.htm?id=554415401017,id后面的是刚才获取的商品id号,把这个链接直接复制到浏览器并访问,得到的结果如下图:

但通过分析,价格的信息并不在html源码中,而是需要分三步

2.1 从请求的html源码中获取到checkCode的id号(请求该html源码不需要ip代理),如下图:

如何通过正则表达式获取checkCodeId呢?"checkCodeId"  value="全配,后面的使用\w*通配,加上转义,完整的正则表达式为:     "\"checkCodeId\" value=\"\\w*"   ,最后把多余的部分使用空字符串替换即可

2.2 获取到checkCodeId后,通过访问http://www.tool168.cn/dm/ptinfo.php获取code,如下图:

该文件的请求访问为POST,同时带有表单数据,如下图:

获取该html源码代码在源码中的TaoBaoOperation类中,如下:

与前面介绍的方法GetHtml唯一不同的是,这个方法不使用ip代理

  /// <summary>/// 获取网页源码,不使用代理/// </summary>/// <param name="url"></param>/// <param name="Method"></param>/// <param name="formData"></param>/// <returns></returns>public string GetHtmlWithOutProxy(string url, string Method, Dictionary<string, string> formData){System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; //加上这一句Uri uri = new Uri(url);HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(uri);myReq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36";myReq.Accept = "*/*";myReq.KeepAlive = false;myReq.AllowAutoRedirect = true;myReq.Headers.Add("Accept-Language", "zh-CN,zh;q=0.9");myReq.ContentType = "application/x-www-form-urlencoded;charset=utf-8";myReq.Method = Method;//添加Form  Dataif (formData != null && formData.Count > 0){string formDataParam = "";int index = 0;foreach (var item in formData){if (index == 0){formDataParam += item.Key + "=" + item.Value;index++;}else{formDataParam += "&" + item.Key + "=" + item.Value;}}myReq.AllowWriteStreamBuffering = true;byte[] buffer = Encoding.UTF8.GetBytes(formDataParam);myReq.ContentLength = buffer.Length;using (Stream requestStream = myReq.GetRequestStream()){requestStream.Write(buffer, 0, buffer.Length);requestStream.Flush();}}HttpWebResponse result = (HttpWebResponse)myReq.GetResponse();Stream receviceStream = result.GetResponseStream();StreamReader readerOfStream = new StreamReader(receviceStream, System.Text.Encoding.GetEncoding("utf-8"));string strHTML = readerOfStream.ReadToEnd();readerOfStream.Close();receviceStream.Close();result.Close();return strHTML;}

调用如下:

 //获取商品的CodeIdstring checkCodeId="c014ceadcf3bcc8ac922f0e8b13c1b5b";string shopId="554415401017";string con = "https://item.taobao.com/item.htm?id=" + shopId;string codeIdUrl = "http://www.tool168.cn/dm/ptinfo.php";string CodeId = GetCodeId(codeIdUrl, checkCodeId, con);/// <summary>/// 获取CodeId/// </summary>/// <param name="url"></param>/// <param name="checkCodeId"></param>/// <param name="con"></param>/// <returns></returns>private string GetCodeId(string url,string checkCodeId,string con){Dictionary<string, string> formData = new Dictionary<string, string>();formData.Add("checkCode", checkCodeId);formData.Add("con", con);string codeId = "";string html = GetHtmlWithOutProxy(url, "POST", formData);string strPattern = "{\"code\":\"\\w*";Regex reg = new Regex(strPattern, RegexOptions.IgnoreCase);MatchCollection mc = reg.Matches(html);foreach (Match m in mc){codeId = m.Value;codeId = codeId.Replace("{\"code\":\"", "");Console.WriteLine("codeId:"+codeId);}return codeId;}

2.3  获取code的id号后,就可以通过访问链接http://www.tool168.cn/dm/history.php?code=0f72c0c84e6f722de6fb57f9feb3691e26545bc2991ffc290ed35271bb855499c9da68f2257e9a908086de963a5ea291dfb568333e84958e获取商品的价格了(获取该html源码需要ip代理),返回的数据格式如下图:

如何通过正则表达式获取到每天的价格呢?使用到了特殊的技巧,先拿一个数据来分析:

项目运行的必备条件:

1  需要去淘宝购买ip代理,两块钱即可,购买链接:https://item.taobao.com/item.htm?spm=a1z09.2.0.0.1ee32e8dA9OdA6&id=570636814039&_u=62bg4snuf5b8

选择购买3个动态ip即可(2块钱),然后在TaoBaoOperation类输入购买到的链接,如下图:

返回的数据格式类似:

47.84.102.137:1245

23.23.45.139:1356

234.234.134.4:1567

2  在TaoBaoOperation类中输入淘宝账号和淘宝登录密码,如下图:

winform使用CefSharp嵌入浏览器相关推荐

  1. 怎样在Winform窗体中嵌入Web浏览器

    背景 项目当中需要在Winform窗体中嵌入网页,虽然微软自带了WebBrowser控件,但是她是以IE模式运行的,兼容性实在太差,找了一圈发现有个叫CefSharp的家伙还不错,于是就拿来玩了一下. ...

  2. Winform下CefSharp的引用、配置、实例与报错排除(源码)

    Winform下CefSharp的引用.配置.实例与报错排除 本文详细介绍了CefSharp在vs2013..net4.0环境下,创建Winfrom项目.引用CefSharp的方法,演示了winfro ...

  3. 将B/S程序打包成exe,C#对外提供http接口,CefSharp 修改浏览器默认白色背景

    简介 公司有个项目,需要将我们https的B/S程序集成到的http的B/S程序中,还要保持本身功能完整,由于https程序中需要调用电脑的麦克风和摄像头,这就难受了.最后商量决定将https程序制作 ...

  4. cocos2d 嵌入网页_在 cocos2d-x 中嵌入浏览器

    在 cocos2d-x 中嵌入浏览器 次阅读 Embeds a browser in cocos2d-x 在游戏中嵌入网页是很常见的需求,cocos2d-x 引擎官方并没有提供这个功能. 我在网上转了 ...

  5. 在WinForm程序中嵌入ASP.NET[转]

    在WinForm程序中嵌入ASP.NET 现在的流行趋势是桌面程序Web化,Web程序桌面化,呵呵.最终目标就是你中有我,我中有你.例如MSN Explorer就是一个很好的展示,让用户在使用的时候分 ...

  6. java gui 嵌入浏览器_DJNativeSwing-SWT组件-Java GUI中内嵌浏览器

    Java项目中经常需要在GUI程序中嵌入浏览器,而Swing自带的组件对CSS.JS的支持不是很好,网上也有很多组件,参考 但是由于对各个平台的支持不是很好,笔者是在Mac系统下进行开发,很多组件只支 ...

  7. java内嵌html5浏览器_在java应用程序中嵌入浏览器

    方式一:用jdic开源组件,这种方式有个缺点,不支持firefox,如果把默认浏览器设为firefox就会出错 具体代码如下: import java.awt.BorderLayout; import ...

  8. WinForm使用CefSharp,嵌入浏览器

    引入库:CefSharp.WinForms using CefSharp; using CefSharp.WinForms; using System; using System.Collection ...

  9. winform利用CefSharp调用google浏览器内核ChromiumWebBrowser,与JS交互

    一开始用了自带的webbrowser,不支持H5,脚本会有问题,后来又用了webkitBrowser,发现有些js效果还是显示不出来,和webbrowser稍微好一点,但是还是不行,然后决定用CefS ...

最新文章

  1. IIS 之 添加绑定域名 或 设置输入IP直接访问网站
  2. django-TDD
  3. 10Linux服务器编程之:opendir()函数,readdir()函数,rewinddir()函数,telldir()函数和seekdir()函数,closedir()函数
  4. 基于FPGA的IIR滤波器设计
  5. jQuery css
  6. Node.js Express+Mongodb 项目实战
  7. C++内置数组和array的比较
  8. 【迁移学习】算法之TrAdaBoost
  9. Android AR场景拍照技术实现(有关键源代码)
  10. Python3_tuple
  11. CSDN超实用的浏览器插件—去自家网站/搜索广告、超快捷万能搜索、各种实用小功能等诸多功能等你探索
  12. Unity 3D 热更新之基于 Asset Bundle Browser 的 AssetBundle包
  13. 【浪漫程序员系列】情人节给女友写代码表达爱意,让她感动到哭
  14. 历年诺贝尔物理学奖获得者名单及研究领域(1901-2016)
  15. s_p_a_r_k_内核
  16. 【困扰了很久,实测已解决】MacBook上不了V2EX网站但Windows可以
  17. 美洽消息推送 php,GitHub - Meiqia/MeiqiaSDK-Push-Signature-Example: 美洽 SDK 3.0 推送的数据结构签名算法,多语言示例。...
  18. GIS添加XY坐标操作
  19. 2020CCPC长春站后记
  20. Young氏双缝干涉实验近似公式推导的传统谬误

热门文章

  1. 关于报 程序包com.jt.pojo不存在、报 Process terminated、Failed to execute goal on project jt-manage: 的问题,已解决
  2. SAP基底数据仓库实战项目(序章)
  3. AI三大主义:符号主义、联结主义、行为主义
  4. 几种Web服务器比较-(Apache、IIS、Lighttpd、Nginx、LiteSpeed、Zeus
  5. 前端eslint+prettier+lint-staged配置
  6. 计算机软硬件问题及解决方法(经验篇)
  7. 关于增量模型和迭代模型的区别
  8. c语言中的百分数怎么求,如何计算具体百分比
  9. 使用BitLocker实现磁盘加密、u盘加密、移动硬盘加密
  10. [青少年CTF]misc-Simpleness writeup by q1jun