WebView2 通过 PuppeteerSharp 实现爬取 王者 壁纸 (案例版)

王者壁纸自动化获取逻辑分析

其实它的逻辑很简单, 就是王者的官网,打开后,在右下角就看到了皮肤页面部分。

这个时候,点击更多,就会打开全部英雄详情的页面。

这个时候,单点任意一个英雄,就会新开一个页面,这个英雄自己的页面,可以看到具体的皮肤信息了。

这里可以看到有6个皮肤,那么,到这里我就可以获取这6个皮肤作为高清王者的皮肤了。

那么,让程序自动化操作,并把这些信息处理保存好,就是我们要做到的事情。

新建一个WPF项目

新建一个 WPF 项目,要添加 Nuget 包

Install-Package Microsoft.Web.WebView2 -Version 1.0.1293.44
Install-Package PuppeteerSharp -Version 7.1.0
Install-Package HtmlAgilityPack -Version 1.11.43

MainWindow.xaml

界面大致样子和布局

<DockPanel><StackPanel DockPanel.Dock="Top" Orientation="Horizontal" HorizontalAlignment="Right"><Label Name = "loginfo" Content="未采集"/><Button Name="start" DockPanel.Dock="Right" Width="150" Content="开始采集" Click="start_Click"/></StackPanel><wpf:WebView2 Name = "webView2"/>
</DockPanel>

右上角一个提示信息,一个采集的按钮,布局很是简单

如何启用 PuppeteerSharp

其实都是基于谷歌的DevTools协议来的,所以,只要WebView2开启了Debugging端口即可。

var result = await CoreWebView2Environment.CreateAsync(null, System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "cache"),new CoreWebView2EnvironmentOptions($"--remote-debugging-port={Port}"));
await webView2.EnsureCoreWebView2Async(result);

通过WebVeiw2的游览器启动参数 : --remote-debugging-port=6666 来开启DevTools协议的支持。

PuppeteerSharpHelper

public class PuppeteerSharpHelper
{/// <summary>/// 获取游览器对象/// </summary>public static Task<Browser> GetBrowser(int port, int height, int width){return Puppeteer.ConnectAsync(new ConnectOptions { DefaultViewport = new ViewPortOptions() { Height = height, Width = width }, BrowserWSEndpoint = WSEndpointResponse.GetWebSocketDebuggerUrl(port) });}internal class WSEndpointResponse{public string WebSocketDebuggerUrl { get; set; }public static string GetWebSocketDebuggerUrl(int port){string data;using (var client = new HttpClient()){data = client.GetStringAsync($"http://127.0.0.1:{port}/json/version").Result;}return JsonConvert.DeserializeObject<WSEndpointResponse>(data).WebSocketDebuggerUrl;}}
}

所用到的王者实体信息

/// <summary>
/// 英雄的信息
/// </summary>
public class HeroInfo
{public string Name { get; set; }public string Url { get; set; }public string TargetUrl(){return $"https://pvp.qq.com/web201605/{Url}";}public List<HeroSkin> HeroSkins { get; set; }
}
/// <summary>
/// 英雄皮肤
/// </summary>
public class HeroSkin
{public HeroSkin(string name, string url){this.Name = name;this.Url = "https:" + url;}public string Name { get; set; }public string Url { get; set; }
}

RPA的核心代码

