c# 爬虫 -ChromeDriver+HtmlAgilityPack爬取比赛实时比分
背景
最近NBA總決賽吸引了不少球迷,但是因?yàn)闀r(shí)差的關(guān)系,人家在比賽,我們?cè)谏习?#xff0c;有時(shí)候上班又不好意思光明正大的看比賽,那有什么辦法 可以光明正大的看又不被發(fā)現(xiàn)呢。
有,自己動(dòng)手豐衣足食,ChromeDriver+HtmlAgilityPack爬取比賽實(shí)時(shí)比分。
概述
WebDriver 就是對(duì)瀏覽器提供的原生API進(jìn)行封裝,使其成為一套更加面向?qū)ο蟮腟elenium WebDriver API。使用這套API可以操控瀏覽器的開啟、關(guān)閉,打開網(wǎng)頁,操作界面元素,控制Cookie,還可以操作瀏覽器截屏、安裝插件、設(shè)置代理、配置證書等。
HtmlAgilityPack是.net下的一個(gè)HTML解析類庫。支持用XPath來解析HTML。這個(gè)意義不小,為什么呢?因?yàn)閷?duì)于頁面上的元素的xpath某些強(qiáng)大的瀏覽器能夠直接獲取得到,并不需要手動(dòng)寫。節(jié)約了大半寫正則表達(dá)式的時(shí)間,當(dāng)然正則表達(dá)式有時(shí)候在進(jìn)一步獲取的時(shí)候還需要寫,但是通過xpath解析之后,正則表達(dá)式已經(jīng)要匹配的范圍已經(jīng)非常小了。而且,不用正則表達(dá)式在整個(gè)頁面源代碼上匹配,速度也會(huì)有提升。總而言之,通過該類庫,先通過瀏覽器獲取到xpath獲取到節(jié)點(diǎn)內(nèi)容然后再通過正則表達(dá)式匹配到所需要的內(nèi)容,無論是開發(fā)速度,還是運(yùn)行效率都有提升。
代碼實(shí)現(xiàn)
下面我們來看下如何使用ChromeDriver+HtmlAgilityPack爬取比賽實(shí)時(shí)比分。
抓取網(wǎng)頁
//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();//是否應(yīng)隱藏服務(wù)的命令提示符窗口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);}}解析網(wǎng)頁
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("已結(jié)束")){Status?=?MatchStatus.End;}最后再搞個(gè)小彈框,把數(shù)據(jù)輸出即可。
總結(jié)
以上是生活随笔為你收集整理的c# 爬虫 -ChromeDriver+HtmlAgilityPack爬取比赛实时比分的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【翻译】C#表达式中的动态查询
- 下一篇: C# 图像模板匹配并标注