如何利用 C# 爬取 One 持有者返利数据!

去年,10月份写过一篇图文 「One」的投资价值分析,多半年过去了,回头看看当时的判断还是合理的。

如何利用 C# 爬取 One 持有者返利数据!

投资这种事情需要有自己的策略,更需要理性。任何决策都需要以数据作为判断的基础,哪么是否还继续持有 ONE呢?

首先,看整个市场的环境,从我们每周日发布的数据来看,币圈这个市场还处于不温不火的状态。这个时候,我是不会动的,对 BTC、EOS 还是会采用定投的策略来积累这些数字资产。另外,我也会结合 BTC、ONE 的价格,以及 ONE 的返利数据去计算,如果按照当前的价格买入并持有 ONE,并按照现在的返利,其年化利率是多少,是否满足我的要求,如果满足就继续定投,如果不满足就拿着不动,等待机会。

如何利用 C# 爬取 One 持有者返利数据!


以上是我的想法,但仅有想法是不够的,需要数据来做支撑。所以今天就带着大家来爬取 One 持有者返利数据,根据这份数据来为自己提供辅助决策。

网页上面我们已经看到了,其对应的网址是:

https://b1.run/one/holder/bonus

查看源代码,我们发现在源码中并不包含这些数据,断定该网站是采用“前后端分离”的方式开发,所以我们需要找到请求 JSON 数据的接口。

通过 chrome 浏览器的开发者工具,我们发现该入口为:

https://b1.run/api/graphql

如何利用 C# 爬取 One 持有者返利数据!

通过不断的加载数据,我们发现,前50条数据的网络请求参数如下:

如何利用 C# 爬取 One 持有者返利数据!

接下来50条数据的网络请求参数如下:

如何利用 C# 爬取 One 持有者返利数据!

以此类推,我们发现主要是after:" "后面的参数不同,找到请求数据的规律就好办了。我们再来看看返回的数据。

如何利用 C# 爬取 One 持有者返利数据!

从返回的Json数据,可看到我们需要的信息存储在 edges 集合中,通过 edge 内部的 node 结构变量来存储。


为了快速完成爬取 One 持有者返利数据的任务,我使用了两套开源代码,RestSharpNewtonsoft.Json

RestSharp

利用该开源代码可以得到网络请求之后的 Json 数据,其下载地址如下:

https://github.com/restsharp/RestSharp

如何利用 C# 爬取 One 持有者返利数据!

Newtonsoft.Json

利用该开源代码可以对得到的 Json 数据进行反序列化,得到 C# 对应的类,其下载地址如下:

https://github.com/JamesNK/Newtonsoft.Json

如何利用 C# 爬取 One 持有者返利数据!


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 持有者返利数据!

如何利用 C# 爬取 One 持有者返利数据!

如何利用 C# 爬取 One 持有者返利数据!

如何利用 C# 爬取 One 持有者返利数据!

如何利用 C# 爬取 One 持有者返利数据!


到此为止,如何利用 C# 爬取 One 持有者返利数据就介绍完了。怎么样是不是很好玩儿!希望我的思路能够给大家以启发。今天就到这里吧!See You!


相关图文