有没有比Jsoup更快的HTML抓取?

因此,我正在构build一个应用程序,通过更友好的界面显示来自网站的图像板。 目前还有很多问题,但现在最大的问题是提取图像来显示它们。

我现在所拥有的方式是将图像显示在大小为12的GridView中,反映图像板每个页面上的图像数量。 我使用Jsoup来抓取缩略图图像url的页面以显示在GridView中,以及当用户单击缩略图时获取全尺寸图像的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(); } 

Solutions Collecting From Web of "有没有比Jsoup更快的HTML抓取?"

我用Jsoup做TLFN刮刀,速度没问题。 你应该缩小瓶颈。 我认为它是你的刮,这是造成速度问题。 尝试跟踪你的select和你的networkingstream量分开,看看是哪个责任。 如果您的select是责备,那么考虑find另一种方法来查询和基准结果。

为了更快速,一般的想法,testing你总是可以从一个普通的Java项目运行Jsoup,当你觉得你已经改进了它,把它扔回到设备上,看看它是否有类似的性能改进。

编辑

不是这是你的问题,但要注意使用迭代器'可以'会导致相当多的垃圾收集触发。 通常这不是一个问题,虽然如果你在很多地方重复使用它们,它们可能会导致一些设备性能明显下降。

不是很好

 for (Element link : links) 

更好

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

编辑2

如果图片url以/ alt2 /开头,则可以使用^ =而不是* =,这可能会使search速度更快。 另外,根据HTML的数量,你可能会浪费大量的时间在完全错误的地方寻找这些图像。 检查这些图像是否包含在可识别的容器内,如<div class="posts"> 。 如果你可以缩小HTML的数量来筛选它可以提高性能。

虽然稍有不同,但是这个问题与在Android应用程序中dynamic生成html的Scraping有相同的答案。

总之,你应该卸载“下载&parsing”部分到远程Web服务。 查看来自Android的Web Scraping进行讨论。

查看Bobik ,一个实时抓取的平台,特别是这个页面 。

我遇到了同样的问题:

我的HTC One S上的Logcat清楚地表明,连接响应只需要4秒(3个并行连接)。 parsing需要几乎30-40秒,这是一个巨大的时间..注意,HTC One S有一个非常快的dualcore @ 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= 

我得到了一些新的结果.. previosu的是从运行我的应用程序在Android上作为DEBUGGING ..现在发布的结果是从运行没有debugging模式(从IntelliJ IDE)..任何解释为什么debugging使Jsoup这么慢?

在我的i5-Desktop-Machine上运行debugging版我没有任何性能损失。

罪魁祸首,为什么我的代码是如此缓慢的Android是最初的debugging模式模式..它减慢了100倍的下降。

你能更好地识别你想得到的内容,因为只有一个原因可能会减慢你的代码的执行

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

有没有与你想要得到的图像有共同的“类”?