c# 爬虫 -ChromeDriver+HtmlAgilityPack爬取比赛实时比分

背景

最近NBA总决赛吸引了不少球迷,但是因为时差的关系,人家在比赛,我们在上班,有时候上班又不好意思光明正大的看比赛,那有什么办法 可以光明正大的看又不被发现呢。

有,自己动手丰衣足食,ChromeDriver+HtmlAgilityPack爬取比赛实时比分。

概述

WebDriver 就是对浏览器提供的原生API进行封装,使其成为一套更加面向对象的Selenium WebDriver API。使用这套API可以操控浏览器的开启、关闭,打开网页,操作界面元素,控制Cookie,还可以操作浏览器截屏、安装插件、设置代理、配置证书等。

HtmlAgilityPack是.net下的一个HTML解析类库。支持用XPath来解析HTML。这个意义不小,为什么呢?因为对于页面上的元素的xpath某些强大的浏览器能够直接获取得到,并不需要手动写。节约了大半写正则表达式的时间,当然正则表达式有时候在进一步获取的时候还需要写,但是通过xpath解析之后,正则表达式已经要匹配的范围已经非常小了。而且,不用正则表达式在整个页面源代码上匹配,速度也会有提升。总而言之,通过该类库,先通过浏览器获取到xpath获取到节点内容然后再通过正则表达式匹配到所需要的内容,无论是开发速度,还是运行效率都有提升。

代码实现

下面我们来看下如何使用ChromeDriver+HtmlAgilityPack爬取比赛实时比分。

抓取网页

//apistring url = "https://sports.qq.com/kbsweb/game.htm?mid=" + model.TxMatchId;//   string url = "https://kbs.sports.qq.com/kbsweb/game.htm?mid=100000:55370464";//  MatchUpdate model = new MatchUpdate();var cds = ChromeDriverService.CreateDefaultService();//是否应隐藏服务的命令提示符窗口cds.HideCommandPromptWindow = true;ChromeOptions options = new ChromeOptions();options.AddArguments("--test-type", "--ignore-certificate-errors");//   options.AddArguments("user-agent=mozilla/5.0 (linux; u; android 2.3.3; en-us; sdk build/ gri34) applewebkit/533.1 (khtml, like gecko) version/4.0 mobile safari/533.1");options.AddArgument("enable-automation");//  options.setBinary("C:/Program Files (x86)/Google/Chrome/chrome.exe");var r = ZhimaHttpProxy.GetProxy(false);if (r != null){Console.WriteLine(r.Address.Host);Console.WriteLine(r.Address.Port);string proxy_Host = r.Address.Host;int proxy_Post = r.Address.Port;string Ex_Proxy_Name = "proxy.zip";options.Proxy = null;options.AddArguments("--proxy-server=" + proxy_Host + ":" + proxy_Post.ToString());options.AddExtension(Ex_Proxy_Name);}if (IsHideMode)options.AddArgument("headless");string dic = System.Environment.CurrentDirectory + "\\cos";if (IsHideMode){using (IWebDriver driver = new OpenQA.Selenium.Chrome.ChromeDriver(cds, options, TimeSpan.FromSeconds(120))){Excule(driver, url, model);}}else{using (IWebDriver driver = new OpenQA.Selenium.Chrome.ChromeDriver(dic, options, TimeSpan.FromSeconds(120))){Excule(driver, url, model);}}

