自研、掌握核心科技?这我可不敢吹,我老老实实说我用了个Chromium内核组件。
为了统计一些数据,一条条复制粘贴肯定是够累的。用爬虫吧,自己还不精通,而且现在好多数据都需要登录才能请求,或者有些需要滑滚动条才显示。

比如csdn社区的打卡记录,一个月的如何快速的统计出来呢?

  • 我想控制网页的请求
  • 我想控制请求结果
  • 我想给网页中硬塞点JS
  • 我想模拟输入、模拟按键
  • 我想自动翻页、拉滚动条、自动抓取数据

在Chrome浏览器中,可以通过安装扩展插件进行一些“特殊操作”。比如CSDN的浏览器插件就很强大,可以参考我的另一篇文章:油#猴是什么猴?又一门新的编程语言?卷不动了呀。

自己弄个浏览器,将这些都实现。

☆☆☆一定要注意,通过自动方式请求,一定要控制频率,我一般每个请求之间都会停顿5秒以上,文明抓数据,不能给别人和自己造成麻烦。☆☆☆

曾经号称打破漂亮国垄断的而大火的“hongxin”浏览器,最终被爆出实际是基于Chromium内核。其实我们也可以弄一个。做桌面软件,微软的Winform和Wpf那肯定是很方便的,也有对应的.Net组件方便将Chromium应用在Winform和Wpf程序中。

CefSharp 允许您在 .NET 应用程序中嵌入 Chromium。 它是 Marshall A. Greenblatt 围绕 Chromium 嵌入式框架 (CEF) 的轻量级 .NET 包装器。 大约 30% 的绑定是用 C++/CLI 编写的,这里的大部分代码是 C#。 它可以在 C# 或 VB 或任何其他 CLR 语言中使用。 CefSharp 提供 WPF 和 WinForms Web 浏览器控件实现。

CefSharp 是 BSD 许可的,因此它可以在专有和免费/开源应用程序中使用。

1. 新建项目

CefSharp 提供 WPF 和 WinForm支持,所以新建哪种项目都行,当然Wpf的可以做的更加漂亮一些。

本例以WinForm为例,新建一个WinForm项目:

设置项目名称,例如MyChrome

添加CefSharp组件,在Nuget中搜索CefSharp.Winforms, 由于本例是建的.Net core项目, 所以选择CefSharp.Winforms.NETCore, 安装即可