private async void start_Click(object sender, RoutedEventArgs e)
{var herolistPath = await Currentpage.EvaluateExpressionAsync<string>("document.querySelector('body > div.wrapper > div.main > div:nth-child(3) > div.skin_center.fl > div.item_header > a').href");await Currentpage.GoToAsync(herolistPath, WaitUntilNavigation.DOMContentLoaded);loginfo.Content = "开始获取内容";var herolist = await Currentpage.EvaluateExpressionAsync<string>("document.querySelector('body > div.wrapper > div > div > div.herolist-box > div.herolist-content > ul').innerHTML");var heros = GetHeroInfos(herolist);loginfo.Content = $"获取全部英雄信息共:{heros.Count}条";foreach (var item in heros){await Currentpage.GoToAsync(item.TargetUrl(), WaitUntilNavigation.DOMContentLoaded);Thread.Sleep(100);var skins = await Currentpage.EvaluateExpressionAsync<string>("document.querySelector('body > div.wrapper > div.zk-con1.zk-con > div > div > div.pic-pf > ul').innerHTML");item.HeroSkins = GetHeroSkins(skins);}loginfo.Content = "开始下载资源";var count = 0;//开始执行下载foreach (var item in heros){count++;loginfo.Content = $"资源一共:{heros.Count}条,正在下载第{count}条,还剩下:{heros.Count - count}";var HearoPath = System.IO.Path.Combine(ImagesPath, item.Name);if (!System.IO.Directory.Exists(HearoPath)){System.IO.Directory.CreateDirectory(HearoPath);}foreach (var skin in item.HeroSkins){await WebHelper.DownloadFile(skin.Url, System.IO.Path.Combine(HearoPath, $"{skin.Name}.jpg"));}}loginfo.Content = "获取完毕,等待查看!";
}

效果如下:

需要点击获取按钮,就会执行自动化获取操作,然后把获取的内容存储到当前项目bin目录images目录下。

下面就是下载完后的效果。


整整齐齐,很完整,都是我喜欢的英雄和买不起的皮肤。


而且,获取到的包含了皮肤的名称

总结

基于WebView2,技术又深一层次的展开,一个好的技术,必定用到合适的场景上才是最合适的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1379855.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序短视频去水印,王者查战力,手持弹幕,获取头像壁纸,工具箱源码

短视频在线去水印,无任何广告 王者荣耀查荣耀战力已更新 新增加查看历史上的今天 新增手持弹幕&#xff0c;修复剪辑视频不能保存问题。 新增壁纸&#xff0c;头像&#xff0c;网址转二维码。 【微信小程序】&#xff1a;好野工具 【小程序版本】&#xff1a;5.1.1 【小…

王者壁纸批量爬取

语言&#xff1a;python json格式网站&#xff1a; 爬取网址&#xff1a;王者荣耀壁纸下载-王者荣耀官方网站-腾讯游戏 思路分析&#xff1a; 分析下一页&#xff0c;发现下一页之后是在当前页面的局部重新加载 当然排除可以直接爬取目标url获取当前页面的信息以及后面的所…

C语言案例 阶乘求和-12

题目&#xff1a;求1 2&#xff01;3&#xff01; … 20&#xff01;的和。 程序分析 阶乘相关原理&#xff1a;一个正整数的阶乘是所有小于及等于该数的正整数的积&#xff0c;并且0的阶乘为1。自然数n的阶乘写作n!&#xff0c;任何大于1的自然数n阶乘表示方法&#xff1a;…

5大电脑软件推荐!每一款都是精心挑选,良心推荐!

说起实用的电脑软件&#xff0c;我想你看对地方了&#xff0c;世上最棒最实用的电脑软件推荐&#xff01;每一款都十足良心&#xff01; 是时候表演真正的技术了&#xff01; 1.PotPlayer 超受欢迎的播放器之一。这款播放器可能会成为你的菜&#xff0c;内存占用低并且不卡&a…

Windows上有哪些推荐的笔记软件?

说实话&#xff0c;windows上的优秀的笔记软件没有ipad上多&#xff0c;在ipad上的notability、goodnotes、marginnote等优秀的笔记软件&#xff0c;在windows上很少有可替代的产品&#xff0c;不过在windows上也有一些比较优质的笔记软件&#xff0c;对于学生来说&#xff0c;…

3款强大到离谱的电脑软件,个个提效神器,从此远离加班

推荐3款让你偷懒&#xff0c;让你上头的提效电脑软件&#xff0c;个个功能强大&#xff0c;让你远离加班&#xff01; 很多几个小时才能做好的事情&#xff0c;用上它们&#xff0c;只需要5分钟就行&#xff01;&#xff01; 1、Quicker —— 桌面快速启动工具 Quicker鼠标效…

这几款好用的电脑软件推荐给你

软件一&#xff1a;potplayer PotPlayer是一款免费的媒体播放器&#xff0c;它支持多种格式的音频和视频文件。它的界面简洁而且易于使用&#xff0c;让用户可以轻松地播放各种媒体文件。以下是PotPlayer的一些主要功能&#xff1a; 支持多种格式&#xff1a;PotPlayer支持多…

