4Uをクローリングして画像リンクを抽出する

このエントリはクローラー/スクレイピング Advent Calendar 2014 - Qiitaの21日目になります。

4Uという美女画像を投稿してみんなで共有するソーシャルブックマークサービスをクローリング/スクレイピングしてみたいと思います。

4U

4Uが公開されたのは2008年なのでWebサービスとしては老舗です。
今年の2月にリニューアルがあり、ページ構造が変更されています。
リニューアル前のページ構造に対応したものは誰かが作っていますが、リニューアル後のページ構造に対応したものはなさそうなので作ってみました。

4Uのページ構成

いわゆる一覧ページ(小さい画像が並んだページ)と詳細ページ(大きい画像があるページ)で構成されています。
ほしいのは大きい画像なので以下のようにクローリング/スクレイピングします。

  1. 一覧ページから詳細ページへのリンクを抽出する
  2. 詳細ページから画像のURLを抽出する
  3. 一覧ページでページングできるところまでクローリングする

作ったもの

crawler4u.py

GitHubに置いてあります。

言語はPython2.7、HTMLパーサはBeautiful Soupを使っています。
引数に人名と出力先のパスを渡すと、詳細ページのURL、詳細ページにある画像のURL、引用元のURLをCSVで出力します。
ちなみにWindowsでしか試してないのでMacLinuxで動くかは不明です。

以下、ざっくりとした解説です。

詳細ページのリンクを抽出

詳細ページのパスはimage/xxxなのでaタグのhrefがimage/で始まるものを抽出します。
詳細ページのリンクが見つからない場合は処理を終了します。

詳細ページから画像のURLを抽出する

画像URLはimgタグのaltに人名があるので引数の人名と一致していればsrcの値を抽出します。

GitHubのソースでは引用元のURLも抽出していますが、引用元のURLは<td class="t-left">の直下にあるaタグを抽出します。
Beautiful SoupだとjQueryセレクタのようにsoup.select("td.t-left a")と書けます。

ページングできるところまで一覧ページ(list.php)をクローリング

一覧ページは13件ずつ表示されることを考慮します。
GETパラメータのlimがそのページの起点(例えばlim=13なら14~26件を表示)になるのでlimを13ずつ増やしながらクローリングすると全てのURLを抽出できます。

ここまで美女画像がぜんぜん出てきていないので、このプログラムを使って集めたURLから美女画像をGetした結果をのせておきます。
吉木りさ」で抽出した結果から得た画像をダウンロードしています。*1
4UだとGoogle画像検索のように関係ない画像が混ざらないのがよいです。


本当は引用元の画像の方がサイズが大きいので引用元から画像を抽出したかったけど簡単ではないので保留しました。*2

*1:2014/6のデータなので件数が現在より少ない

*2:引用元が画像の直リンクでないとか、Tumblrのリブログで実体がないとか、JavaScriptのページだとか