##はじめに##
スクレイピングする上で重要なAPIの利用の実装例です。PHPのサンプルはそこそこあったがC#で実行するサンプルが無かったので自前で
作ったのでご紹介します。
事前準備
楽天WEBサービスから「アプリID発行」する。
とりあえず発行するだけなので入力内容は適当でOKです。(楽天のアカウントさえあれば後からいくつでも発行できます)発行後に**「アプリID/デベロッパーID」**をメモしておいてください。
動作内容
「ドラゴンボール」と検索してヒットするページ情報をXML形式で取得しています。今回はXML形式のまま取得して必要なデータの整形は次回にしたいと思います。
開発環境
Microsoft Visual Studio Community 2019
Version 16.6.0
コンソールアプリ(.NET Framework)
HttpClientを知りたいかたは前回までの記事
HttpClientの使い方
コピペで使うときの注意
コード内のapplicationIdの右側の”0000000000000000000”を先ほど取得したIDに書き換える。
今回は**「楽天市場商品検索API」**の入力パラメーター
で検索しています。
APIの種類によって入出力パラメータが代わります。
##メインスレッド##
内容は100行ほどのコードですので全文載せています。
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のみ2を使える 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だけUTF8のバイト変換が必要
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パッケージが追加で必要になるので今回はここまでとします。