楽天API　C#　商品検索の一覧取得する（１）

##はじめに##
スクレイピングする上で重要なAPIの利用の実装例です。PHPのサンプルはそこそこあったがC#で実行するサンプルが無かったので自前で
作ったのでご紹介します。



**事前準備**
[楽天WEBサービス](https://webservice.rakuten.co.jp/ "Rakuten Developer")から「アプリID発行」する。
![楽天アプリID発行.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510936/d116cc4f-26b4-5828-92e6-38509b70cece.png)
とりあえず発行するだけなので入力内容は適当でOKです。（楽天のアカウントさえあれば後からいくつでも発行できます）発行後に**「アプリID/デベロッパーID」**をメモしておいてください。

**動作内容**
「ドラゴンボール」と検索してヒットするページ情報をXML形式で取得しています。今回はXML形式のまま取得して必要なデータの整形は次回にしたいと思います。


**開発環境**
Microsoft Visual Studio Community 2019
Version 16.6.0
コンソールアプリ（.NET Framework）

HttpClientを知りたいかたは前回までの記事
[HttpClientの使い方](https://qiita.com/Matter/items/971dbf7f98a37f84ea5d "https://qiita.com/Matter/items/971dbf7f98a37f84ea5d")


**コピペで使うときの注意**
コード内のapplicationIdの右側の”0000000000000000000”を先ほど取得したIDに書き換える。
今回は**「楽天市場商品検索API」**の[入力パラメーター](https://webservice.rakuten.co.jp/api/ichibaitemsearch/"https://webservice.rakuten.co.jp/api/ichibaitemsearch/")
で検索しています。

APIの種類によって入出力パラメータが代わります。

##メインスレッド##
内容は１００行ほどのコードですので全文載せています。

```Sample10.cs
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

namespace RakutenAPI
{
    class Program
    {
        private static HttpClient client;
        static void Main(string[] args)
        {
            //楽天市場商品検索API　version:2017-07-06
            string RequestURL = "https://app.rakuten.co.jp/services/api/IchibaItem/Search/20170706?";

            //検索ワード
            string seachword = "ドラゴンボール";



            //以下は入力パラメータ　version:2017-07-06****************************************************
            //参照URL　 https://webservice.rakuten.co.jp/api/ichibaitemsearch/ 
            //検索には必須条件と任意条件があるため必要なパラメータは指定しない場合Default値が参照される。
            //入力値（右側）はすべてダブルクォーテーション"で囲む。
            //入力値（左側）は参照URLから「パラメーター」の項目をそのまま入力。


            var dic = new Dictionary<string, string>();
            dic.Add("applicationId", "0000000000000000000");
            dic.Add("keyword", ToUTF8(seachword));
            dic.Add("format", "xml");　//取得方法　json または xml
            //dic.Add("formatVersion", "2"); //jsonのみ２を使える　Default 1
            //dic.Add("hits", "5");  //1ページあたりの取得件数　Default 30
            //dic.Add("page", "1"); //取得ページ数　Default 1


            //入力パラメータここまで************************************************************************
            var mylist = new List<string>();
            foreach(var m in dic)
                mylist.Add(m.Key + "=" + m.Value);

            RequestURL += string.Join("&", mylist);

            //クライアント接続開始
            try{   client = new HttpClient();  }
            catch (Exception ex){  Console.WriteLine("【接続エラー】：" + ex.Message);   }

            string HTMLtext = "";
            try
            { 
                //URLでHTMLを取得する。
                    Task<string> task_get = GetRequest(RequestURL);
                    HTMLtext = task_get.Result;
            }
            catch (Exception ex)
            {
                Console.WriteLine("【応答エラー】：" + ex.Message);
            }

            Console.WriteLine(RequestURL);
            Console.WriteLine(HTMLtext);
            Console.ReadKey();
           
        }

        //keywordだけUTF８のバイト変換が必要
        public static string ToUTF8(string Keyword)
        {
            //String型を16進数バイト型文字列に変換　”楽天”→”%E6%A5%BD%E5%A4%A9”
            byte[] bytedata = Encoding.UTF8.GetBytes(Keyword);
            Keyword = "%" + BitConverter.ToString(bytedata).Replace("-", "%");
            return Keyword;
        }


        //URLからHTMLをゲット
        async static Task<string> GetRequest(string url)
        {
            HttpResponseMessage response = await client.GetAsync(url);
            string contentstr = response.StatusCode.ToString();
            Console.WriteLine("【GetRequest Response】" + contentstr);

            if (response.StatusCode == System.Net.HttpStatusCode.OK)
            {
                contentstr = await response.Content.ReadAsStringAsync();
            }
            else if (response.StatusCode == HttpStatusCode.Redirect)
            {
                //StatusCode リダイレクトのときの処理
                var r = client.GetAsync(url).Result;
                Uri uri = new Uri(new Uri(url), r.Headers.Location);
                contentstr = client.GetAsync(uri).Result.Content.ReadAsStringAsync().Result;
            }

            return contentstr;
        }


    }
}


```

コンソールアプりが起動して下のような画面が出たら成功です。今回は「ドラゴンボール」で検索してxmlデータで取得しています。jsonでも良かったのですがC#だとここから必要な個所を取り出すのにAngleSharpなりJson変換などのNuGetパッケージが追加で必要になるので今回はここまでとします。


![実行結果.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510936/ca95c34c-4708-0fdd-1983-cf65a84a2c75.png)

次回
[楽天API　C#　商品検索の一覧取得する（２）](https://qiita.com/Matter/items/188328194998ffbf1953#%E6%A5%BD%E5%A4%A9api%E3%81%AE%E3%81%A4%E3%81%A5%E3%81%8D "Qiita Home")