Bing Search APIを使ってWeb検索を行うには(Json編)

Bing Search APIを利用する

Bing検索エンジンは、URLにGetアクセスをするとXMLやJSONで結果を返してくれる検索APIを提供しています。

Getアクセスをするときに、アカウントキーが必要となり、それを認証情報として組み込まないと結果をかえしてくれません。

Azure Market Placeにアクセスして、サインアップをしていない場合はサインアップをしましょう。

サインインできるようになったら、アカウントにアクセスし、プライマリーアカウントキーを入手しましょう。

8

また、Bing Search APIから、$0.00のサブスクリプションを購入します。(課金は発生しません。)

9

これでBing Search APIを利用できるようになりました。

HttpClientでGetリクエストを送る

Bing Search APIをC#から利用するにはHttpClientを使ってGetリクエストを送ります。

その際様々な検索クエリをつけることができます。
詳しい仕様はこちらこちら

string searchWord = "コーヒー";//検索ワード
string market = "ja-JP";//検索をかける言語コード
string adult = "Off";   //エロコンテンツフィルタをかけるかどうかOff,Moderate,Strictの3種類
int top = 50; //トップ何個の検索結果を返すか(デフォルト50)
string format = "json"; //atom(xml)かjsonか

今回はJsonで取得する方法を解説します。

そして、検索ワードをUriクラスのEscapeDataStringメソッドでエンコードします。

//文字列エンコード
searchWord = Uri.EscapeDataString(searchWord);

HttpHandlerのCredentialプロパティに先ほどAzureMarketPlaceから取得したプライマリーアカウントキーを入力します。
NetworkCredentialクラスはユーザー名とパスワードですが、どちらもプライマリーアカウントキーを入力します。

HttpClientHandler handler = new HttpClientHandler();
//認証情報を追加
handler.Credentials = new NetworkCredential("{Your Account Key}", "{Your Accout Key}");

HttpClient client = new HttpClient(handler);
//Getリクエスト
var resultStr=await client.GetStringAsync("https://api.datamarket.azure.com/Bing/Search/Web"
    +"?Query="+"'"+searchWord+"'"+"&Market="+"'"+market+"'"+"&Adult="+"'"+adult+"'"+"&$top="+top+"&$format="+format);

取得したJson文字列を文字列デコードします。

//文字列デコード
resultStr = Uri.UnescapeDataString(resultStr);

ここまでの全体コードです。

string searchWord = "コーヒー";//検索ワード
string market = "ja-JP";//検索をかける言語コード
string adult = "Off";   //エロコンテンツフィルタをかけるかどうかOff,Moderate,Strictの3種類
int top = 50; //トップ何個の検索結果を返すか(デフォルト50)
string format = "json"; //atom(xml)かjsonか

//文字列エンコード
searchWord = Uri.EscapeDataString(searchWord);

HttpClientHandler handler = new HttpClientHandler();
//認証情報を追加
handler.Credentials = new NetworkCredential("{Your Account Key}", "{Your Account Key}");

HttpClient client = new HttpClient(handler);
//Getリクエスト
var resultStr=await client.GetStringAsync("https://api.datamarket.azure.com/Bing/Search/Web"
    +"?Query="+"'"+searchWord+"'"+"&Market="+"'"+market+"'"+"&Adult="+"'"+adult+"'"+"&$top="+top+"&$format="+format);

//文字列デコード
resultStr = Uri.UnescapeDataString(resultStr);

Jsonシリアライズを行う

取得したJsonを解析するために、Json.netというライブラリを入れます。
NugetでJson.Netと検索し、インストールします。

12

シリアライズするために、BingSearchAPIの結果取得できるJsonと対応するクラスを作ります。
以下のクラスを新しく追加します。

public class Metadata
{
    public string uri { get; set; }
    public string type { get; set; }
}

public class Result
{
    public Metadata __metadata { get; set; }
    public string ID { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public string DisplayUrl { get; set; }
    public string Url { get; set; }
}

public class D
{
    public List<Result> results { get; set; }
    public string __next { get; set; }
}

public class WebSearchJson
{
    public D d { get; set; }
}

クラスを追加することができたら、Json.NetのJsonConvertを使ってシリアライズを行います。

var feed=JsonConvert.DeserializeObject<WebSearchJson>(resultStr);

これだけでJsonの解析が完了しました。

ListViewのItemsSourceに追加します。

//ListViewのItemsSourceとする
listView.ItemsSource = feed.d.results;

ListViewのItemsTemplateはこのようにします。

<ListView x:Name="listView" HorizontalAlignment="Left" Height="487" Margin="661,143,0,0" VerticalAlignment="Top" Width="458">
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Vertical">
                <TextBlock Text="{Binding Title}" FontSize="28" />
                <TextBlock Text="{Binding Description}" FontSize="20"/>
                <TextBlock Text="{Binding Url}" FontSize="18" />
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

11

全体的なコードです

string searchWord = "コーヒー";//検索ワード
string market = "ja-JP";//検索をかける言語コード
string adult = "Off";   //エロコンテンツフィルタをかけるかどうかOff,Moderate,Strictの3種類
int top = 50; //トップ何個の検索結果を返すか(デフォルト50)
string format = "json"; //atom(xml)かjsonか

//文字列エンコード
searchWord = Uri.EscapeDataString(searchWord);

HttpClientHandler handler = new HttpClientHandler();
//認証情報を追加
handler.Credentials = new NetworkCredential("{Your Account Key}", "{Your Account Key}");

HttpClient client = new HttpClient(handler);
//Getリクエスト
var resultStr=await client.GetStringAsync("https://api.datamarket.azure.com/Bing/Search/Web"
    +"?Query="+"'"+searchWord+"'"+"&Market="+"'"+market+"'"+"&Adult="+"'"+adult+"'"+"&$top="+top+"&$format="+format);

//文字列デコード
resultStr = Uri.UnescapeDataString(resultStr);

var feed=JsonConvert.DeserializeObject<WebSearchJson>(resultStr);

//ListViewのItemsSourceとする
listView.ItemsSource = feed.d.results;

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.