はじめに

webページの特定の要素だけ最短で取得したい人に参考になると思います。

大人向けのユーザー投稿型サイトで、URLを投稿するとURL先のサムネイルとタイトルを自動的に表示していたので、どんな処理になっているのかローカルで試してみました。

Jsoupとは

Javaでwebサイトをスクレイピングするためのライブラリです。
https://jsoup.org/

準備

Spring boot環境なので、Pom.xmlに以下を追記します。

Pom.xml
 <dependency>
        <groupId>org.jsoup</groupId>
        <artifactId>jsoup</artifactId>
        <version>1.10.2</version>
  </dependency>

普通に使う場合は、以下よりJarをダウンロードして追加してください。

使い方

最短でサムネイルとタイトルを取得する方法を紹介します。

URLの指定

test.java
 document = Jsoup.connect(url).get()

connectメソッドの引数に設定されたURL先のHTMLを取得します。
取得したHTMLはDocumentオブジェクトに格納します。

タイトルとサムネイルの取得

Documentオブジェクトに格納されたいるHTMLから欲しい要素を取り出します。
要素の指定方法としては、1.DOMメソッドex,getElementById(String id) 2.selectorシンタックスを使用できるようですが、今回はselectorシンタックスで指定します。

test.java
thumbnailInfo[0] = document.select("head > meta[property=og:image]").attr("content");
thumbnailInfo[1] = document.select("head > meta[property=og:title]").attr("content");

thumbnailInfo[]はStringの配列です。
documentオブジェクトのselectメソッドの引数にselectorシンタックスを渡します。
selectorシンタックスはブラウザーの開発者ツールを使えば取得可能です。

Chromeの場合:
対象ページで開発者ツールを開く > 取得対象を選択して右クリック > コピー > Copy selector

selectメソッドだと以下のように要素ごと取得します。(サムネイルの例)
Jsoupではattrメソッドを使用して属性値も取得可能です。
今回は content=から先のサムネイルのパスが取得したいので、.attr("content");
を使用しています。

<meta property="og:image" content="" class="autolink">http://img-hw.xvideos-cdn.com/videos/thumbs169ll/7c/UUIDマルマルマル.jpg">

タイトルも同様に取得して以上です!

補足:ユーザーから投稿されるサイトが異なると、指定するシンタックスも変わる場合があるので、
URLを見て処理を変更する必要があります。確認できたサイトだと10サイト弱対応しているようでした。
複数サイト対応する場合こんな感じでしょうか。。。

test.java
package com.iso.ero.service;

import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class ThumbnailCollector {

    public String[] getThumbnailInfo(String url) throws Exception {

        String[] thumbnailInfo = new String[2]; //  thumbnailInfo[0] for URL ,  thumbnailInfo[1] for Title

        thumbnailInfo[0] = "0";
        thumbnailInfo[1] = "0";

        Document document;
        String type = null;

        boolean isURL = isURL(url);
        if (isURL) {
            type = checkURLType(url);
        } else {
            throw new Exception("URLではありません。");
        }

        switch (type) {
        case "ph":
        case "xv":

            try {
                document = Jsoup.connect(url).get();

                thumbnailInfo[0] = document.select("head > meta[property=og:image]").attr("content");
                thumbnailInfo[1] = document.select("head > meta[property=og:title]").attr("content");
                break; 

            } catch (IOException e) {
                e.printStackTrace();
            }
        case "others":

            break;

        }

        return thumbnailInfo;

    }

    public String checkURLType(String url) {

        String MatcherResult;
        String type = "others";

        Pattern pattern = Pattern.compile("jp.pornhub.com|pornhub.com|xvideos.com");
        Matcher matcher = pattern.matcher(url);

        boolean canFind = matcher.find();

        if (canFind) {
            MatcherResult = matcher.group();

            if (MatcherResult.equals("jp.pornhub.com") | MatcherResult.equals("pornhub.com")) {
                type = "ph";
            } else if (MatcherResult.equals("xvideos.com")) {
                type = "xv";
            } else {
                type = "others";
            }
        } else {
            type = "others";

        }

        return type;

    }

    public boolean isURL(String url) {

        Pattern pattern = Pattern.compile("^(https?)(:\\/\\/[-_.!~*\\'()a-zA-Z0-9;\\/?:\\@&=+\\$,%#]+)$");
        Matcher matcher = pattern.matcher(url);
        boolean isUrl = matcher.matches();

        return isUrl;

    }

}

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.