近デジ PDFで全部ダウンロード 半自動編

【検索ジャンパーの方のための追記】
「結局どうなったのか」だけお求めの方は、こちらの記事をご参照ください。


 「近デジ」こと「国立国会図書館 近代デジタルライブラリー」は本好きにとってはお宝の山と言えるわけだが。

 こういうものはどんどん称揚・翼賛すべきなんであろうが、近年リニューアルされたシステムでも相変わらず、「一冊全部ダウンロード」しにくいのは非常に不満なのである。

 元々データ化することが価値であるし、システムもかなりガンバッてリファインしてくれたのは認めるし、「今の時代だったらオンライン閲覧できればいいじゃん」というのはごもっともなのだが、やっぱり一冊纏まったPDFでローカルに持っておきたいというのが人情というモノだろう…って俺だけかもしれないが。

 「近デジ」ではPDFでダウンロードする手段は標準でサポートされているが、性能上の理由で
  1. 10コマ(ページ)単位でないとダメ

  2. 1回のダウンロード毎に30秒程度アクセス間隔を空けないとダメ
という、中々にシブちんな仕様なのである。

 こういう、単純にスケールアウトで解決できるであろう問題は、そんなにバカみたいにカネはかからないはずだと思うのだが、そこはそれ、天下の国会図書館なので、俺のごとき愚民が思いもよらぬような大人の事情がきっとあるのであろう。

 ブーブー文句を言ってても仕方がないので、無いのなら作ってしまえホトトギス、とりあえず一冊全部まとめてダウンロードするにはどうしたらよいか、ちょっと調べ始めたわけである。

 例として、

 「太古日本のピラミッド 酒井勝軍 著 (国教宣明団, 1934)」

 をまとめてダウンロードすることを考えてみる。
 「なんでよりにもよってそんなヘンな本が例なの?」とかそーゆーことは気にしないように。

(1) PIDを確認する。

 ダウンロードしたい文書のPID(つまり文書番号)を調べる。
 この番号は、「検索結果」の文書名のリンクを見ればわかる。
c0071416_17304482.jpg

  http://kindai.ndl.go.jp/info:ndljp/pid/1137942

 この一番最後の「1137942」が「太古日本のピラミッド」のPIDである。

(2) 最終コマを確認する。

 上のリンクをクリックして、ビューワーが表示されると、その文書の最終コマ数がコマ数指定のドロップダウンの横に表示される。

c0071416_17302822.jpg


 この値はソースのhtmlでいうと フォーム "form-item-information" の lastContentNo の値なので、自動化する場合はこれを取得すれば良さそうだ。

 なぜこの「最終コマ数」が必要なのかというと、近デジの現在のビューワーの「印刷」(PDFはこれで返してくる)の機能は、以前と違い、コマオーバーした時にはエラーを示すhtmlを返すように変更されたようだからである。
 俺の記憶では、以前は確かオーバしていてもコマ数の終わりまではダウンロードしてくれていた。これはシステム的には改悪と評価せざるを得ない。

 この文書の場合、最終コマは49なので、例えば最終ペ-ジまで取得したくて、41-50 と指定するとエラーが発生する。この場合、41-49としなければいけない。


【2012/07/13訂正】
「お知らせ」によれば、
「「印刷する」ボタンによるPDF出力の際、終了コマを省略した場合は上限まで出力するようにしました。
例)コマ数「1-」と入力 → 1コマ目から最大出力コマ目までを出力。全コマ数がそれ以下の場合は、最終コマまで出力。
とのことだった。記述に気がつかなかった俺の完全な誤認だったので、この直前の段は撤回する。

 エラーになると、application/pdfではなく text/htmlを返してくるので、エラー処理を自動にする場合にはresultのcontentsTypeがapplication/pdfであるかチェックするといった方法が必要だろう。

(3) 「印刷」(PDF出力)で行われていることを調べてみる。

 ビューワーの「印刷」を使い、1から10コマをPDFでダウンロードする操作で、どのようなリクエストが近デジサーバに行われているのかを見てみると;

http://kindai.ndl.go.jp/view/pdf/digidepo_1137942.pdf?
pdfOutputRangeType=R&pdfPageSize=&pdfOutputRanges=1-10


