Yahoo天気をスクレイピングしてみた(C#編)

<h1>初めに</h1>
前回Pythonでyahoo天気をスクレイピングしましたが、自分が得意なC#でもやってみたいと思い挑戦してみました。Python版が2月中旬だったので2か月越しになりますが、実装自体はPython版作った次の日には終わっていました。忙しく存在自体を忘れてた...。C#は一部界隈では統一論もあるくらい色々使える言語なので天気のスクレイピングは必ず需要があり自分も色々なところに実装できるようメモ代わりに記事を残します。

Python編は
https://qiita.com/MonoShobel/items/c36bb0e8eecf538248b4
にあります。

<h2>開発環境</h2>
Windows10
VisualStudio2019

<h2>スクレイビング用のライブラリ</h2>
スクレイビングを簡単にできるライブラリがあります。
「AngleSharp」というライブラリがあるのでこれをNugetからインストールします。
インストール方法は後述します。
AngleSharpのホームページ
https://anglesharp.github.io/

<h2>Python編で書いたけどもう一度</h2>
Yahoo天気ですが、たぶんスクレイピングは禁止されていません。
Yahooファイナンスは明確に禁止されていましたが、天気に関しては禁止しているような記述は見つかりませんでした。
ただ節度は守りましょう。定期的にスクレイピングするとしても天気は1時間または30分ごとくらいのアクセスで十分だと思います。

<h2>やること</h2>
色々取りたい情報はありますがとりあえず東京の今日の天気を取得しました。
下記の画像の今日の天気を取得します。
<img width="483" alt="00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309045/c01c0c5d-ceea-4f3c-a1a5-674bb403721b.png">


<h2>コードを書く前に</h2>
C#といえばVisualStudio。(Visual Codeでもできますが)
まずはプロジェクトの作成を行っていきます。

1. Visual Studioを起動し右下の新しいプロジェクトの作成をクリックします。
<img width="768" alt="01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309045/e0344c91-0402-be84-8d0e-6f72053d3bc4.png">

2. 次の画面でコンソールアプリ(.NET Core)を選択します。右下の次へを選びます。コンソールアプリ(.NET Core)をダブルクリックでも大丈夫です。コンソールアプリ(.NET Core)が見つからない場合は、右上でC#、Windowsを選択すると上に出てきます。
<img width="768" alt="02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309045/3482362a-08a8-19aa-3f79-2c922b735e32.png">

3. この画面は今回はとりあえず変更せずそのまま右下の作成を押下します。
<img width="768" alt="03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309045/89ebb002-3dd6-2f88-5c74-c22dd313f97a.png">

4. AngleSharpをダウンロードします。VisualStduinoのコードを記述する最初の画面が開いたら下記の画像の通り、画面上部の「プロジェクト」のタブを選んで、その中から「NuGetパッケージの管理」をクリックしてください。
<img width="567" alt="04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309045/f05d3ff2-0611-853f-8173-20a0c84ee48c.png">

5. 画像の画面が開いたら、「参照」を押下し、検索ボックスに「AngleSharp」を入力すると、画像の通り目的のライブラリが出てくるので、
選択して、右の画面のインストールを押下してください。
<img width="853" alt="05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309045/8f020ced-8a89-3932-43f3-74c7b2ad1183.png">

6. 画僧の画面が出てくるので右下の「Ok」を押下すると元の画面に戻りインストールが始まります。
<img width="365" alt="06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309045/6433819c-8dee-0ed9-0d96-8ef557848838.png">

7.元の画面に戻ったら下記の画像の赤枠の部分を同じ場所に入力します。
<img width="826" alt="07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309045/03dde794-0778-21c0-1e40-3f2ae3627d90.png">

<h2>コード</h2>
実際にコードを実行すれば今日の東京の天気を取得できます。

```C#
using AngleSharp;
```
```C#
// 取得対象の設定
var htmlUrl = $"https://weather.yahoo.co.jp/weather/jp/13/4410.html";
var querySelector = $"#main > div.forecastCity > table > tbody > tr > td:nth-child(2) > div > p.pict";
// HTMLドキュメントの取得
var document = BrowsingContext.New(Configuration.Default.WithDefaultLoader()).OpenAsync(htmlUrl).Result;
// クエリセレクタでデータの取得
var element = document.QuerySelector(querySelector);
/// 天気の文字列を種痘
string tenki = element.TextContent;

Console.WriteLine(tenki);

Console.ReadKey();
```


以下、実行結果
<img width="734" alt="99.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309045/a2baf926-78e0-012f-a80e-c068546737d6.png">



<h2>終わりに</h2>
C#でもライブラリを使えば簡単にスクレイビング出来て驚きました。
このプログラムを元に色々作ってみたいと思います。