说一下我的目的:自己想写一个小程序来分析双色球的走势和开奖结果,然后自己写个算法来计算下一次的开奖,需要历年来所有双色球的开奖记录,那么我就需要抓取历史所有的开奖记录来分析,这将是一个单一网页的抓取与分析,因为需求比较小,所以每次都是全量抓取就好了。
第一步,新建一个控制台程序,然后添加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块。这次在重新想一个算法,看看能不能中个二等奖就好了。