NewsPicksでスクレイピングやってみた
こんにちは。駆け出しエンジニアの太鼓眼鏡です。
まだまだ研修中の身ですが、今日も書いたものや学んだことをシェアしていきます。
今日作ったのは、NewsPicksの記事をpicksした人から、影響力の大きい人だけを抽出する仕組みです。 先日から研修ではJSPやサーブレットを用いてECサイトを作る課題をやっているので、 そこで得た知識と、googleさんの力を借りて作成しました。
ファイルはこちらからご覧ください。 よくわからないままに書いている箇所もたくさんありますが、ご了承ください。 github.com
前提条件
- 記事のURLを投げると、「影響力の大きいpicker」の情報が見れるようにしたい
- 「影響力の大きい」=1000人以上following、followerがいる人と定義
- 表示したい情報は、ユーザID、名前、フォロワー数、フォロー数、ユーザURL
結果
今回は色々調べて、こちらを使いました。
jsoup.org Apache HttpClient - Tutorial
一応色々な記事に助けてもらいながら動かすことはできました。 ただ異常なほど重く、1500picksくらいされている記事を投げると1分強結果が返ってきません。
まずこの検索窓にNewsPicksの記事URLを投げます。
待つこと数十秒。。 こんな感じで結果が返ってきます(念のためモザイク処理しています)。
構造
図で書くとこんな感じ。
- まず「index.jsp」に対象サイトのURLを入力します
- POSTで「LinkConvertServlet.java」に記入されたURLを送ります
- 「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」に返します - 返ってきた配列を「result.jsp」に返します
- forループを用いて、配列をテーブルとして出力します
今後やりたいこと
- あまりにも重いのでもっと効率的に回したい
- 今回cssをいじってないので、もっときれいに出したい
- これセキュリティ的にどうなの?という箇所が多いのでサーバ周り勉強したい
参照した記事一覧
d.hatena.ne.jp d.hatena.ne.jp qiita.com d.hatena.ne.jp www.ctrlshift.net