gpt4 book ai didi

webview - 在 Webview/中禁用自动图像加载

转载 作者:行者123 更新时间:2023-12-01 09:33:20 28 4
gpt4 key购买 nike

我正在使用 JavaFX webview 开发一个网络爬虫。出于抓取目的,我不需要加载图像。当页面被加载时,Webkit 会产生很多 UrlLoader 线程。所以我认为最好禁用图像,这样我会节省很多系统资源。有谁知道如何禁用 Webview 中的自动图像加载?

最佳答案

解决方法

为 http 定义您自己的协议(protocol)处理程序并过滤掉任何具有图像 mime 类型或内容的内容。

URL.setURLStreamHandlerFactory(new HandlerFactory());

示例代码

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.web.*;
import javafx.stage.Stage;

import java.io.IOException;
import java.net.*;

public class LynxView extends Application {
private static final String BLANK_IMAGE_LOC =
"https://upload.wikimedia.org/wikipedia/commons/c/ce/Transparent.gif";
public static final String WEBSITE_LOC =
"http://fxexperience.com";
public static final String IMAGE_MIME_TYPE_PREFIX =
"image/";

@Override
public void start(Stage stage) throws Exception {
WebView webView = new WebView();
WebEngine engine = webView.getEngine();
engine.load(WEBSITE_LOC);

stage.setScene(new Scene(new StackPane(webView)));
stage.show();
}

public static void main(String[] args) throws IOException {
URL.setURLStreamHandlerFactory(new URLStreamHandlerFactory() {
@Override
public URLStreamHandler createURLStreamHandler(String protocol) {
if ("http".equals(protocol)) {
return new sun.net.www.protocol.http.Handler() {
@Override
protected URLConnection openConnection(URL url, Proxy proxy) throws IOException {
String[] fileParts = url.getFile().split("\\?");
String contentType = URLConnection.guessContentTypeFromName(fileParts[0]);
// this small hack is required because, weirdly, svg is not picked up by guessContentTypeFromName
// because, for Java 8, svg is not in $JAVA_HOME/lib/content-types.properties
if (fileParts[0].endsWith(".svg")) {
contentType = "image/svg";
}
System.out.println(url.getFile() + " : " + contentType);
if ((contentType != null && contentType.startsWith(IMAGE_MIME_TYPE_PREFIX))) {
return new URL(BLANK_IMAGE_LOC).openConnection();
} else {
return super.openConnection(url, proxy);
}
}
};
}

return null;
}
});

Application.launch();
}
}

示例注释

示例使用的概念来自:

该示例仅探测文件名以确定内容类型,而不是附加到 url 的输入流。虽然探测输入流将是一种更准确的方法来确定 url 所连接的资源是否实际上是图像,但探测流的效率略低,因此提出的解决方案以准确性换取效率。

提供的解决方案仅演示了由 http 协议(protocol)提供的位置,而不是由 https 协议(protocol)提供的位置。

提供的解决方案使用了一个 sun.net.www.protocol.http.Handler 类,该类在 Java 9 中可能不公开可见,(因此该解决方案可能不适用于 Java 9)。

urlStreamHandlerFactory 是 JVM 的全局设置,因此一旦设置,它将保持这种状态(例如,任何 java.net.URL 连接的所有图像都将被忽略)。

示例解决方案返回一个空白(透明)图像,它通过网络加载。为了提高效率,图像可以作为资源从类路径而不是通过网络加载。

你可以返回一个空连接而不是一个空白图像的连接,如果你这样做了,web View 代码将开始向控制台报告空指针异常,因为它没有得到它期望的 url 连接,并且会用 x 图像替换所有图像以显示图像丢失(我不会真正推荐返回空连接的方法)。

关于webview - 在 Webview/中禁用自动图像加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12524580/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com