如何利用 C# 爬取 One 持有者返利数据!
去年,10月份写过一篇图文 「One」的投资价值分析,多半年过去了,回头看看当时的判断还是合理的。
投资这种事情需要有自己的策略,更需要理性。任何决策都需要以数据作为判断的基础,哪么是否还继续持有 ONE呢?
首先,看整个市场的环境,从我们每周日发布的数据来看,币圈这个市场还处于不温不火的状态。这个时候,我是不会动的,对 BTC、EOS 还是会采用定投的策略来积累这些数字资产。另外,我也会结合 BTC、ONE 的价格,以及 ONE 的返利数据去计算,如果按照当前的价格买入并持有 ONE,并按照现在的返利,其年化利率是多少,是否满足我的要求,如果满足就继续定投,如果不满足就拿着不动,等待机会。
以上是我的想法,但仅有想法是不够的,需要数据来做支撑。所以今天就带着大家来爬取 One 持有者返利数据,根据这份数据来为自己提供辅助决策。
网页上面我们已经看到了,其对应的网址是:
https://b1.run/one/holder/bonus
查看源代码,我们发现在源码中并不包含这些数据,断定该网站是采用“前后端分离”的方式开发,所以我们需要找到请求 JSON
数据的接口。
通过 chrome
浏览器的开发者工具,我们发现该入口为:
通过不断的加载数据,我们发现,前50条数据的网络请求参数如下:
接下来50条数据的网络请求参数如下:
以此类推,我们发现主要是after:" "
后面的参数不同,找到请求数据的规律就好办了。我们再来看看返回的数据。
从返回的Json
数据,可看到我们需要的信息存储在 edges
集合中,通过 edge
内部的 node
结构变量来存储。
为了快速完成爬取 One 持有者返利数据的任务,我使用了两套开源代码,RestSharp
和 Newtonsoft.Json
。
RestSharp
利用该开源代码可以得到网络请求之后的 Json
数据,其下载地址如下:
https://github.com/restsharp/RestSharp
Newtonsoft.Json
利用该开源代码可以对得到的 Json
数据进行反序列化,得到 C#
对应的类,其下载地址如下:
https://github.com/JamesNK/Newtonsoft.Json
Newtonsoft.Json
这套开源代码,我在 如何利用 C# 爬取「猫眼电影专业版:票房」数据! 以及 如何做一款「桌面版百度翻译」软件? 中使用过,以前网络请求部分都是通过 HttpWebRequest
直接写的,这次偷懒使用了 RestSharp
这套开源代码。
如果大家对这两套开源代码感兴趣,给我留言,我再来写几篇图文介绍它们,下面来看看爬取 One 持有者返利数据的代码。
1. 构造One持有者返利数据的存储结构 JsonOne
public class JsonOne
{
public Data data;
}
public class Data
{
public OneDailyStatisticHistory oneDailyStatisticHistory;
}
public class OneDailyStatisticHistory
{
public OneDailyStatistic oneDailyStatistic;
}
public class OneDailyStatistic
{
public List<Edges> edges;
}
public class Edges
{
public Node node;
}
public class Node
{
/// <summary>
/// ONE 累计解冻 (ONE)
/// </summary>
public double unfrozenOne;
/// <summary>
/// 总手续费折合(BTC)
/// </summary>
public double totalFeeBtc;
/// <summary>
/// 日期
/// </summary>
public string statisticalDate;
/// <summary>
/// 连续持有 1,000,000 ONE 预计返利折合(BTC)
/// </summary>
public double revenue100wBtc;
/// <summary>
/// 全平台各账户持有 ONE 平均值的总和(ONE)
/// </summary>
public double oneSnapshot24Avg;
public double oneAvgPrice;
public override string ToString()
{
return statisticalDate + "," + totalFeeBtc
+ "," + unfrozenOne + ","
+ oneSnapshot24Avg + ","
+ revenue100wBtc;
}
}
2. 构造请求的Body
部分。
private string GetBody(int page)
{
string temp = string.Empty;
if (page == 1)
temp = ",\"after\":\"NTA\"";
else if (page == 2)
temp = ",\"after\":\"MTAw\"";
else if (page == 3)
temp = ",\"after\":\"MTUw\"";
string result = "{\"operationName\":null,\"variables\":{\"first\":50"
+ temp + "},"
+ "\"query\":\"query($first: Int, $after: String, $last: Int, $before: String) "
+ "{\\n oneDailyStatisticHistory {\\n oneDailyStatistic"
+ "(first: $first, after: $after, last: $last, before: $before) "
+ "{\\n edges {\\n cursor\\n node {\\n...OneDailyStatistic\\n"
+ " __typename\\n }\\n __typename\\n }\\n "
+ "pageInfo {\\n endCursor\\n startCursor\\n hasNextPage\\n "
+ "hasPreviousPage\\n __typename\\n }\\n "
+ "__typename\\n }\\n __typename\\n }\\n}\\n\\n"
+ "fragment OneDailyStatistic on OneDailyStatistic "
+ "{\\n oneAvgPrice\\n oneSnapshot24Avg\\n statisticalDate\\n unfrozenOne\\n "
+ "revenue100wBtc\\n totalFeeBtc\\n __typename\\n}\\n\"}";
return result;
}
3. 获取One持有者返利数据列表List<Edges>
public List<Edges> GetOneData(int page)
{
RestClient client = new RestClient("https://b1.run/api/graphql");
RestRequest request = new RestRequest(Method.POST);
request.AddHeader("cache-control", "no-cache");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json",GetBody(page),ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
string str = response.Content;
StringReader sr = new StringReader(str);
JsonTextReader jsonReader = new JsonTextReader(sr);
JsonSerializer serializer = new JsonSerializer();
JsonOne one = serializer.Deserialize<JsonOne>(jsonReader);
List<Edges> lst = one.data.oneDailyStatisticHistory.oneDailyStatistic.edges;
return lst;
}
4. 呈现One持有者返利数据
为了后面的分析,我做了一个 Winform
来呈现爬取的数据,并把这些数据通过折线图可视化。
到此为止,如何利用 C# 爬取 One 持有者返利数据就介绍完了。怎么样是不是很好玩儿!希望我的思路能够给大家以启发。今天就到这里吧!See You!
相关图文