在Program.cs中进行初始化:

        public static int Main(string[] args){#ifANYCPUCefRuntime.SubscribeAnyCpuAssemblyResolver();
#endif//For Windows 7 and above, best to include relevant app.manifest entries as wellCef.EnableHighDPISupport();var settings = new CefSettings(){//By default CefSharp will use an in-memory cache, you need to specify a Cache Folder to persist dataCachePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "CefSharp\\Cache")};//Perform dependency check to make sure all relevant resources are in our output directory.Cef.Initialize(settings, performDependencyCheck: true, browserProcessHandler: null);var browser = new BrowserForm();Application.Run(browser);return 0;}

新建一个Form,例如MainForm,进入设计器:

在工具箱里可以看到已经有了相应组件:

第二个就是浏览器组件,可以拖一个到Form中进行配置。

具体可配置项比较多,可以参考GitHub中相关的配置文档:https://github.com/cefsharp/CefSharp。

在GitHub库中,也提供了相应的Example,如果想快速学习一下,这是非常好的例子。

访问一下CSDN,大概如下图:

2. 功能体验

在Chrome浏览器中,可以通过安装扩展插件进行一些“特殊操作”。比如CSDN的浏览器插件就很强大,可以参考我的另一篇文章:油#猴是什么猴?又一门新的编程语言?卷不动了呀。

浏览器插件都这么强大了,直接使用Chromium则能获得更大的主动权。

2.1 DevTools

要处理网页,怎么能少了DevTools,平时做前端开发,F12键肯定不少按。在这里也依然方便。在上图的地址栏中可以看到我自定义了三个按钮,其中一个就是DevTools,按钮对应的代码也很简单:

browser.ShowDevTools();

2.2 执行Js语句

来个最简单的例子:

browser.ExecuteScriptAsync("alert('sdsdd')");

2.3 模拟按键

有时候通过Js模拟输入、点击按钮等操作比较复杂,因为你不知道实际在页面中输入的时候,页面背地里又有什么操作,所以如果简单的给字段赋值可能是没用的。那么怎么模拟键盘输入呢?

比如想输入这样一句话:“没事看看CSDN”

string str = "没事看看CSDN";
foreach (char item in str)
{browser.GetBrowserHost().SendKeyEvent((int)258u, (int)item, 0);
}

这些都是基础功能,通过CefSharp,你可以控制请求数据,修改响应结果,发挥你的想象,你还想干什么。下面通过一个简单例子看一下。

3. 统计CSDN社区的打卡记录

需求分析:每一篇都有如下图这样的几页打卡记录

而每个月都有差不多30篇这样的文章,如何快速的统计出来呢?

思路就是:

  • 读取每一篇打卡贴的链接
  • 逐一打卡每一篇打卡贴
  • 获取打卡贴第一页的打卡记录
  • 逐一翻到下一页,获取各页的打卡记录

3. 1 获取所有打卡贴

首先关键字搜索,获取打卡贴列表

// 获取所有链接的JS
string script = @"Array.from(document.getElementsByClassName('user-tabs user-tabs-search')[0].getElementsByClassName('long-text-title')).map(x => ( x.href));";
// 执行JS代码,返回一个JavascriptResponse
JavascriptResponse response1 = await browser.EvaluateScriptAsync(script);dynamic arr = response1.Result;
// 遍历结果集合,将所有URL存储到一个静态集合中
foreach (dynamic row in arr)
{RecordManager.Urls.Add(row.ToString());
}

为了直观,弹出一个对话框,将URL显示出来:

GetCSDN getCSDN = new GetCSDN();
getCSDN.browser = browser;
getCSDN.ShowDialog();

这里定义了一个静态类来控制分析操作。

    public static class RecordManager{// 是否开始分析public static bool IsStart { get; set; } = false;// 分析到第几页public static int Index { get; set; } = -1;// 获取下一页地址public static string GetNextUrl(){ Index = Index + 1;if (Urls.Count == Index){return "";}return Urls[Index];}// URL列表public static List<string> Urls = new List<string>();// 获取到的打卡记录列表public static List<Record> RecordList { get; set; } = new List<Record>();// 分析完之后的回调函数public static Action callback;}

3.2 逐一打开各个页面并获取结果

上一图右边做了个开始按钮,点击将逐一开始分析。

系统提供了多种Handler用于浏览器各种操作的处理,这里要分析请求操作,所以用到RequestHandler

    public class CustomRequestHandler: RequestHandler{protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling){return new CustomResourceRequestHandler();}}

主要是指定了另一个专门用于处理请求的CustomResourceRequestHandler,二者关系如下图,后者才是分析的主角:

 public class CustomResourceRequestHandler : ResourceRequestHandler{private readonly MemoryStream memoryStream = new MemoryStream();protected override IResponseFilter GetResourceResponseFilter(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response){// 将请求响应结果放到MemoryStream中return new CefSharp.ResponseFilter.StreamResponseFilter(memoryStream);}protected override void OnResourceLoadComplete(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength){// 只分析打卡列表的请求结果if (!RecordManager.IsStart || !(request.Url.ToLower().StartsWith("https://bizapi.csdn.net/community-cloud/v1/community/task/list") && request.Method.ToLower().Equals("get"))){return;}var bytes = memoryStream.ToArray();string pages = string.Empty;string page = request.Url.Substring(request.Url.IndexOf("page=") + 5, 1);var str = System.Text.Encoding.UTF8.GetString(bytes);JObject obj = (Newtonsoft.Json.Linq.JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(str);List<Record> list = (List<Record>)obj["data"]["finish"]["list"].ToObject(typeof(List<Record>));pages = obj["data"]["finish"]["pages"].ToString();if (list.Count > 0){RecordManager.RecordList.AddRange(list);}if (pages.Equals(page)){string url = RecordManager.GetNextUrl();if (string.IsNullOrEmpty(url)){RecordManager.callback();}else{// 休息5秒,再请求下一篇文章Thread.Sleep(5000);browser.MainFrame.LoadUrl(url);}}else{// 休息5秒,再请求下一页Thread.Sleep(5000);string js = $"document.getElementsByClassName('number')[{int.Parse( page)}].click();";browser.MainFrame.ExecuteJavaScriptAsync(js);}}}

3.3 展示结果

3.4 导出结果

讲结果导出到Excel:

//创建工作薄
var workbook = new HSSFWorkbook();
//创建表
var table = workbook.CreateSheet("data");
int i = 0;
RecordManager.RecordList.ForEach(record => {var row = table.CreateRow(i);var cell = row.CreateCell(0);cell.SetCellValue(record.finishTime);var cell1 = row.CreateCell(1);cell1.SetCellValue(record.userName);var cell2 = row.CreateCell(2);cell2.SetCellValue(record.nickName);i++;
});using (var fs = File.OpenWrite(@"d:/test/1.xls"))
{workbook.Write(fs);   //向打开的这个xls文件中写入mySheet表并保存。Console.WriteLine("生成成功");
}

浏览器(2):自制Chromium内核浏览器,自动统计CSDN社区打卡记录相关推荐

  1. 苹果春季发布会已开启直播;滴滴回应网约车司机被害​;微软Chromium内核浏览器曝光 | 极客头条...

    「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有料的新闻资讯,让所有技术人,时刻紧跟业界潮流. 快讯速知 滴 ...

  2. 谷歌浏览器或者采用Chromium内核浏览器,枫树,金山猎豹等等不显示复选框的解决办法

    谷歌浏览器或者采用Chromium内核浏览器不显示复选框的解决办法,在网上找了好久可以使用下面方法: 在系统任务栏空白处点右键,然后点击属性,然后点击确定,然后刷新一下网页就好啦.  不要问我为什么, ...

  3. Chromium内核浏览器编译记(一)踩坑实录

    转载请注明出处:https://blog.csdn.net/kong_gu_you_lan/article/details/123862868 本文出自 容华谢后的博客 往期回顾: Chromium内 ...

  4. chromium浏览器_全新Edge浏览器上线,Chromium内核,可通过Windows Update更新

    尽管微软的Office和Windows 10势头良好,但为了替换旧的IE浏览器,Microsoft大力开发的Edge却未见起色. 所以为了吸引更多用户使用Edge浏览器,Microsoft决定对其进行 ...

  5. 新版Microsoft Edge Chromium 内核浏览器简体中文 支持 win7 win8 win8.1 win10 macOS ios android...

    近日微软在官网终于放出了基于 Chromium 内核打造的新款 Edge 浏览器,感兴趣的朋友可以"点击此处"进行下载.此前,有关微软将使用 Chrome浏览器内核打造全新 Edg ...

  6. 微软官方宣布:Edge 浏览器将采用 Chromium 内核

    整理自:开源中国社区.cnBeta.COM.前端之巅 https://www.oschina.net/news/102458/goodbye-edgehtml https://www.cnbeta.c ...

  7. chromium内核edge浏览器开启多线程下载

    一般的浏览器自带的下载都是单线程的,速度大多跑不满宽带,比较慢,这里分享一个微软edge浏览器开启多线程下载的方法 附chromium内核edge浏览器下载地址:https://www.microso ...

  8. (笔记)Chrome浏览器基于Chromium内核的浏览器 解决卡顿的方法

    适用于Chrome浏览器和基于Chromium内核构建的浏览器. 文中浏览器:Windows10下基于Chromium内核的Edge浏览器 1.通过网址栏快速重启浏览器 当浏览器页面已经非常卡顿时,我 ...

  9. 双内核浏览器内核切换控制技术

    什么是双核浏览器 双核浏览器支持使用两个或者以上的浏览器引擎来渲染网页,目前绝大多数国产浏览器均为双核甚至多核. 双核到底是什么内核 基于Chromium的Blink/Webkit内核.一般在国产浏览 ...

最新文章

  1. (C++)1029 旧键盘
  2. idea基于hibernate生成的Entitle对象,会忽略外键属性
  3. 一种以动态库的方式使用资源表的方案
  4. Java程序员从笨鸟到菜鸟之(六十七)细谈Spring(一)spring简介
  5. html捉虫游戏,幼儿园体育游戏《小鸡捉虫》教案(精选4篇)
  6. API文档和代码片段管理器:​​​​Dash
  7. 怎么裁剪PDF页面,PDF如何调整页面大小
  8. 图书馆管理系统 Java
  9. 举个栗子!Tableau 技巧(145):实现行级的子类别扩展
  10. pandoc输出中文pdf cmd命令记录
  11. 【MATLAB深度学习工具箱】学习笔记--体脂估计算例再分析:拟合神经网络fitnet里面的函数】
  12. 【前端学习-16】【day06】WebAPI编程/动画函数封装/回调函数/轮播图/自动播放/节流阀/返回顶部/筋斗云/触屏事件/触屏事件对象/
  13. XingGAN for Person Image Generation(人体姿势生成笔记)
  14. 利用先序遍历输入法建立二叉树
  15. 用 python-docx 比对 Word VS Excel 中的表格
  16. 最新shsh备份详细教程(现在只能备份最新的固件)
  17. 博彦科技以太机器人平台亮相世界人工智能大会 赋能企业智慧升级
  18. 写文章时,你是不是也有这4个困惑?
  19. android 多种形式定时轮训工具类
  20. 龙芯1b(LS1B200)使用LVGL7.0.1组件的初次体验

热门文章

  1. 计算机游戏33关,史上最难游戏?这个游戏推出了35年,玩家最多也只能通到33关!...
  2. 字数统计,一个英文字母算一个字,一个汉字算一个字,一个符号算一个字
  3. 第二章 SQL命令参考-REASSIGN OWNED
  4. 《矩阵理论与方法》lambda矩阵及Jordan标准形
  5. 交易总额高达600亿美元?亚马逊、微软和谷歌完成100多笔并购
  6. canvas教程7-炫彩小球
  7. Postgresql-11 根据多字段创建分区表
  8. html5 canvas消除锯齿,HTML5 Canvas 如何取消反锯齿绘图
  9. 禁止页面在浏览器中打开 只能在微信内核浏览器中打开
  10. 从零到一学爬虫-爬取微博热搜示例