还有比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搜刮吗?[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

TagSoup vs. Jsoup vs. HTML Parser vs. HotSax vs [关闭]

是啥让 SPI 比 I2C 协议更快 [关闭]

比 JODCONVERTER 更快 [关闭]

类似 Node.js 的 Jsoup 库 [关闭]

为啥字符串-字符串连接比字符串长连接更快? [关闭]

有没有比我的笔记本电脑更快地执行我的 mysql 的地方? [关闭]