10

そこで、私がアクセスする Web サイトのイメージボードを、よりユーザー フレンドリーなインターフェイスで表示するアプリを作成しています。現時点では多くの問題がありますが、現時点で最大の問題は、画像を取得して表示することです。

私が今持っている方法では、画像はサイズ 12 の GridView に表示され、画像ボードの各ページの画像数を反映しています。Jsoup を使用して、GridView に表示するサムネイル画像の URL のページをスクレイピングし、ユーザーがサムネイルをクリックしたときに表示されるフルサイズの画像の URL を取得しています。

現在の問題は、Jsoup が HTML ページを取得するのに平均で 8 ~ 12 秒かかることです。これは容認できないと思います。これを高速化する方法があるかどうか、またはこれが私には何もできない固有のボトルネックになるかどうか疑問に思っていました。

スクレイピングするページを取得するために使用しているコードは次のとおりです。

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();
}
4

4 に答える 4

8

TLFN スクレーパーに Jsoup を使用しましたが、速度に問題はありませんでした。ボトルネックを絞り込む必要があります。速度の問題を引き起こしているのはあなたのスクレイピングだと思います。セレクターとネットワーク トラフィックを別々にトレースしてみて、どちらが原因かを確認してください。セレクターに問題がある場合は、クエリを実行して結果をベンチマークするための別のアプローチを見つけることを検討してください。

より高速で一般的なアイデアをテストするには、通常の 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-04-24T04:41:29.513 に答える
3

少し異なりますが、この質問にはAndroid アプリ内で動的に生成された html をスクレイピングする と同じ答えがあります。

つまり、「ダウンロードと解析」の部分をリモート Web サービスにオフロードする必要があります。議論については、Android からの Web スクレイピングを参照してください。

于 2012-07-24T20:07:41.980 に答える
2

私はまったく同じ問題に遭遇しました:

私のHTCOneSのLogcatは、接続応答に最初の4秒しかかからないことを明確に示しています(3つの接続が並列になっています)。解析には約30〜40秒かかりますが、これは非常に長い時間です.. HTCOneSのデュアルコアは非常に高速であることに注意してください@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=

いくつかの新しい結果が得られました..以前の結果は、Androidでデバッグとしてアプリを実行した結果です..現在投稿されている結果は、デバッグモードなしで実行した結果です(IntelliJ IDEから)..デバッグによってJsoupが非常に遅くなる理由は何ですか

i5-Desktop-Machineでdebugginを実行すると、パフォーマンスの低下はありませんでした。

私のコードがAndroidで非常に遅い原因は、間違いなくDEBUG-Modeモードです..jsoupの速度が100倍遅くなります。

于 2013-02-27T13:22:36.103 に答える
0

コードの実行を遅くする原因は 1 つしかないため、取得したいコンテンツをより適切に特定できますか?

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

取得したい画像に共通の「クラス」はありますか?

于 2012-04-24T06:49:36.550 に答える