美文网首页
如何利用 C# 爬取Gate.io交易所的公告!

如何利用 C# 爬取Gate.io交易所的公告!

作者: 老马的程序人生 | 来源:发表于2019-03-28 13:47 被阅读0次

    对于大部分程序员来说,都希望自己或多或少拥有一些比特币(BTC)。获取 BTC 的途径除了挖矿计算 Hash 值之外,就是去交易所购买了。

    由于 BTC 的价格波动非常剧烈,入手 BTC 的时机就显得尤为关键。在交易所搞活动时入手,往往可以降低自己的交易成本。而程序员那里有时间看交易所的公告呢,做个爬虫来盯交易所的公告倒是一个不错的办法。


    今天,我就带着大家用 C# 来爬取Gate.io交易所的公告。

    首先,我们查看一下所要爬取数据的网页。

    公告第1页的网址为:

    https://gateio.news/articlelist/ann/0

    公告第1页

    公告第2页的网址为:

    https://gateio.news/articlelist/ann/1

    公告第3页的网址为:

    https://gateio.news/articlelist/ann/2

    可见所要爬取数据的网页地址,其变换的部分只有最后的页码数字。只要我们把这个数字作为参数传入到爬取函数中,即可爬取对应页面的数据。

    其次,我们来看一下网页的源码,以第1页为例,其它的以此类推就好。

    源代码

    从该源码中我们发现,虽然页面显示为中文,但源码部分为英文。如果要获取中文的HTML DOM TREE 需要在网络请求头的 Cookie 中加入相应的说明 lang=cn,具体可见后面的 GetHtmlDocument 方法。

    获取公告列表

    查看公告部分的源码,我们发现所有的公告数据全部存储在 latnewslist 类中,在该类中找到 a 标签的 href 属性,可以得到该公告的网页地址。从上面的源码中,我们可以得到对应公告的网址为:

    https://gateio.news/article/16805

    详细公告

    其源码如下所示,通过查找 new-dtl-info 类,我们就可得到该公告发布的时间。

    获取公告发布时间

    最后,我们确定获取 HTML DOM TREE 的工具为 Jumony,可以在 Github 上下载。下载地址为:

    https://github.com/Ivony/Jumony

    Jumony下载

    这里对 Jumony 就不做过多介绍了,要是大家感兴趣,可以在图文下方留言,我后面再写几篇图文来介绍这个工具。


    上面我们对爬取的网页进行了分析,确定了技术路线,接下来,我们写代码实现爬取 Gateio 交易所公告的任务。

    1. 创建“交易所公告”的结构 Announcement

    public class Announcement
    {
        // 交易所名称
        public string ExchangeName;
        // 公告时间
        public string Time;
        // 公告标题
        public string Title;
        // 公告网址
        public string Url;
        // 格式化 Announcement 输出
        public override string ToString()
        {
            if (string.IsNullOrEmpty(Time))
                return base.ToString();
    
            DateTime dt = DateTime.Parse(Time);
            string result = "[" + dt.Year + "/" + dt.Month + "/" + dt.Day
                            + " " + Title.Trim() + "](" + Url + ")";
            return result;
        }
    }
    

    2. 获取“交易所公告”的 HTML DOM TREE

    public static IHtmlDocument GetHtmlDocument(string url)
    {
        IHtmlDocument document;
        try
        {
            document = new JumonyParser().LoadDocument(url);
        }
        catch
        {
            document = null;
        }
        return document;
    }
    // 方法重载,得到给定页码的公告
    public static IHtmlDocument GetHtmlDocument(int page)
    {
        string url = "https://gateio.news/articlelist/ann/" + page;
    
        HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
        if (request == null)
            return null;
        // 添加Cookie 中文显示
        request.Headers.Add("Cookie", "lang=cn");
        IHtmlDocument document = new JumonyParser().LoadDocument(request.GetResponse());
        return document;
    }
    

    3. 获取“交易所公告”的列表 List<Announcement>

    public static List<Announcement> GetGateioAnnouncement(int page)
    {
        List<Announcement> result = new List<Announcement>();
    
        IHtmlDocument doc = GetHtmlDocument(page);
    
        if (doc == null)
            return result;
    
        List<IHtmlElement> lists = doc.Find(".latnewslist").ToList();
        for (int i = 0; i < lists.Count; i++)
        {
            IHtmlElement infor = lists[i].Find("a").ToList()[0];
            Announcement announcement = new Announcement();
            announcement.ExchangeName = "Gate.io";
            announcement.Title = infor.Find("H3").ToList()[0].InnerHtml();
            
            string url = "https://gateio.news" + infor.Attribute("href").AttributeValue;
            announcement.Url = url;
            IHtmlDocument temp = GetHtmlDocument(url);
            List<IHtmlElement> t = temp.Find(".new-dtl-info").ToList();
            announcement.Time = t.Find("span").ToList()[0].InnerHtml();
            result.Add(announcement);
        }
        return result;
    }
    

    4. Markdwon 格式化输出

    private string GetReport(List<Announcement> lst)
    {
        if (lst == null || lst.Count == 0)
            throw new ArgumentNullException();
    
        string result = "**" + lst[0].ExchangeName + "**" + Environment.NewLine;
        for (int i = _lstGateio.Count - 1; i >= 0; i--)
        {
            result += "- " + lst[i] + Environment.NewLine;
        }
        return result;
    }
    
    Markdown文本

    5. HTML 渲染格式化输出的结果

    HTML渲染

    到此为止,利用 C# 爬取Gate.io交易所的公告就介绍完了。希望本篇图文对大家有所帮助。今天就到这里吧!See You!


    相关阅读

    相关文章

      网友评论

          本文标题:如何利用 C# 爬取Gate.io交易所的公告!

          本文链接:https://www.haomeiwen.com/subject/xokqbqtx.html