JxBrowser 高效检索网站图标的策略
JxBrowser strategy for efficiently retrieving favicon
据我所知,JxBrowser 中没有用于网站图标的基础设施。图标不应该是标题事件的一部分吗?我认为我最好的选择是选择 http://<domain>/favicon.ico
但这将是很多冗余工作(http 客户端和缓存机制)。
有什么方法可以使用 JxBrowser 优雅地处理这个问题吗?
我尝试了两种策略来尝试可靠地获取资源,但它不够可靠:
基于事件的 url 获取(ResourceType.FAVICON
从未见过):
browser.context.networkService.resourceHandler = object : ResourceHandler {
override fun canLoadResource(p0: ResourceParams?): Boolean {
if (p0!!.resourceType == ResourceType.FAVICON) println(p0!!.url)
if (p0!!.resourceType == ResourceType.IMAGE && p0.url.contains("favicon")) println("found favicon url: ${p0.url}")
return true
}
}
// 基于 xpath 的方法
browser.addLoadListener(object : LoadListener {
override fun onDocumentLoadedInMainFrame(p0: LoadEvent) {
p0.inSwingThread {
val res = it.browser.document.findElements(By.xpath("//link[@rel=\"icon\" or @rel=\"shortcut icon\"]"))
res.forEach {
println("----------")
it.attributes.forEach { println(it.key + " " + it.value) }
}
}
}
// ...
}
现在 JxBrowser API 不提供允许下载 favicon.ico
文件的功能。我建议您使用标准 Java API 和 http://<domain>/favicon.ico
的方法。例如:
URL url = new URL("http://whosebug.com/favicon.ico");
InputStream in = new BufferedInputStream(url.openStream());
OutputStream out = new BufferedOutputStream(new FileOutputStream("D:/favicon.ico"));
for ( int i; (i = in.read()) != -1; ) {
out.write(i);
}
in.close();
out.close();
据我所知,JxBrowser 中没有用于网站图标的基础设施。图标不应该是标题事件的一部分吗?我认为我最好的选择是选择 http://<domain>/favicon.ico
但这将是很多冗余工作(http 客户端和缓存机制)。
有什么方法可以使用 JxBrowser 优雅地处理这个问题吗?
我尝试了两种策略来尝试可靠地获取资源,但它不够可靠:
基于事件的 url 获取(ResourceType.FAVICON
从未见过):
browser.context.networkService.resourceHandler = object : ResourceHandler {
override fun canLoadResource(p0: ResourceParams?): Boolean {
if (p0!!.resourceType == ResourceType.FAVICON) println(p0!!.url)
if (p0!!.resourceType == ResourceType.IMAGE && p0.url.contains("favicon")) println("found favicon url: ${p0.url}")
return true
}
}
// 基于 xpath 的方法
browser.addLoadListener(object : LoadListener {
override fun onDocumentLoadedInMainFrame(p0: LoadEvent) {
p0.inSwingThread {
val res = it.browser.document.findElements(By.xpath("//link[@rel=\"icon\" or @rel=\"shortcut icon\"]"))
res.forEach {
println("----------")
it.attributes.forEach { println(it.key + " " + it.value) }
}
}
}
// ...
}
现在 JxBrowser API 不提供允许下载 favicon.ico
文件的功能。我建议您使用标准 Java API 和 http://<domain>/favicon.ico
的方法。例如:
URL url = new URL("http://whosebug.com/favicon.ico");
InputStream in = new BufferedInputStream(url.openStream());
OutputStream out = new BufferedOutputStream(new FileOutputStream("D:/favicon.ico"));
for ( int i; (i = in.read()) != -1; ) {
out.write(i);
}
in.close();
out.close();