NewsPicksでスクレイピングやってみた

こんにちは。駆け出しエンジニアの太鼓眼鏡です。
まだまだ研修中の身ですが、今日も書いたものや学んだことをシェアしていきます。

今日作ったのは、NewsPicksの記事をpicksした人から、影響力の大きい人だけを抽出する仕組みです。 先日から研修ではJSPサーブレットを用いてECサイトを作る課題をやっているので、 そこで得た知識と、googleさんの力を借りて作成しました。

ファイルはこちらからご覧ください。 よくわからないままに書いている箇所もたくさんありますが、ご了承ください。 github.com

前提条件

  • 記事のURLを投げると、「影響力の大きいpicker」の情報が見れるようにしたい
  • 「影響力の大きい」=1000人以上following、followerがいる人と定義
  • 表示したい情報は、ユーザID、名前、フォロワー数、フォロー数、ユーザURL

結果

今回は色々調べて、こちらを使いました。

jsoup.org Apache HttpClient - Tutorial

一応色々な記事に助けてもらいながら動かすことはできました。 ただ異常なほど重く、1500picksくらいされている記事を投げると1分強結果が返ってきません。

まずこの検索窓にNewsPicksの記事URLを投げます。

f:id:cyclemem:20170528234912p:plain

待つこと数十秒。。 こんな感じで結果が返ってきます(念のためモザイク処理しています)。 f:id:cyclemem:20170528234917p:plain

構造

図で書くとこんな感じ。 f:id:cyclemem:20170528234923p:plain

  1. まず「index.jsp」に対象サイトのURLを入力します
  2. POSTで「LinkConvertServlet.java」に記入されたURLを送ります
  3. 「pickersList.java」にURLを送ります
    3-1. メソッド「execute」で、2-5のメソッドを順に呼び出し、最後にinfoListを返します
    3-2. 指定されたリンクから、pickしているユーザのIDを配列にして返します
    3-3. ユーザIDの配列からユーザの個別ページのhtmlを呼び出し、スクレイピングを行います。そのうちfollowerとfollowingが1000以上のユーザIDのみを新たに配列にして返します
    3-4. 生成された配列を用いて、該当ユーザの名前を配列にして返します
    3-5. 生成された配列を用いて、該当ユーザのフォロワー数とフォロー数を配列にして返します。
    3-6. 3-2~5で生成された配列から、「ユーザID、名前、フォロワー数、フォロー数、ユーザURL」を持つインスタンス「Info」を生成します。それらを「infoList」として、「LinkCOnvertServlet.java」に返します
  4. 返ってきた配列を「result.jsp」に返します
  5. forループを用いて、配列をテーブルとして出力します

今後やりたいこと

  • あまりにも重いのでもっと効率的に回したい
  • 今回cssをいじってないので、もっときれいに出したい
  • これセキュリティ的にどうなの?という箇所が多いのでサーバ周り勉強したい

参照した記事一覧

d.hatena.ne.jp d.hatena.ne.jp qiita.com d.hatena.ne.jp www.ctrlshift.net