c# 爬虫

优采云 发布时间: 2022-05-13 04:18

  c# 爬虫

  背景

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

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

  概述

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

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

  代码实现

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

  抓取网页

   //api<br />                        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 />                        }<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 /><br />

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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线