解析网页

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();doc.LoadHtml(Helper.ReadTxt(System.Environment.CurrentDirectory + "\\PageSource\\" + info.TxMatchId.Replace(":", "_") + ".txt"));int? HomeTeamScore = null;int? GuestTeamScore = null;List<MatchScore> MatchScoreList = new List<MatchScore>();HtmlNode titleNodes = doc.DocumentNode.SelectSingleNode("//div[@class='inner']");var titleNodes2 = doc.DocumentNode.SelectSingleNode("//div[@class='content-wrapper']");if (titleNodes2 != null)//  if (false){Console.WriteLine(titleNodes2.InnerText);var host = titleNodes2.SelectSingleNode("//div[@class='team-goal host']");var arr = host.InnerText.Replace("\r\n", "|");var arrs = arr.Split('|');arrs = arrs.Where(o => !string.IsNullOrWhiteSpace(o)).Select(o => o.Split('(')[0].Trim()).ToArray();HomeTeamScore = int.Parse(arrs[1]);MatchScoreList.Add(new MatchScore() { TeamName = arrs[0], TeamScore = HomeTeamScore });var guest = titleNodes2.SelectSingleNode("//div[@class='team-goal guest']");var arr2 = guest.InnerText.Replace("\r\n", "|");var arrs2 = arr2.Split('|');arrs2 = arrs2.Where(o => !string.IsNullOrWhiteSpace(o)).Select(o => o.Split('(')[0].Trim()).ToArray();GuestTeamScore = int.Parse(arrs2[1]);MatchScoreList.Add(new MatchScore() { TeamName = arrs2[0], TeamScore = GuestTeamScore });}else{var a = titleNodes.SelectNodes("//a[@data-target='teamName']");var score = titleNodes.SelectNodes("//span[@class='score']");if (score != null){int i = 0;foreach (var item in score){SetText("\r\n" + item.InnerText?.Trim());if (i == 0){HomeTeamScore = Convert.ToInt32(item.InnerText?.Trim());}if (i == 1){GuestTeamScore = Convert.ToInt32(item.InnerText?.Trim());}i++;}}if (a != null){int i = 0;foreach (var item in a){SetText("\r\n" + item.InnerText?.Trim());if (i == 0){MatchScoreList.Add(new MatchScore() { TeamName = item.InnerText?.Split('(')[0].Trim(), TeamScore = HomeTeamScore });}if (i == 1){MatchScoreList.Add(new MatchScore() { TeamName = item.InnerText?.Split('(')[0].Trim(), TeamScore = GuestTeamScore });}i++;}}}string statusstr = "";var t = titleNodes.SelectSingleNode("//div[@class='datetime-live-desc']");SetText("\r\n" + t.InnerText?.Trim());statusstr = t.InnerText?.Trim();var Status = info.Status;if (!string.IsNullOrWhiteSpace(statusstr) && statusstr.Contains("已结束")){Status = MatchStatus.End;}

最后再搞个小弹框,把数据输出即可。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codevs2157 配对