という GETリクエスト であることがわかる(戻りはApplication/pdfのストリーム)。

 つまり、

http://kindai.ndl.go.jp/view/pdf/digidepo_【PID】.pdf?
pdfOutputRangeType=R&pdfPageSize=&pdfOutputRanges=【開始コマ】-【終了コマ】


 これで、PDFが戻ってくるわけだ。どうやら積極的にクッキーを使っている節もない、単純なGETリクエストである。。

 一回のアクセスで最大10コマまで取得できるので、先頭の1コマ目から、49コマを最後まで取得するには;
pdfOutputRanges=1-10
pdfOutputRanges=11-20
pdfOutputRanges=21-30
pdfOutputRanges=31-40
pdfOutputRanges=41-49

という5回のGETリクエストを繰り返せばよいようだ。

 ただし、一回ごとのリクエストの間は30秒以上空けろ、という条件がある。

 「今の時代に30秒間隔ですか!」という悪態はとりあえず飲み込んでおこう。
 どのみちこの間隔はサーバ側でチェックされており、短い間隔で3回ほどリクエストすると、エラーになってダウンロードできなくなる。

 まあ、この制限を誤魔化す手はいくらも考えられるが、岡崎図書館事件を忘れてはいけない。

 いきなり威力業務妨害容疑で引っ張られて拘留取り調べなんてことにはなりたくないので、一回ごとのリクエストには必ず30秒スリープするようにしよう。

 コマ数が多い文書だとかなり時間がかかることになるが、そこは我慢である。

(4) テスト。

 ここまで判ったことで、実際に問題なくダウンロードできるか試してみよう。
 いきなりスクリプトだのプログラムだのを作るのは面倒なので、適当なありもので試してみることにする。

 必要なのは、指定したURLにGETを発行して戻りをファイルに保存する何か取得した複数のPDFをひとつに結合する何か、である。

 どちらもフリーウェアで適当なものが入手できるはずだ。

 ここでは手前味噌だが、一例として拙作のhttpget.exeを使ってみる。
httpget "http://kindai.ndl.go.jp/view/pdf/digidepo_1137942.pdf?pdfOutputRangeType=R&pdfPageSize=&pdfOutputRanges=1-10" DUMMY01.PDF
sleep 30
httpget "http://kindai.ndl.go.jp/view/pdf/digidepo_1137942.pdf?pdfOutputRangeType=R&pdfPageSize=&pdfOutputRanges=11-20" DUMMY02.PDF
sleep 30
httpget "http://kindai.ndl.go.jp/view/pdf/digidepo_1137942.pdf?pdfOutputRangeType=R&pdfPageSize=&pdfOutputRanges=21-30" DUMMY03.PDF
sleep 30
httpget "http://kindai.ndl.go.jp/view/pdf/digidepo_1137942.pdf?pdfOutputRangeType=R&pdfPageSize=&pdfOutputRanges=31-40" DUMMY04.PDF
sleep 30
httpget "http://kindai.ndl.go.jp/view/pdf/digidepo_1137942.pdf?pdfOutputRangeType=R&pdfPageSize=&pdfOutputRanges=41-49" DUMMY05.PDF


 というバッチファイルを作る(実際はループで回すべきだが、ここでは説明の為ベタ書き)。

 これを動かして、カレントディレクトリにDUMMY01からDUMMY05.PDFの5個が出来れば成功である。

 後は必要に応じてPDFを結合すればいい。PDF結合ツールは本家 Acrobat X 始め色々あるのでお好きなモノを。

 とまあ、以上のように近デジダウンロードは比較的単純であることが判った。

 もちろん、フツーの人はいちいちバッチファイルを作るようなことはしないで、WSHでもPowerShell、ExcelのVBAでも、要は http get が出来るモノで汎用的なツールを作成するのがよいだろう。

 ということで次回は簡単なコマンドラインプログラムを作ってみる予定。予定は未定。
[PR]
by signal-9 | 2012-07-10 17:36 | TIPSとかKludgeとか
<< 近デジ PDFで全部ダウンロー... 備忘:C#でちょっとヘンなとこ... >>