.net core HtmlAgilityPack抓取网页并解析内容(dotnet core 爬网页)

说一下我的目的:自己想写一个小程序来分析双色球的走势和开奖结果,然后自己写个算法来计算下一次的开奖,需要历年来所有双色球的开奖记录,那么我就需要抓取历史所有的开奖记录来分析,这将是一个单一网页的抓取与分析,因为需求比较小,所以每次都是全量抓取就好了。

第一步,新建一个控制台程序,然后添加HtmlAgilityPack这个Nuget包

第二步,分析要抓取网站的网页内容,和结构。

第三步,抓取与分析彩票历史开奖结果:

using HtmlAgilityPack;
using System;
using System.Data;
using System.Net;

namespace MyLottery
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("开始访问500彩票网...\r\n");           
            //500彩票网https://datachart.500.com/ssq/history/history.shtml
            var htmlDoc = fromWeb(@"https://datachart.500.com/ssq/history/newinc/history.php?start=00001&end=99999");
            var nodeCollection= htmlDoc.DocumentNode.SelectSingleNode("//tbody[@id='tdata']").ChildNodes;
            var dataTable = new DataTable("双色球开奖历史记录表");
            dataTable.Columns.Add("NUMBER", typeof(string));
            dataTable.Columns.Add("R1", typeof(string));
            dataTable.Columns.Add("R2", typeof(string));
            dataTable.Columns.Add("R3", typeof(string));
            dataTable.Columns.Add("R4", typeof(string));
            dataTable.Columns.Add("R5", typeof(string));
            dataTable.Columns.Add("R6", typeof(string));
            dataTable.Columns.Add("B1", typeof(string));            
            Console.WriteLine("开始抓取历史开奖记录...\r\nNUMBER R1  R2  R3  R4  R5  R6  B1  ");            
            try
            {
                //这里是根据网站网页的结构自己解析
                foreach (var row in nodeCollection)
                {
                    if (row.Name == "tr")
                    {
                        var tr = dataTable.NewRow();
                        int index = 0;
                        foreach (var filed in row.ChildNodes)
                        {
                            if (filed.Name == "td" && index <= 7)
                            {                               
                                tr[index] = filed.InnerText;
                                Console.Write(tr[index] + "  ");
                                index += 1;                               
                            }
                        }
                        dataTable.Rows.Add(tr);
                        Console.Write("\r\n");
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("抓取历史开奖记录失败:\r\n" + ex.Message);
                return;
            }
            Console.WriteLine("抓取历史开奖记录结束。\r\n");
            Console.WriteLine("开始计算...\r\n");
            getNextBall(dataTable);
            Console.ReadLine();
        }
        /// <summary>
        /// 来至本地xml文件
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        static HtmlDocument fromFile(string path)
        {
            var doc = new HtmlDocument();
            doc.Load("Lottery.txt");
            return doc;

        }
        /// <summary>
        /// 来至web网站xml文件
        /// </summary>
        /// <param name="html"></param>
        /// <returns></returns>
        static HtmlDocument fromWeb(string html)
        {
            HtmlWeb web = new HtmlWeb();
            //处理gzip编码不支持
            HtmlWeb.PreRequestHandler handler = delegate (HttpWebRequest request)
            {
                request.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate";
                request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
                request.CookieContainer = new System.Net.CookieContainer();
                return true;
            };
            web.PreRequest += handler;
            var htmlDoc = web.Load(html);
            return htmlDoc;
        }
        /// <summary>
        /// 彩票开奖历史分析
        /// </summary>
        /// <param name="dataTable"></param>
        static void getNextBall(DataTable dataTable)
        {
            //还没实现
        }
    }
}

第四步,运行效果:

有兴趣的朋友可以交流一下双色球的算法哦。

顺便给大家分享一下,我在12年的时候写过一个小程序来分析,那个时候还不会爬网页,在网上找的历史开奖的excel导入,然后每次开奖都是自己录入开奖结果,每期算了5个结果,每期10块钱,买了10期左右,中了5个红色号码,奖金200块。这次在重新想一个算法,看看能不能中个二等奖就好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值