题目描述 Description给出2个序列A{a[1]&#xff0c;a[2]&#xff0c;…&#xff0c;a[n]}&#xff0c;B{b[1]&#xff0c;b[2]&#xff0c;…&#xff0c;b[n]}&#xff0c;从A、B中各选出n个元素进行一一配对&#xff08;可以不按照原来在序列中的顺序&#xff09;&#xff0…

UITableView的优化原理

2019独角兽企业重金招聘Python工程师标准>>> 当我们下啦一个 UITableView时&#xff0c;如果没有做优化&#xff0c;只是简单的实现功能代码如下&#xff0c;这样当我们有上百条tableviewcell的时候&#xff0c;我们滑动的非常快时会非常费内存&#xff0c;当然苹果…

深入浅出Mybatis系列(一)---Mybatis入门[转]

最近两年 springmvc mybatis 的在这种搭配还是蛮火的&#xff0c;楼主我呢&#xff0c;也从来没真正去接触过mybatis, 趁近日得闲&#xff0c; 就去学习一下mybatis吧。 本次拟根据自己的学习进度&#xff0c;做一次关于mybatis 的一系列教程&#xff0c; 记录自己的学习历程&…

字符串之括号的有效性

题目: 给定一个字符串str,判断是不是整体有效的括号字符串 举例: str = "()" return true; stre = "()()" return true; str = "())" return false; str = "()a()" return false; 代码: package com.chenyu.string.cn;public class…

python为text添加滚动条_在Tkinter中向一组小部件添加滚动条

概述您只能将滚动条与一些小部件关联起来&#xff0c;根小部件和Frame不是那组小部件的一部分。最常见的解决方案是创建一个画布小部件&#xff0c;并将滚动条与该小部件关联起来。然后&#xff0c;将包含标签小部件的框架嵌入到画布中。确定框架的宽度/高度&#xff0c;并将其…

C# 图像模板匹配并标注

01—需求这个是粉丝在我的技术群提的一个需求1、 模板匹配 &#xff1a;功能&#xff1a;&#xff08;1&#xff09;在一张大图像中&#xff0c;选取一小块区域作为模板&#xff08;2&#xff09;可在大图像中匹配到模板图像和位置。模板匹配是图像处理中最基本、最常用的匹配方…

深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap[转]

上篇《深入浅出Mybatis系列&#xff08;七&#xff09;---mapper映射文件配置之insert、update、delete》介绍了insert、update、delete的用法&#xff0c;本篇将介绍select、resultMap的用法。select无疑是我们最常用&#xff0c;也是最复杂的&#xff0c;mybatis通过resultMa…

李洪强经典面试题146-网络

李洪强经典面试题146-网络 网络 http请求方式&#xff1f; 通常&#xff0c;HTTP的请求方式有3种&#xff0c;分别是&#xff1a;POST、GET、HEAD。POST和GET方法是用于数据发送的。 POST&#xff1a;它将要发送的数据单独放在一个流中进行发送&#xff0c;而不是附加在URL地址…

北大保送、硕博连读!《西游记》红孩儿扮演者现成中科院博士!

全世界只有3.14 % 的人关注了爆炸吧知识本文转自&#xff1a;募格学术86版《西游记》可以说是很多人的记忆&#xff0c;男女老幼几乎都看过这个版本&#xff0c;虽然已经过去三十多年&#xff0c;但如今依旧是经典无法超越之作。看过86版《西游记》的小伙伴应该都还记得里面牛魔…

Android插件化开发之运行未安装apk的activity

1、介绍 我们知道PathClassLoader是一个应用的默认加载器(而且他只能加载data/app/xxx.apk的文件)&#xff0c;但是我们加载插件一般使用DexClassLoader加载器&#xff0c;所以这里就有问题了&#xff0c;其实如果对于开始的时候&#xff0c;每个人都会认为很简单&#xff0c;…

理解UI线程——SWT, Android, 和Swing的UI机理

2019独角兽企业重金招聘Python工程师标准>>> 在做GUI的时候, 无论是SWT, AWT, Swing 还是Android, 都需要面对UI线程的问题, UI线程往往会被单独的提出来单独对待, 试着问自己, 当GUI启动的时候, 后台会运行几个线程? 比如 1. SWT 从Main函数启动 2. Swing 从Ma…

python自动填写小程序表单_新年好!教大家用Python写一个自动回复拜年信息的小程序!...

原标题&#xff1a;新年好&#xff01;教大家用Python写一个自动回复拜年信息的小程序&#xff01;过年期间&#xff0c;想必大家都收到很多拜年信息吧&#xff01;有没有也被拜年短信(大部分是群发)搞得很焦虑&#xff1f;不回复似乎显得很没有礼貌&#xff0c;一一回复又累心…

C#多线程开发-并发集合中的ConcurrentQueue

前言大家好&#xff0c;我是阿辉。上一篇博文简单介绍了C#中支持并发的数据字典&#xff0c;简单举例说明比较了常规集合与ConcurrentDictionary的读写速度。下来简单介绍其中一个线程安全队列ConcurrentQueue;ConcurrentQueue队列我们不陌生&#xff0c;在数据结构这门课中就有…

HDU 5141

这个题 LIS 并查集的思想 链式前向星 要求找s(i,j)使i j 能有最长的LIS 。。。 做法是枚举每一个j 即终点 算 起点 的可能 无力吐槽了 bc 的时候写错了一个地方 导致TLE 后来幡然醒悟了 改了就a了 不想说什么了 直接上代码 #include <cstdio> #include <…

MySQL存储过程相互调用

什么都不说了上代码&#xff1a; 方式一&#xff1a; 第一个存储过程&#xff1a;test1,参数如下&#xff1a;IN user_name VARCHAR(50),OUT uid bigint(20) BEGIN#Routine body goes here...DECLARE u_id BIGINT(20) DEFAULT 11;SELECT user_id INTO uid FROM tbl_useralias …

一个人动情之后的表现......

1 卖家能有什么坏心思呢&#xff08;via.城与橙与澄&#xff0c;侵删&#xff09;▼2 严重怀疑传了答案▼3 别说我还真没留意到&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 领导说“辛苦了”&#xff0c;你要怎么回答▼5 哦吼&#xff08;素材来源网络&#…

Android之推荐看的Android源码

推荐阅读的源码 AOSP项目这么庞大,就算是Framework部分也有够看上一阵子的,所以推荐从常用的看起,由浅及深,同时向横向和纵向深入阅读。 开始 Handler-Message-Looper Handler被称为“异步提交器”,是Android开发入门教程必定谈及的东西,这也是Activity等组件的工作机…

线性代数第五版吉尔伯特课后答_线性代数同济第五版第六章课后习题答案!

搜集 | 整理 | 测试 | 小愉免责声明&#xff1a;以下资源或软件均来自互联网&#xff0c;仅供学习和交流使用&#xff0c;如有侵权请联系删除&#xff0c;请勿用于商业和非法途径等&#xff0c;如有法律纠纷与本人无关&#xff01;本文未经允许&#xff0c;不得转载&#xff0…

2021,我的输入输出

前言2021年&#xff0c;我到底进行了哪些输入&#xff0c;又是如何输出的&#xff0c;借由这篇文章回顾一下。新技术.NET技术日新月异&#xff0c;今年我也尝试学习了其中一部分。BlazorBlazor允许我们使用C#而不是JavaScript构建交互式客户端Web应用程序&#xff0c;对于后端出…