c#抓取网页数据(NBA总决赛如何使用ChromeDriver+HtmlAgilityPack爬取比赛实时比分解析网页)

优采云 发布时间: 2022-03-15 08:06

  c#抓取网页数据(NBA总决赛如何使用ChromeDriver+HtmlAgilityPack爬取比赛实时比分解析网页)

  背景

  最近NBA总决赛吸引了很多球迷,但是因为时差,大家都在打比赛,我们也在努力。

  是的,自己动手,ChromeDriver+HtmlAgilityPack爬取游戏实时比分。

  概述

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

  HtmlAgilityPack 是 .net 下的 HTML 解析库。支持使用 XPath 解析 HTML。这很有道理,为什么呢?因为一些功能强大的浏览器可以直接获取页面上元素的xpath,所以不需要手动编写。它节省了编写正则表达式的大部分时间。当然,在进一步获取的时候,有时需要写正则表达式,但是通过xpath解析后,要匹配的正则表达式的范围很小。此外,通过不使用正则表达式来匹配整个页面源代码,可以提高速度。总而言之,通过这个类库,先通过浏览器获取的xpath获取节点内容,再通过正则表达式匹配需要的内容,既提高了开发速度,又提高了运行效率。

  代码

  下面我们来看看如何使用ChromeDriver+HtmlAgilityPack来抓取游戏的实时比分。

  爬网

   string url = "https://sports.qq.com/kbsweb/game.htm?mid=" + model.TxMatchId;<br /><br /> // string url = "https://kbs.sports.qq.com/kbsweb/game.htm?mid=100000:55370464";<br /> // MatchUpdate model = new MatchUpdate();<br /><br /> var cds = ChromeDriverService.CreateDefaultService();<br /> //是否应隐藏服务的命令提示符窗口<br /> cds.HideCommandPromptWindow = true;<br /><br /> ChromeOptions options = new ChromeOptions();<br /> options.AddArguments("--test-type", "--ignore-certificate-errors");<br /> // 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");<br /> options.AddArgument("enable-automation");<br /><br /> // options.setBinary("C:/Program Files (x86)/Google/Chrome/chrome.exe");<br /><br /> var r = ZhimaHttpProxy.GetProxy(false);<br /> if (r != null)<br /> {<br /> Console.WriteLine(r.Address.Host);<br /> Console.WriteLine(r.Address.Port);<br /><br /> string proxy_Host = r.Address.Host;<br /> int proxy_Post = r.Address.Port;<br /> string Ex_Proxy_Name = "proxy.zip";<br /><br /> options.Proxy = null;<br /> options.AddArguments("--proxy-server=" + proxy_Host + ":" + proxy_Post.ToString());<br /> options.AddExtension(Ex_Proxy_Name);<br /> }<br /><br /> if (IsHideMode)<br /> options.AddArgument("headless");<br /><br /> string dic = System.Environment.CurrentDirectory + "\\cos";<br /><br /> if (IsHideMode)<br /> {<br /> using (IWebDriver driver = new OpenQA.Selenium.Chrome.ChromeDriver(cds, options, TimeSpan.FromSeconds(120)))<br /><br /> {<br /> Excule(driver, url, model);<br /> }<br /> }<br /> else<br /> {<br /> using (IWebDriver driver = new OpenQA.Selenium.Chrome.ChromeDriver(dic, options, TimeSpan.FromSeconds(120)))<br /><br /> {<br /> Excule(driver, url, model);<br /> }<br /> }

  解析网页

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

  最后做一个小弹框,输出数据。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线