首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于HTML抓取,还有比Jsoup更快的东西吗?

对于HTML抓取,还有比Jsoup更快的东西吗?
EN

Stack Overflow用户
提问于 2012-04-24 12:31:55
回答 4查看 11.9K关注 0票数 10

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

据我目前所知,图像显示在一个大小为12的GridView中,反映了图像板每页上的图像数量。我使用Jsoup从页面中抓取要在GridView中显示的缩略图URL,并获取当用户单击缩略图时要显示的全尺寸图像的URL。

现在的问题是,Jsoup平均需要8-12秒的时间来抓取HTML页面。我发现这是不可接受的,我想知道是否有任何方法可以让这件事更快,或者这将是一个固有的瓶颈,我无法做任何事情。

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

代码语言:javascript
复制
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();
}
EN

回答 4

Stack Overflow用户

发布于 2012-04-24 12:41:30

我使用Jsoup作为TLFN的刮刀,并且我在速度上没有问题。您应该缩小瓶颈。我认为是你的刮擦导致了速度问题。试着分别跟踪你的选择器和你的网络流量,看看是哪一个造成的。如果你的选择器是罪魁祸首,那么考虑寻找另一种查询方法,并对结果进行基准测试。

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

编辑

这不是你的问题,但要知道使用迭代器“可以”触发相当多的垃圾收集。通常情况下,这不是一个问题,尽管如果您在许多地方重复使用它们,它们可能会导致一些设备受到明显的性能影响。

不是很好

代码语言:javascript
复制
for (Element link : links)

更好

代码语言:javascript
复制
int i;
Element tempLink;
for (i=0;i<links.size();i++) {
   tempLink = links.get(i);
}

编辑2

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

票数 8
EN

Stack Overflow用户

发布于 2012-07-25 04:07:42

尽管这个问题略有不同,但它的答案与Scraping dynamically generated html inside Android app相同。

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

票数 3
EN

Stack Overflow用户

发布于 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):

这是我的代码:

代码语言:javascript
复制
// 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]+")");

更新:

代码语言:javascript
复制
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倍。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10291767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档