10

因此,我正在构建一个应用程序,该应用程序可以在更用户友好的界面中显示来自我访问的网站的图像板。目前它存在很多问题,但目前最大的问题是获取图像以显示它们。

我现在的方式是,图像显示在大小为 12 的 GridView 中,镜像图像板每页上的图像数量。我正在使用 Jsoup 为要在 GridView 中显示的缩略图图像 URL 抓取页面,并在用户单击缩略图时获取要显示的全尺寸图像的 URL。

现在的问题是,Jsoup 平均需要 8-12 秒才能获取 HTML 页面。我觉得这是不可接受的,我想知道是否有任何方法可以加快速度,或者这是否会成为我无能为力的固有瓶颈。

这是我用来获取要抓取的页面的代码:

try {
    Document doc = Jsoup.connect(url).get();
    Elements links = doc.select("img[src*=/alt2/]");
    for (Element link : links) {
        thumbURL = link.attr("src");
        linkURL = thumbURL.replace("/alt2/", "/").replace("s.jpg", ".jpg");
        imgSrc.add(new Pair<String, String>(thumbURL, linkURL));
    }
}
catch {
    e.printStackTrace();
}
4

4 回答 4

8

我将 Jsoup 用于 TLFN 刮板,速度没有问题。你应该缩小瓶颈。我认为是您的刮擦导致了速度问题。尝试分别跟踪您的选择器和网络流量,看看应该归咎于哪个。如果你的选择器是罪魁祸首,那么考虑寻找另一种方法来查询和基准测试结果。

为了更快、更普遍地进行测试,您总是可以从一个普通的 Java 项目中运行 Jsoup,当您觉得自己已经改进了它时,将它放回设备上,看看它是否有类似的性能改进。

编辑

并不是说这是您的问题,但请注意,使用迭代器“可能”会触发相当多的垃圾收集。通常这不是问题,尽管如果您在许多地方重复使用它们,它们可能会导致某些设备的性能受到明显影响。

不是很好

for (Element link : links)

更好的

int i;
Element tempLink;
for (i=0;i<links.size();i++) {
   tempLink = links.get(i);
}

编辑 2

如果图像 URL 以 /alt2/ 开头,您可以使用 ^= 而不是 *=,这可能会使搜索速度更快。此外,根据 HTML 的数量,您可能会浪费大量时间在完全错误的位置查找这些图像。检查这些图像是否包装在可识别的容器中,例如<div class="posts">. 如果您可以缩小要筛选的 HTML 数量,可能会提高性能。

于 2012-04-24T04:41:29.513 回答
3

虽然略有不同,但这个问题的答案与Scraping dynamic generated html inside Android app的答案相同。

简而言之,您应该将“下载和解析”部分卸载到远程 Web 服务。有关讨论,请参阅Android 中的 Web Scraping

于 2012-07-24T20:07:41.980 回答
2

我遇到了同样的问题:

我的 HTC One S 上的 Logcat 清楚地显示连接响应只需要前 4 秒(3 个并行连接)。解析几乎需要 30-40 秒,这是一个巨大的时间.. 请注意,HTC One S 具有非常快的双核 @ 1,4ghz .. 问题显然与模拟器无关

02-27 14:11:55.278: DEBUG/MyActivity(10735): =c>
02-27 14:11:55.278: DEBUG/MyActivity(10735): =c>
02-27 14:11:55.278: DEBUG/MyActivity(10735): =c>
02-27 14:11:59.002: DEBUG/MyActivity(10735): <r=
02-27 14:11:59.012: DEBUG/MyActivity(10735): <r=
02-27 14:11:59.422: DEBUG/MyActivity(10735): <r=
02-27 14:12:33.949: DEBUG/MyActivity(10735): <d=
02-27 14:12:37.463: DEBUG/MyActivity(10735): <d=
02-27 14:12:38.294: DEBUG/MyActivity(10735): <d=

这是我的代码:

// Jsoup-Connection
Connection c = Jsoup.connect(urls[0]);
// Request timeout in ms
c.timeout(5000);
Connection.Response r = c.execute();
Log.d("MyActivity","<r= doInBackground ("+urls[0]+")");

// Get the actual Document
Document doc = r.parse();
Log.d("MyActivity","<d= doInBackground ("+urls[0]+")");

更新:

02-27 20:38:25.649: INFO/MyActivity(18253): !=c> 
02-27 20:38:27.511: INFO/MyActivity(18253): !<r= 
02-27 20:38:28.873: INFO/MyActivity(18253): !#d=

我得到了一些新的结果 .. 以前的结果是在 android 上运行我的应用程序作为调试.. 现在发布的结果是在没有调试模式的情况下运行(来自 IntelliJ IDE).. 有什么解释为什么调试会使 Jsoup 这么慢?

在我的 i5-Desktop-Machine 上运行调试,我没有受到性能惩罚。

我的代码在 Android 上这么慢的罪魁祸首绝对是调试模式模式 .. 它使 jsoup 减慢了 100 倍。

于 2013-02-27T13:22:36.103 回答
0

您能否更好地识别您想要获取的内容,因为只有一个原因会减慢代码的执行速度

select("img[src*=/alt2/]")

您想要获得的图像是否有任何共同的“类”?

于 2012-04-24T06:49:36.550 回答