还有比Jsoup更快的HTML搜刮吗?[关闭]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了还有比Jsoup更快的HTML搜刮吗?[关闭]相关的知识,希望对你有一定的参考价值。
所以我在做一个应用,把我去的一个网站上的图片板以更友好的界面显示出来。目前有很多问题,但现在最大的问题是获取图片显示图片。
我现在的方式是,图片显示在一个大小为12的GridView中,镜像图像板每页的图片数量。我使用Jsoup在页面上搜索缩略图的URLs来显示在GridView中,同时也获取用户点击缩略图时显示全尺寸图片的URLs。
现在的问题是,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();
我用Jsoup做TLFN的搜刮器,速度没有问题。你应该缩小瓶颈。我推测是你的抓取导致了速度问题。试着分别追踪你的选择器和你的网络流量,看看是哪个原因。如果你的选择器是罪魁祸首,那么考虑寻找另一种方法进行查询,并对结果进行基准测试。
为了更快的,一般的想法,测试你总是可以从一个正常的Java项目中运行Jsoup,当你觉得你已经改进了它,把它扔回设备上,看看它是否有类似的性能改进。
EDIT
并不是说这是你的问题,但要注意使用迭代器 "会 "导致相当多的垃圾收集被触发。通常情况下,这并不是一个问题,尽管如果你在很多地方使用它们,并且有很多重复,它们会导致一些设备的性能受到明显的影响。
不是很好
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数量,可能会提高性能。
虽然稍有不同,但这个问题的答案与以下问题相同 在Android应用中动态生成html的抓取.
简而言之,你应该把 "下载&解析 "的部分卸载到远程Web服务上。请看 从安卓系统中提取网页信息 进行讨论。
我遇到了非常相同的问题。
我的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=
我得到了一些新的结果... ...之前的那些都是在安卓系统上运行我的应用程序作为 调试 ......现在发布的结果是在没有调试模式下运行的结果(来自IntelliJ IDE)......任何解释为什么调试会让Jsoup这么慢?
在我的i5-Desktop-Machine上运行调试模式,我没有得到任何性能惩罚。
为什么我的代码在android上这么慢的罪魁祸首肯定是 DEBUG-Mode 模式......它使jsoup慢了100倍。
你能不能更好的确定你想要得到的内容,因为只有一个原因会拖慢你的代码执行速度。
select("img[src*=/alt2/]")
有什么共同的 "类 "与你想得到的图像?
以上是关于还有比Jsoup更快的HTML搜刮吗?[关闭]的主要内容,如果未能解决你的问题,请参考以下文章