从网站上拍照,并在JavaFX中加载它们

时间:2016-05-19 04:11:44

标签: java image javafx web-scraping

现在我正在开发一个GUI项目,我正在尝试从网站源代码中找到的URL中找到照片,然后将它们加载到我的JavaFx GUI中。 例如,我希望Java加载网站http://www.imdb.com/movies-in-theaters/?ref_=nv_tp_inth_1,并收集您在向下滚动页面时看到的所有“封面照片”/缩略图(无论图像的大小),然后加载它们进入GUI视图(例如,作为一堆ImageViews进入HBox)。

更深入,最终我想得到它,用户可以点击图像/图像视图,并且(例如)它将显示显示所选电影的预告片。 (我的想法是,可以从网站上找到预告片链接,如果你点击并转到下一页,找到链接,转到youtube,并删除除了视频播放器之外的所有内容)。

在我使用的网络浏览器中,我可以访问该页面的HTML元素/设计,并查看所有源代码。经过几次旋转之后,我可以轻松找到我正在寻找的缩略图/图像的直接URL,我发现在javaFX中我可以将图像作为URL加载到我的GUI中,如下所示:

Image img = new Image("http://website/websiteSubPage/websiteImage");
ImageView imgView = new ImageView(img);

我还发现我正在寻找的概念被称为WebScraping ......但到目前为止我所研究和研究的所有模块都无法满足我的需求。到目前为止,我发现的最接近的模块是HtmlUnit。但是,HtmlUnit完全是关于Web自动化 - 我找不到任何关于查找照片的文档,并将其作为Java Image对象加载,可以调用到ImageView中。

我现在最好的猜测是让Java在后台加载网站,收集源代码,然后我可以创建一个各种各样的String Manipulator,它基本上只是查找,修剪和加载URL它找到的每个图像,并把它放入一个装满ImageViews的HBox。

最终,我觉得我唯一的解决方案看起来像这样:

public HBox listView(){
    HBox temp = new HBox();
    // Load the website
    // Load the source code into a large string.
    for (int i=0; i>=<numberOfPhotosPreCalculatedSomeHow>;i++){
        Image img = new Image( /*Manipulated string algorithm to find the next image URL*/);
        ImageView imgView = new ImageView(img);
        ImageView.setOnAction(e -> { /* load the trailer */ }; } // (Lambda)
        temp.getChildren().add(ImageView);
    } 
return temp;
}

然而,做所有这些......让我觉得我做的事情非常糟糕,我需要一些帮助。

思考?是否有专门为此构建的模块或插件?这可能,还是只是愚蠢?

1 个答案:

答案 0 :(得分:1)

找到答案! 有内置的java方法,可以让我从网站扫描信息,然后根据需要解密。

就我而言,这里是我使用的代码:

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Scanner;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ScrollPane;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class WebReader extends Application{
    // Class variable to hold our found URLs :)
    static ArrayList<String> listArray;

    public static void main(String[] args) throws IOException {
        // Gather page & URL data, and read it
        String address = "http://reddit.com";
        URL pageLocation = new URL(address);
        Scanner in = new Scanner(pageLocation.openStream());
        // Initialize an ArrayList to store all of our collected URLs
        listArray = new ArrayList<String>();
        // Decipher the code line by line
        while (in.hasNext()) {
            String line = in.next();
            if (line.contains("href=\"http://")) {
                int from = line.indexOf("\"");
                int to = line.lastIndexOf("\"");
                System.out.println(line.substring(from + 1, to));
                listArray.add(line.substring(from + 1, to));
            }
        }

        // Next, we implement into JavaFx
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("My loaded photos");
        // Create a place to put our content
        HBox content = new HBox();
        ScrollPane scrollPane = new ScrollPane(content);
        scrollPane.setFitToHeight(true);
        System.out.println(listArray.size());
        for (int i = 0; i <= listArray.size() - 1; i++) {
            Image img = new Image(listArray.get(i));
            ImageView imgView = new ImageView(img);

            content.getChildren().add(imgView);
        } // Launch and sail away!! :)

        Scene s = new Scene(scrollPane, 800, 600);
        primaryStage.setScene(s);
        primaryStage.show();
    }
}

所以这是我能找到的解决方案 - 我无法相信我花了这么长时间才找到解决方案,但我希望这能帮助任何和我在同一条船上的人。 :)