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;}最后再搞個小彈框,把數據輸出即可。
總結
以上是生活随笔為你收集整理的c# 爬虫 -ChromeDriver+HtmlAgilityPack爬取比赛实时比分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【翻译】C#表达式中的动态查询
- 下一篇: c# char unsigned_dll