Closed5

娘の幼稚園ブログをVim+シェルワンライナーの練習を兼ねてスクレイピング

tenkohtenkoh

いつもはLambdaを使ってスクレイピングしているのだが、訳あってスポット対応する必要があり、せっかくなので練習中のvim、Linuxワンライナーを試してみる。

  1. (認証付きなので)ブログに手動アクセスしてSourceをローカルに保存
  2. Vimを使って写真一覧のURLを抽出(正規表現検索+マクロ)
  3. URL一覧からワンライナーで写真をローカル保存(xargs + curl)
tenkohtenkoh

正直2.もシェルコマンドを使って行えば良いとは思うが、そこはまあ練習なので。。。
(ToDo: 後で別解として自分でやってみる)

tenkohtenkoh

正規表現

DLしたい写真がhref="https://(domain)~jpeg"の形式でソース中に並んでいるので正規表現で抽出できる。

vimの正規表現検索で気をつけたところ

  • \vでvery magic検索を使う
  • very magic検索を使ったときにエスケープが必要な文字が何かは手探りで
    • .はそうだろうなと思ったけど、=もエスケープが必要なんやね
  • *は最長マッチなので、同一行に複数URLがあるようなケースでは{-}を使って最短マッチ検索することが必要
  • マッチさせたい位置をコントロールするために適宜\zs\zeを使う

最終的には次のようになった

/\vhref\="\zshttps:\/\/www\.(domain).{-}jpeg
tenkohtenkoh

マクロ

検索した結果を全てヤンクするようなことができそうなもんだが、その方法に辿り着けなかった。

ということで、次のマッチ→""の中をヤンク→別タブのファイルに貼り付け→元のタブに戻るをマクロに登録し、ファイルの先頭から最後まで繰り返し実施することにした。

留意事項:

  • set nowrapscanして、ファイルの先頭に戻らないようにしておく
  • 先に別タブを用意しておく
  • はりつけにはpではなく:putを使う。改行がされるため。
nyi":tabn
:put
:tabn
tenkohtenkoh

ワンライナー

ここまでで取得したいURLが各行に並んだテキストファイルが出来上がるので、それを読み込んでcurlを実行すれば良い

cat links.txt | xargs -n1 curl -O

ポイント:

  • xargsに-n1を設定することで各行に対して実行の意味合いになる
  • curlの-o-Oは意味合いが違うので注意。後者だと取得したファイル名を使ってローカルに保存する
このスクラップは2023/09/24にクローズされました