スクレイピングし特定の要素をファイルに書き出す


やること

jsoupというライブラリを使ってスクレイピングし、特定の要素をファイルに書き出す。その際JSON形式で書き出す。(eclipseで動作)

背景

サービスの連携先を調べていたら、幸運にも(?)たくさん連携先があるサービスに出会いました。これらのサービス名をコピーしてJSON形式{"Name":"Service_name","Connectivity":"1"}に入れていくのは大変だと思い作成。
今回扱うサービスはHighriseの連携先

使うライブラリ

jsoupというHTMLをスクレイピングができるライブラリを使う。
公式ページ:http://jsoup.org/
ダウンロードページ:http://jsoup.org/download

Webページのどのタグに欲しい情報があるか確認

HTMLを見てみると、、

となり欲しい情報(サービスの名前)はappクラスのh4タグのaタグの中であると確認できました。

Eclipseにダウンロードした.jarファイルを追加

[package]を右クリック→[ビルドパス]→[ビルドパスの構成]をクリック
以下の画面が表示される。

[外部JARの追加]をクリックし、先ほどダウンロードしたjsoupの.jarファイルを選択

その後[適用して閉じる]をクリック。これで追加完了。
"参照ライブラリー"というものができていてその中に追加された.jarファイルが入っていることを確認。

コードの作成

jsoupをインポート

Main.java
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

上記を記述。

ファイル操作を書いていく

例外処理など忘れずに。

Main.java
import java.io.FileWriter;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class Main {

 public static void main(String[] args) {
  FileWriter fw = null;
  try {
    //ファイルの書き込み
  }catch(IOException e) {
         System.out.println("ファイル書き込みエラーです");
    }finally {//ファイルを閉じる
        if(fw != null) {
            try {
            if(fw != null) {
              fw.close();
            }
            }catch(IOException e2) {}
        }
     }
 }
}

ファイルの書き込み部分にコードを書いていく

Main.java
                        //ファイルを開く
            fw = new FileWriter("[書き込むファイルのパス]", true);
            //ファイルに書き込む
            Document document = Jsoup.connect("https://highrisehq.com/extras/").get();
            Elements elements = document.select(".app h4 a");
            for (Element element : elements) {
                String name = element.text();
                fw.write("{\"Name\":\"" + name + "\",\"Connectivity\":\"1\"}\n");
                System.out.println(name);
            }
            fw.flush();

 Jsoup.connect("URL").get();でWebサイトのHTMLを読み込み
document.select("タグ");で必要なHTMLタグを見つける。この場合、複数該当するのでelementsには該当するものが全部入っています。
forで1つづつ取り出します
element.text();で該当したHTMLのテキストを取得。(属性の場合はtextではなくattr("属性名")
ファイルに書き込む際はJSON形式なので今回は{"Name":"Service_name","Connectivity":"1"}に合わせる。

こんな感じで書き出せました。めでたしめでたし。

※サイトの連携先一覧におすすめサービスがあり4つ重複がありました。(書き出したもののはじめ4つ)

参考にさせていただいたもの

ありがとうございました。
jsoup使い方メモ:https://qiita.com/opengl-8080/items/d4864bbc335d1e99a2d7
Javaでスクレイピングをしよう!!:https://qiita.com/takahiroSakamoto/items/c2b269c07e15a04f5861
■[Java][Html Parser][jsoup]jqueryみたいに、htmlを操作できるJavaのライブラリ「jsoup」の使い方。:http://d.hatena.ne.jp/it-tech-dm/20110123/1295774869