Bing Search API をつかってURLを取得する

この投稿は クローラー/スクレイピング Advent Calendar 2014 - Qiita の15日目です。

クローリングをするときに、元になるURLを指定すると思います。

多くは決まったURLを指定してキックすると思いますが、
サーチエンジンAPIをつかって指定するURLを取得してみます。

Bing Search API をつかいます。

Bing Search API | Microsoft Azure Marketplace

前提条件*1

  • Microsoftアカウント を持っている (上記リンクのAPI購入リンクからもサインアップ可能)
  • Bing Search API 購入済み (今回は、上記リンクから無料の5000トランザクション/月 を購入)

APIの使用

事前準備
  • Microsoft Azure Marketplace のアカウントページ*2で、アカウントキーを確認します。
注意点
  • APIの使用回数に制限があります。
  • パラメータの文字列はシングルクォートでかこむ必要があります。
使い方
  • Basic または OAuth でアカウントの認証をします。
    今回はベーシック認証を使用します。USER,PASSWORDともにアカウントキーを指定します。

  • Bing Search APIのルートURL(https://api.datamarket.azure.com/Bing/Search/${SOURCE})にクエリを指定します。

    • SOURCE部分に指定できる値は下記のとおりです。
指定する値 説明
Composite 複合検索
Web ウェブ検索
Image 画像検索
Video 動画検索
News ニュース検索
RelatedSearch 関連する検索
SpellingSuggestions スペルミスの単語の候補
  • パラメータを指定します。指定したSOURCEによって、入力パラメータや必須項目が異なります。

Bing Search API の入力パラメータ 詳細 https://datamarket.azure.com/dataset/bing/search#schema

実行

curlAPIを叩いてみます。

下記のように実行すると、Web検索の結果50件分がxmlで取得できます。

ACCOUNTKEY=#あなたのアカウントキー
SERVICE_ROOT_URL=https://api.datamarket.azure.com/Bing/Search
QUERY=\'xbox\'
SOURCES=Web

curl -G --user $ACCOUNTKEY:$ACCOUNTKEY $SERVICE_ROOT_URL/$SOURCES --data-urlencode Query=$QUERY

パラメータ $format に json を指定して、jq*3で表示してみます。
併せて、パラメータ $top を指定して取得件数を3件に変更しています。

PARAMS=\$format=json\&\$top=3
curl -G --user $ACCOUNTKEY:$ACCOUNTKEY $SERVICE_ROOT_URL/$SOURCES?$PARAMS --data-urlencode Query=$QUERY|jq .

次のようなデータが取得できます。

{
  "d": {
    "__next": "https://api.datamarket.azure.com/Data.ashx/Bing/Search/Web?Query='xbox'&$skip=3&$top=3",
    "results": [
      {
        "Url": "http://www.xbox.com/ja-JP/",
        "DisplayUrl": "www.xbox.com/ja-JP",
        "Description": "マイクロソフトのテレビゲーム機、Xbox 360と、Xbox 360でプレイできるシミュレーション、RPG、 アクション、 シューティングゲームの情報や、イベント情報などが満載。映画やTVドラマ、YouTubeやHuluなどのエンターテイメントも視聴できる ...",
        "Title": "Xbox 公式サイト",
        "ID": "844c1e06-9d18-4ffe-aeb1-eb4dd1ea26f3",
        "__metadata": {
          "type": "WebResult",
          "uri": "https://api.datamarket.azure.com/Data.ashx/Bing/Search/Web?Query='xbox'&$skip=0&$top=1"
        }
      },
      {
        "Url": "http://ja.wikipedia.org/wiki/Xbox",
        "DisplayUrl": "ja.wikipedia.org/wiki/Xbox",
        "Description": "Xbox(エックスボックス)とは、マイクロソフトが開発および販売を行った家庭用ゲーム機である。",
        "Title": "Xbox - Wikipedia",
        "ID": "b8771df4-a8b2-41e6-9930-e6eacd986d89",
        "__metadata": {
          "type": "WebResult",
          "uri": "https://api.datamarket.azure.com/Data.ashx/Bing/Search/Web?Query='xbox'&$skip=1&$top=1"
        }
      },
      {
        "Url": "http://www.xbox.com/",
        "DisplayUrl": "www.xbox.com",
        "Description": "Experience a new generation of games and entertainment with Xbox. The best games and entertainment on all of your devices. ... The best value in games and entertainment.}",
        "Title": "Xbox | Official Site | Xbox.com",
        "ID": "2db57908-7a22-45ad-b24e-e3ffc4f6c9d7",
        "__metadata": {
          "type": "WebResult",
          "uri": "https://api.datamarket.azure.com/Data.ashx/Bing/Search/Web?Query='xbox'&$skip=2&$top=1"
        }
      }
    ]
  }
}
ブラウザからの操作

Microsoft Azure Marketplace マイデータページのBing Search API の列の右上にある「使用」をクリックすると、
パラメータをフォームで指定してAPIを実行したり、
クエリのURLを確認することができます。

https://datamarket.azure.com/dataset/explore/bing/search

結果

URLを含む検索結果データを取得できました。

APIで取得したページは、それぞれデザイン・レイアウトが異なる場合が多いと思います。
そのため、決まった構造を想定して指定する方法で目的のデータをスクレイピングするのは難しそうです。

ページをまるごと収集したり、内容を解析するなどの用途に使ってみようとおもいます。

そのた

APIの使用というテーマからは外れますが

*4

人間がするのと同じように、ページからデータを取得できたら。

様々な構造のページから目的のデータを集めたり、
定点的にデータ収集する際にページ構造の変更を気にする必要が無くなったり、
今までと違ったかたちでデータ収集ができそうです。

*1:参考:右記ページ内の「前提条件」http://msdn.microsoft.com/ja-jp/library/gg312163.aspx

*2:Microsoft Azure Marketplace アカウントページ:https://datamarket.azure.com/account

*3:jq:http://stedolan.github.io/jq/

*4:引用させていただきありがとうございます