5款超级无敌好用的电脑软件 建议收藏!

1.Quicker Quicker绝对要吹爆&#xff0c;Quicker可以给常用的软件和操作建立捷径&#xff0c;鼠标中键调出快捷面板使用&#xff0c;将常用操作放在手边&#xff0c;绝对的生产力工具&#xff0c;节省大量时间。 支持自定义动作&#xff0c;内置丰富的动作库&#xff0c;可…

电脑推荐软件

个人推荐电脑软件&#xff0c;如需自取。附下载链接&#xff1a; 电脑推荐软件: https://url46.ctfile.com/d/42812846-54181981-4b3214?p7872 (访问密码: 7872) 1、Everything 文件搜索器&#xff0c;快速找出电脑里面所有文件&#xff0c;支持关键字查找。 下载链接&#xf…

3.1 Spring MVC概述

1. MVC概念 MVC是一种编程思想&#xff0c;它将应用分为模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;、控制器&#xff08;Controller&#xff09;三个层次&#xff0c;这三部分以最低的耦合进行协同工作&#xff0c;从而提高应用的可扩展性及可维护…

Vue生命周期函数(详解)

目录 生命周期图 生命周期函数 beforeCreate和created的区别 beforeCreate创建前应用场景 created创建后应用场景 beforeMount和mounted的区别 beforeMount挂载前应用场景 mounted挂载后应用场景 beforeUpdate和updated的区别 beforeUpdate更新前应用场景 updated更新后应用…

数据通信——VRRP

引言 之前把实验做了&#xff0c;结果发现我好像没有写过VRRP的文章&#xff0c;连笔记都没记过。可能是因为对STP的记忆&#xff0c;导致现在都没忘太多。 一&#xff0c;什么是VRRP VRRP全名是虚拟路由冗余协议&#xff0c;虚拟路由&#xff0c;看名字就知道这是运行在三层接…

【前端 | CSS】滚动到底部加载,滚动监听、懒加载

背景 在日常开发过程中&#xff0c;我们会遇到图片懒加载的功能&#xff0c;基本原理是&#xff0c;滚动条滚动到底部后再次获取数据进行渲染。 那怎么判断滚动条是否滚动到底部呢&#xff1f;滚动条滚动到底部触发时间的时机和方法又该怎样定义&#xff1f; 针对以上问题我…

【瑞吉外卖】Linux学习

Linux常用命令 Linux命令初体验 Linux的命令都是由一个或几个单词的缩写构成的 命令对应英文作用lslist查看当前目录下的内容pwdprint work directory查看当前所在目录cd [目录名]change directory切换目录touch [文件名]touch如果文件不存在&#xff0c;新建文件mkdir [目录…

HCIA---动态路由---RIP协议

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 前言 一.动态路由 二.动态路由协议分类 IGP&#xff1a;内部网关协议 EGP:外部网关协议 三.RIP协议概述 RIP版本分类&#xff1a; RIP三要素&#xff1a; 思维…

JSP的文件扩展名必须是.jsp吗

并不是 打开Tomcat目录下conf目录下的web.xml 也就是说,映射路径为xxx.jsp或者xxx.jspx就会访问jsp 可以修改

C语言每日一题:16:数对。

思路一&#xff1a;基本思路 1.x,y均不大于n&#xff0c;就是小于等于n。 2.x%y大于等于k。 3.一般的思路使用双for循环去遍历每一对数。 代码实现&#xff1a; #include <stdio.h> int main() {int n 0;int k 0;//输入scanf("%d%d", &n, &k);int x…

将exe应用打包成安装包

文章目录 前言一、打包exe文件1.安装Inno setup2.打包成安装包 二、测试安装包 前言 使用Inno setup应用来打包exe文件成安装包 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、打包exe文件 1.安装Inno setup 官网网址&#xff1a;https://jrsoft…

EasyExcel下载xls、xlsx 出现文件格式与扩展名不匹配

是ContentType类型错误&#xff0c;如果需要导出xlsx就使用 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 如果使用xls就设置为&#xff1a;response.setContentType("application/vnd.ms-excel;charsetUT…