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

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 = "atom"; //atom(xml)かjsonか

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

そして、検索ワードを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);

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

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

ここまでで検索結果のXMLを取得することができました。
ここまでの全体コードです。

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

このようなXMLが帰ってきます。

10

AtomFeedを解析する

現時点でAtomFeedは取得することができたので次にそれを解析していきます。
WindowsRuntimeでAtomFeedを解析するにはSyndicationFeedクラスを用います。

Loadメソッドを使うことによってstring型のAtomFeedを入力することができます。

//AtomFeedを読み込む
SyndicationFeed feed=new SyndicationFeed();
feed.Load(resultStr);

続いてAtomFeed内の各記事のXML(entryタグ内のXML)を取得します。

//AtomFeed内の記事XMLをリスト化する
var list=feed.Items.Select(q => new
{
    Xml=q.Content.Xml
}).ToList();

続いて取得したXMLからTitle、Description,Urlを取得します。

//各記事のXMLからTitle,Description,Urlを抽出する
var contentList=list.Select(q => new
{
    Title=q.Xml.FirstChild.ChildNodes.Where(qq=>qq.LocalName.ToString()=="Title").Select(qq=>qq.InnerText).Single().ToString(),
    Description=q.Xml.FirstChild.ChildNodes.Where(qq=>qq.LocalName.ToString()=="Description").Select(qq=>qq.InnerText).Single().ToString(),
    Url=q.Xml.FirstChild.ChildNodes.Where(qq=>qq.LocalName.ToString()=="Url").Select(qq=>qq.InnerText).Single().ToString()
}).ToList();

これでAtomFeedを解析することができました。

ListViewのItemsSourceに入れてテストしてみます。

//ListViewのItemsSourceとする
listView.ItemsSource = contentList;

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 = "atom"; //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);

//AtomFeedを読み込む
SyndicationFeed feed=new SyndicationFeed();
feed.Load(resultStr);

//AtomFeed内の記事XMLをリスト化する
var list=feed.Items.Select(q => new
{
    Xml=q.Content.Xml
}).ToList();

//各記事のXMLからTitle,Description,Urlを抽出する
var contentList=list.Select(q => new
{
    Title=q.Xml.FirstChild.ChildNodes.Where(qq=>qq.LocalName.ToString()=="Title").Select(qq=>qq.InnerText).Single().ToString(),
    Description=q.Xml.FirstChild.ChildNodes.Where(qq=>qq.LocalName.ToString()=="Description").Select(qq=>qq.InnerText).Single().ToString(),
    Url=q.Xml.FirstChild.ChildNodes.Where(qq=>qq.LocalName.ToString()=="Url").Select(qq=>qq.InnerText).Single().ToString()
}).ToList();

//ListViewのItemsSourceとする
listView.ItemsSource = contentList;

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.