如何利用 C# 爬取Gate.io交易所的公告!
对于大部分程序员来说,都希望自己或多或少拥有一些比特币(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
渲染格式化输出的结果
到此为止,利用 C# 爬取Gate.io交易所的公告就介绍完了。希望本篇图文对大家有所帮助。今天就到这里吧!See You!
相关阅读