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の使用
事前準備
注意点
- 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
実行
下記のように実行すると、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の使用というテーマからは外れますが
人間がするのと同じように、ページからデータを取得できたら。
様々な構造のページから目的のデータを集めたり、
定点的にデータ収集する際にページ構造の変更を気にする必要が無くなったり、
今までと違ったかたちでデータ収集ができそうです。
*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:引用させていただきありがとうございます