10/27 PM22:00 に知ったのですが、 Internet ArchiveのWayback Machine が一新されました。
その中で、特に興味を引いたのがWayback Availability JSON API
です。
今回、このAPIをPowerShell で叩いてみましょう。
API概要
公開されている APIは、公式ページで確認してください。
ここでは、September, 24, 2013 の内容に沿って動作確認をしています。
API のベースuri は、http://archive.org/wayback/available
です。
url クエリ
urlクエリとして、?url=サイトアドレス
とすることで、対象サイトの Wayback Machine があるか存在を確認し、存在する場合は uriを返してくれます。
例えば、有名な黒いサイトならこうです。
http://archive.org/wayback/available?url=http://neue.cc
ブラウザで移動すると、以下のようなJSON が返ってきます。
{"archived_snapshots":{"closest":{"available":true,"url":"http://web.archive.org/web/20130615021329/http://neue.cc/","timestamp":"20130615021329","status":"200"}}}
timestamp クエリ
オプションとして、 ×tamp=対象日付
とすることで、指定した日付にもっとも近いWayback Machine の存在を確認できます。
例えばこうです。
http://archive.org/wayback/available?url=http://neue.cc×tamp=2006
ブラウザで移動するとJSONを確認できますね。
{"archived_snapshots":{"closest":{"available":true,"url":"http://web.archive.org/web/20060108065907/http://neue.cc:80/","timestamp":"20060108065907","status":"200"}}}
PowerShell でさくっと問い合わせる
見ての通り、 JSON で返ってくるので、 Invoke-WebRequest
ではなく、 Invoke-RestMethod
を利用しましょう。
もちろんInvoke-WebRequest
でも可能ですが、 JSONを変換する必要があるので、 PowerShell 4.0 の人なら Invoke-RestMethod
がベターでしょう。*1
ただ問い合わせるなら簡単です。
$json = Invoke-RestMethod -Method Get -Uri "http://archive.org/wayback/available?url=http://neue.cc×tamp=2006" $json.archived_snapshots.closest
これで、JSON がobject に変換されます。
available url timestamp status --------- --- --------- ------ True http://web.archive.org/web/20060108065907/http://neue.cc:80/ 20060108065907 200
PowerShell で 同期、非同期、並列に取得したい
さて、PowerShell でさくっと取れるのは当然です。これを、さらに使いやすく高速化してみましょう。
考えたのは与えた複数のURIごとに、同期
、非同期
、並列
で処理するパターンです。
GitHub
サンプルリポジトリを用意しました。
概要
Cmdletは処理に合わせて3つあります。
それぞれの特徴は次のチャートの通りです。
Cmdlet | pipeline input | mode | PreferUrlCount |
---|---|---|---|
Get-WaybackMachineAvailavility | O | Synchronous | urls < 5 |
Get-WaybackMachineAvailavilityAsync | X | Aynchronous | urls >= 10 |
Get-WaybackMachineAvailavilityPrallel | X | Parallel | urls < 10 |
同期Cmdlet
Get-WaybackMachineAvailavility
Cmdlet
- パイプラインからの入力をサポートします
- 同期処理のため、少数のURIを対象にした場合が望ましいでしょう
- 具体的には、5 URI以下です
非同期Cmdlet
Get-WaybackMachineAvailavilityAsync
Cmdlet
- パイプラインからの入力をサポートしません
- 各URI に対して 非同期に動作します。そのため、大量のURIを調べることに向いています
- 具体的には 10 URI以上です
並列Cmdlet
Get-WaybackMachineAvailavilityParallel
Cmdlet
- パイプラインからの入力をサポートしません
- 各URI に対して 並列(順不同)に動作します。そのため、ほどほどのURIを調べることに向いています
- 具体的には 10 URI以下です
利用方法例
url のみの場合
全て 同様のパラメーターをサポートしています。
# Synchronous invokation Get-WaybackMachineAvailavility -urls "http://tech.guitarrapc.com","http://neue.cc" # Asynchronous invokation Get-WaybackMachineAvailavilityAsync -urls "http://tech.guitarrapc.com","http://neue.cc" # Parallel invokation Get-WaybackMachineAvailavilityParallel -urls "http://tech.guitarrapc.com","http://neue.cc"
最新の結果が返ってきます。
available : True status : 200 timestamp : 20131008132313 url : http://web.archive.org/web/20131008132313/http://tech.guitarrapc.com queryInformation : {queryUri, url} available : True status : 200 timestamp : 20040430174213 url : http://web.archive.org/web/20040430174213/http://neue.cc:80/ queryInformation : {queryUri, url}
また、Get-WaybackMachineAvailavility
は、パイプラインからの入力としても動作可能です。
# Synchronous pipeline invokation "http://tech.guitarrapc.com","http://neue.cc" | Get-WaybackMachineAvailavility
timestamp付 のみの場合
これも、どのCmdletでも利用要領は変わりません。
# Synchronous invokation with 20060101 Get-WaybackMachineAvailavility -url "http://tech.guitarrapc.com","http://neue.cc" -timestamp 20060101 # Asynchronous invokation Get-WaybackMachineAvailavilityAsync -urls "http://tech.guitarrapc.com","http://neue.cc" -timestamp 20060101 # Parallel invokation Get-WaybackMachineAvailavilityParallel -urls "http://tech.guitarrapc.com","http://neue.cc" -timestamp 20060101
この場合は、 200601
に最も近い結果が返ってきます。
available : True status : 200 timestamp : 20131008132313 url : http://web.archive.org/web/20131008132313/http://tech.guitarrapc.com queryInformation : {queryUri, url} available : True status : 200 timestamp : 20060108065907 url : http://web.archive.org/web/20060108065907/http://neue.cc:80/ queryInformation : {queryUri, url}
まとめ
一度試してみてください。
Module にするほどでもないため、さくっと書きましたが 比較になると思います。
次回は、 上記コードを使って 同期、非同期、並列処理について見てみましょう。
*1:PowerShell 3.0には、ヘッダが途中で読めない問題がありますが、本件では影響でない....はず?