使用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++;
}