使用c#建立奥运奖牌榜

9 篇文章 1 订阅
3 篇文章 0 订阅

使用c#建立奥运奖牌榜,效果如下图,里面的部分方法经常用到,故记录一下,以便查阅

一、获取奖牌数据

腾讯给我们提供了一个奥运奖牌榜:

https://2020.qq.com/medal.html

我们需要从这个页面爬取数据
在这里插入图片描述
一般来说,这样的页面,都有单独的数据来源页供我们使用,所以我们需要找出这个数据地址。

打开浏览器调试工具F12,找到network一项,刷新页面,即可看到页面数据信息,我们向下慢慢寻找过去。
在这里插入图片描述
寻找的时候,点击一项,即可在右边看到文件内容,我们猜测,页面应该是通过JSON传递数据的,而这个JS里面都是代码,并没有有和奥运相关的内容,显然不是我们需要的数据。
在这里插入图片描述

找到一项的时候,很可疑,从右边明显能看到一些奥运数据,并且通过页面显示形式,可以确定这是一个JSON数据。
在这里插入图片描述

将他展开,能看到,选项中,罗列了所有的信息,正是网页列表中的榜单信息,数据里面包括,总牌数,金银铜数量,国家名称,以及国旗图片等等。
在这里插入图片描述

切换到详细信息可以看到,这是一个get请求,地址为:

https://app.sports.qq.com/tokyoOly/medalsList?from=h5&medalsType=all&callback=jQuery111308660282144735172_1627806149492&_=1627806149493

尝试去除里面的参数,访问没有问题

https://app.sports.qq.com/tokyoOly/medalsList

图片

说明这个地址,就是我们要的数据地址,直接打开,会直接得到一个JSON

在这里插入图片描述

将内容全部复制下来,放到JSON解析工具里面解析,可以很清晰的看到字段key,我们后面可以通过解析JSON的方式来获取相关的数据。

在这里插入图片描述

现在,就很明了了,我们只需要,爬取这个网页->获得奖牌JSON数据->解析数据->显示到网页

就能制作出我们想要的榜单了。

二,写程式

get方式获取JSON数据
使用GetHttpResponse传参获取JSON数据res,如下。

string url = "https://app.sports.qq.com/tokyoOly/medalsList"; 
int statusCode = 0;
string res = GetHttpResponse(url, 6000, out statusCode);
public static string GetHttpResponse(string url, int Timeout, out int statusCode)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "GET";
            request.ContentType = "text/html;charset=UTF-8";
            request.UserAgent = null;
            request.Timeout = Timeout;

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream myResponseStream = response.GetResponseStream();
            statusCode = (int)response.StatusCode;
            StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
            string retString = myStreamReader.ReadToEnd();
            myStreamReader.Close();
            myResponseStream.Close();

            return retString;
        }

观察已有的json数据组织方式(上面的JSON Format 1.0软件有解析组织,没有这个软件的话可以百度下载,也可以在这下载我有上传),根据字符串的数据结构创建类

public class Data
        {
            public string bronze { get; set; }
            public string gold { get; set; }
            public string nocBronzeRank { get; set; }
            public string nocGoldRank { get; set; }
            public string nocid { get; set; }
            public string nocLogo { get; set; }
            public string nocName { get; set; }
            public string nocRank { get; set; }
            public string nocShortName { get; set; }
            public string nocSilverRank { get; set; }
            public string nocUrl { get; set; }
            public string silver { get; set; }
            public string total { get; set; }

        }

反序列化json数组

JObject jo = (JObject)JsonConvert.DeserializeObject(res);
string country_num = jo["data"]["data"]["total"].ToString(); //获取国家数量
List<Data> jobInfoList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Data>>(country_num);

填充tabale就可以显示在网页了,效果如下图,也可以直接打印出来都是可以的。

 // 設置表格列屬性
            table.Columns.Add("排名", 100, ALIGN.Left);
            table.Columns.Add("國家", 100, ALIGN.Left);
            table.Columns.Add("金牌", 50, ALIGN.Left);
            table.Columns.Add("銀牌", 50, ALIGN.Left);
            table.Columns.Add("銅牌", 50, ALIGN.Left);
            table.Columns.Add("總獎牌", 50, ALIGN.Left);

            // 設置表格行數據
            int nNum = 1; //排名序号
            foreach (Data jobInfo in jobInfoList)
            {
                int c = 0;
                GvNet.HtmlTable.Row row = table.NewRow();
                row[c++].Value = nNum.ToString();
                row[c++].Value = "<img loading=\"lazy\" src=\"" + jobInfo.nocLogo + "\" alt=\"Smiley face\" width=\"20\" >" + jobInfo.nocName; 
                row[c++].Value = jobInfo.gold;
                row[c++].Value = jobInfo.silver;
                row[c++].Value = jobInfo.bronze;
                row[c++].Value = jobInfo.total;
                table.Rows.Add(row);
                nNum++;
            }

千里之行始于足下,愿共勉之!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值