プログラミングとかブログ

Unity/C#/SRPGStudio/RPGツクールMVの情報とかその他気になったことを調べて書きます。

【C#】ニコニコのアニメ配信リストを取得して一覧を書き出すコードを書いた

ch.nicovideo.jp
をいちいち見るのが面倒なので一覧取得することにしました。

目次

コード

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Net.Http;
using HtmlAgilityPack;

namespace NicoAnimeScraper
{
    class Program
    {
        static void Main(string[] args)
        {
            GetNicoAnimeList();

            Console.ReadLine();
        }

        const string HEAD = "http://ch.nicovideo.jp/";
        const int YEAR = 2016;
        enum Season{spring,summer,fall,winter}

        //http://ch.nicovideo.jp/yyyySeason_animeが各クールのアニメリストのURL
        //2014年冬季以前はアドレスめちゃくちゃなので無理
        readonly static string ADDRESS = HEAD + YEAR + Season.winter.ToString() + "_anime";

        //staticにしてるのはMainから呼び出したかったからで特に意味はない
        static async void GetNicoAnimeList()
        {            
            string[] titles = default(string[]);
            string[] dayTimes = default(string[]);
            //スクレイピング 
            using (var client = new HttpClient())
            {
                var html = new HtmlAgilityPack.HtmlDocument();
                //ページを取得してhtmlパース
                html.LoadHtml(await client.GetStringAsync(ADDRESS));

                //アニメタイトルの取得
                //h3タグの
                titles = html.DocumentNode.Descendants("h3")
                    //タイトルのタグの
                    .Where(node => node.GetAttributeValue("class", string.Empty).Contains("program_title"))
                    //中身を取得
                    .Select(node => node.InnerText)
                    .ToArray();

                //チャンネルでの放送日時を取得
                //liタグの
                dayTimes = html.DocumentNode.Descendants("li")
                    //放送日時のタグの //2015年以前はclass="channel_time" スクレ対策?ただのミス?
                    .Where(node => node.GetAttributeValue("class", string.Empty).Contains("ch_time"))
                    //中身を取得
                    .Select(node => node.InnerText)
                    .ToArray();
            }
            
            //取得データのリスト作成
            var mergeList = new List<string>();
            for (int i = 0; i < dayTimes.Count(); i++)
            {
                mergeList.Add(titles[i].Replace("\n", "") + "\t放送日時:"
                 + dayTimes[i].Replace("\n", "").Replace("チャンネル", "")
                 .Replace("WEB最速!", "").Replace("TV同時配信!", ""));
            }
            //txtに書き出し
            using (var sw = new StreamWriter(@"C:\Users\ここは変えてね\Desktop\ニコニコアニメデータ.txt", true))
            {
                mergeList.ForEach(s => sw.WriteLine(s));
            }
            //コンソールに表示
            mergeList.ForEach(s => Console.WriteLine(s));
        }
    }
}

結果

f:id:shirakamisauto:20160110185217p:plain

書き出したテキストはこちら

解説

つってもHtmlAgilityPack使ってページ取得してスクレイピングして整形しただけです。

アニメページのURLは「http://ch.nicovideo.jp/yyyySeason_anime」になっています。
年と季節名を変えれば以前のクールのアニメ一覧も取得できます。
2014年冬季以前はURLに統一性がないので無理です。

タイトルとチャンネルの放送日時しか取得してません。
生放送や放送曜日は別途いじってください。

チャンネルのタグは今年から変わっているので去年以前のを取得するときは注意。

ToArrayなのは特に意味はないです。
前に作って放置したコードの再利用なのでどういう意図かは昔の私に聞いてください。