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

2019-03-28  本文已影响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!


相关阅读

上一篇下一篇

猜你喜欢

热点阅读