【裏技】みんな知らないログイン必須ページの爆速スクレイピング【モテるシェル芸】

f:id:serinuntius:20180718233358p:plain

おはようございます。

裏技ってつけると急にワザップ感が出て、懐かしいですよね〜。 こないだ飲み会で同期とそんな話をしておりました。

本題

ログインが必要なWebサイトで画像を引っこ抜いて欲しいという依頼があり、スクリプトを書くかな〜と迷ったんですが、よく考えたらシェル芸だけで出来るな〜と思ったので共有したいと思います。

今回はデザイナーにGitHubのIssueに貼ってある画像200枚以上をzipで欲しいって言われたので、それを題材にします。

環境

やり方

1. Chromeでおもむろにデベロッパーツールを開く

Macなら Shift + Cmd + c等で開けます。

2. networkを選択する

f:id:serinuntius:20180718222407p:plain

そのページのリクエストを見つける たぶん、一番上のはず。

f:id:serinuntius:20180718222514p:plain

3. 右クリックして、Copy as cURLを選択

f:id:serinuntius:20180718222603p:plain

今回の肝はこれで、ブラウザで送ったリクエストと全く同じリクエストをcurlで再現できるようになっております。 つまり、cookieの情報等も渡してくれるので、認証が通った状態でアクセス出来るわけですね。

GitHubのプライベートリポジトリは、認証してない状態でアクセスすると404を返してくるのですがそれを回避できます。

4. お好きなターミナルにコピペ

わかりにくいですが、めっちゃ長いcurlコマンドが貼り付けられてます。 f:id:serinuntius:20180718224134j:plain

5. いい感じにシェル芸してく

今回は、Issueに投稿された画像を抜いてきたいので、こんな感じになりました。

curl github.com/.../../ -H '....' \ 
|grep '<img' \
|egrep -o "https://user.*?\.(png|jpg)"\
|uniq\
|xargs wget

一応説明しておくと、

  1. grep '<img'で当たりをつける
  2. grepの拡張版であるegrepで正規表現を使っていい感じに抜き取る (oオプションはマッチした場所だけ取ってくる便利なオプションです。egrepじゃなくて、grepのEオプションでも可)
  3. 何個か重複してたりしたので、uniqをかませる
  4. xargsでwgetにurlを渡す (ここで意外なのが、画像には認証が不要というとところです。 uuid振ってあるから、大丈夫という認識なのでしょうか?)

まとめ

これを頼まれて5分ぐらいでサクッとやって「出来たよ」って言って渡せば、モテること間違いなしですね!!!!

f:id:serinuntius:20180718225759p:plain

(念の為言っておきますがこれでモテていると勘違いしているわけではありません。24年生きてるので、それぐらいわかっているつもりです。)