因此,我正在构建一个应用程序,它可以在更友好的界面中显示我访问的网站的图像板。目前它有很多问题,但现在最大的问题是获取图像来显示它们。
据我目前所知,图像显示在一个大小为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();
}发布于 2012-04-24 12:41:30
我使用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-07-25 04:07:42
尽管这个问题略有不同,但它的答案与Scraping dynamically generated html inside Android app相同。
简而言之,您应该将“下载和解析”部分卸载到远程web服务。有关讨论,请参阅Web Scraping from Android。
发布于 2013-02-27 21:22:36
我也遇到了同样的问题:
我的HTC One S上的Logcat清楚地显示,连接响应只需要前4秒(3个并行连接)。解析大约需要30-40秒,这是一段很长的时间。请注意,HTC One S有一个非常快的双核@1,4 the。问题显然与仿真器无关
02-27 14:11:55.278:调试/我的活动(10735):=c> 02-27 14:11:55.278:调试/我的活动(10735):=c> 02-27 14:11:55.278:调试/我的活动(10735):=c> 02-27 14:11:59.002:调试/我的活动(10735):
这是我的代码:
// 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=我得到了一些新的结果..之前的版本来自以调试的身份在安卓上运行我的应用程序。现在发布的结果是在不使用调试模式的情况下运行的(来自IntelliJ集成开发环境)。有没有解释为什么调试会让Jsoup变得这么慢?
在我的i5台式机上运行调试时,我没有得到性能上的损失。
我的代码在安卓上如此缓慢的罪魁祸首肯定是调试模式的模式。它使jsoup的速度慢了100倍。
https://stackoverflow.com/questions/10291767
复制相似问题