はてなブログからWordpressへ移行したい…。
そんな時Googleで「はてブ Wordpress 引越し」とかで調べれば腐るほど記事の引越し手順に関する記事が出てくると思います。
そう、記事の移行については・・・
問題は記事にアップロードした画像も移したい場合です。
実はこれが思ってたより簡単にはいかないんです。
そんなたいして画像をアップしていないのであれば記事内から手動で画像を保存して移してもいいでしょう。
しかし、記事数とアップした画像も大量にある場合はそんなことしてたらいつまでたっても終わりませんよね。
もう面倒くさいから画像ははてブに置いたまま直リンクでいいや、とかいいだしたらここで話が終わってしまうのでそういうのは無しで。
最近同じ状況になった時、最終的にLinuxコマンドの「wget」を利用する方法に落ち着いたので、その備忘録も兼ねて記事にしたいと思います。
wgetとgrepとは
「wget」は指定したサイト全体や特定のディレクトリ、ファイル内に記述してあるURLなどを一括でDLすることができるコマンドです。
「grep」は特定のテキストファイルの中から指定した正規表現に一致する行を出力するコマンドです。
どちらもUNIX/Linuxコマンドとなるので使用するのにはサーバーへSSHログインをし、コンソール画面から実行する必要があります。そうです、例の黒い画面です。
というわけで引越し先のサーバーがSSHログインできない場合は、一旦別のSSHが使用できるサーバーでwget&grepしたうえでそれを引越し先にFTPなどでアップする必要があります。
ちなみに今回自分が作業を行なった際もそのパターンでした。
作業の流れ
ざっくり言うと以下の流れになります。
- アップした画像一覧RSSのソースコードをwgetで取得。
- ①の中から画像のURL部分のみgrepで抽出。
- ②をwgetで画像をまとめてDL。
今回作業するサーバーについて
wgetが使えるサーバーならどこでもいいですが、今回は引越し先のサーバーを「ロリポップ」と仮定して作業します。
ロリポップへのSSHログインの方法は今回は省くので分からない人はすぐ検索でヒットするので自分で調べましょう。
下準備
SSHでログインしたら、まずDLする画像を保管するためのディレクトリを作成します。
名前は何でもいいですが、今回は仮に「backup」とします。
1 |
mkdir backup |
作成できたらそのディレクトリに移動しておきます。
1 |
cd backup |
wgetでRSSページのソースコードを取得
はてブでアップした画像は全て「はてなフォトライフ」というサイトへアップロードされており、ユーザー別のアップロード画像のリストは
「http://f.hatena.ne.jp/【はてなID】/Hatena%20Blog/rss」
となります。
もしくは、はてなフォトライフのページより画面上部の「RSS」のボタンからもアクセスできます。
wgetを実行
最初のwgetは「wget」の後にDLしたいページのURLを指定するだけです。色々なオプションを指定することもできますが今回は使わないので割愛します。
コンソール画面に戻りwgetコマンドを実行します。
1 |
wget http://f.hatena.ne.jp/【はてなID】/Hatena%20Blog/rss |
実行するとbackupディレクトリ内に「rss」という名前のファイルが生成されていると思います。
テキストエディター等でこのファイルを開くと上記RSSページのソースコードが書かれているかと思います。
上手くいかない場合。
自分もそうでしたが、先ほどのrssファイルの中身がはてなフォトライフのトップページのソースコードになってる場合があります。
これは恐らくRSSページURLの打ち間違えやアップしている画像フォルダの公開範囲を設定している場合が考えられるんじゃないかなあと思いますが、自分の場合どちらも当てはまりませんでした。(後日再度試した際は問題なかったです)
その場合、手動でページのソースコードをコピーしてrssファイルの中を差し替えましょう。
全ページ分繰り返す
RSS1ページには最大50件までしか出力されないので、50個以上画像がある場合は、末尾に「?page=2」のようにページ数を指定して、同じようにwgetでソースコードを取得していきます。
ちなみにその場合吐き出されるファイル名は「rss?page=x」になります。
ソースコードを一つのファイルにまとめる
この後生成されたrssファイルひとつひとつに対してgrepで画像URLのみを抽出していくのですが、ひとつひとつ実行するのも面倒くさいので最初に生成されたrssファイルに全部まとめてしまいましょう。
ここは面倒ですが手動でひとつひとつrssファイルの末尾にコピペで追加していきます。(なんかもっと賢いやり方ある気もしますが…)
grepで画像URLを抽出
ソースコードをひとつにまとめられたら次はgrepコマンドで画像のURLのみ抽出していきましょう。
grepコマンドは抽出条件と検索対象ファイル名を指定するのが基本的な使い方になりますが、今回は抽出した結果を「photo.txt」というファイルに出力するようにします。(photo.txtは勝手に生成されるのでこっちで用意する必要はありません)
実際のコードは下記になります。
1 |
grep "https\:\/\/cdn-.*png\|https\:\/\/cdn-.*jpg" -o rss > photo.txt |
これで検索対象の「rss」ファイルから「http://cdn-【何かしらの文字列】.jpg(もしくはpng)」の部分だけが「photo.txt」に抽出されているはずです。
もしphoto.txtの中身が空の場合は抽出条件部分になにか問題があると思うのでもう一度よく見直してみましょう。例えば「https」ではなく「http」にしてたなど。
wgetで画像をまとめてDL
最後に再度wgetで画像をまとめてDLしていきます。
1 |
wget -i photo.txt -nc --random-wait |
オプション
今度のwgetには色々とオプションがついてますね。
「-i」は直後の指定したファイルの中のURLをダウンロードするというものです。なので「photo.txt」ファイルの中に記述された画像のURLをダウンロードをしてくれます。
次に「-nc」ですが、これは仮に同じ名前のファイルがあったとしても上書きしないという指定になります。
最後の「–random-wait」は1つDLするたびにわずかな待機時間を持たせる指定になります。
特に大量の画像を一気に落とそうとする場合、待ち時間なしだとサーバーにかなり負荷がかかるようなので必ず指定しておきましょう。
証明書認証エラー
上記のコマンドを実行するとコンソール画面にズラズラとDL状況のログが流れると思います。しかし、よく見ると「ERROR」の文字が・・・
1 |
Error: cannot verify cdn-ak.f.st-hatena.com's certificate, issued by ... |
「cdn-ak.f.st-hatena.comの証明書を確認できません。」とのことです。
画像のURLがhttpsによる何かしらの認証エラーなんでしょう。
エラー文の末尾に
1 |
To connect to cdn-ak.f.st-hatena.com insecurely, use '--no-check-certificate'. |
「安全にcdn-ak.f.st-hatena.comに接続するには『–no-check-certificate』を使ってね」とあるので「–no-check-certificate」オプションを指定して再度試してみます。
1 |
wget --no-check-certificate -i photo.txt -nc --random-wait |
またログが流れてきますが今回はERRORも見当たらないので大丈夫そうです。
FTPでbackupディレクトリを見るか、もしくはそのままlsコマンドでディレクトリ内のファイルを確認してみると画像がちゃんとDL出来ているのが確認できます。
以上でwgetとgrepによる画像DLは完了です。
最後に
使用するレンタルサーバーがSSHを使用できる場合に限定されますが、完全に全自動でとまではいかずとも割と少ない工数でまとめて画像がダウンロードできるので相当助かりますね。
はてなブログに限らず他の場面でも色々と使える機会がありそうなので、wget&grepは記憶の片隅にでも置いておくと良いんじゃないでしょうか。