现在我正在开发一个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;
}
然而,做所有这些......让我觉得我做的事情非常糟糕,我需要一些帮助。
思考?是否有专门为此构建的模块或插件?这可能,还是只是愚蠢?
答案 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();
}
}
所以这是我能找到的解决方案 - 我无法相信我花了这么长时间才找到解决方案,但我希望这能帮助任何和我在同一条船上的人。 :)