0

Web サイトの HTML ページ ソースをリッピングして電子メールを取得しようとしています。リッパー/ダンパーまたはそれを呼び出したいものを実行すると、すべてのソースコードが取得されますが、160 行目で停止しますが、手動で Web ページに移動し、右クリックして [ページのソースを表示] をクリックし、テキストを解析できます。ソース コード全体は 200 行強です。手動で各ページに移動して右クリックすることの唯一の問題は、10 万ページを超えるページがあり、時間がかかることです。

ページのソースを取得するために使用しているコードは次のとおりです。

    public static void main(String[] args) throws IOException, InterruptedException {

    URL url = new URL("http://www.runelocus.com/forums/member.php?102786-wapetdxzdk&tab=aboutme#aboutme");
    URLConnection connection = url.openConnection();

    connection.setDoInput(true);
    InputStream inStream = connection.getInputStream();
    BufferedReader input = new BufferedReader(new InputStreamReader(
            inStream));

    String html = "";
    String line = "";
    while ((line = input.readLine()) != null)
        html += line;
    System.out.println(html);
    }
4

4 に答える 4

1

HTML ページのコンテンツをスクレイピングしようとしている場合、そのような生の接続を使用するべきではありません。既存のライブラリを使用する: HTML Unitは非常に一般的に使用されます。

URL を渡すと、ページを表すオブジェクトが提供され、すべての HTML マークアップがオブジェクトとして取得されます (たとえば、要素の Div オブジェクト、要素の HTMLAnchor オブジェクトなどを取得します)。HTML Unit のような既存のフレームワークを使用して、その上でページのコンテンツを読み取ることは、あなたの人生をずっと楽にしてくれます。

また、事前に決定されたページ マークアップを指定して、ドキュメント内を簡単にジャンプできるようにする検索 (例: elementById、elementByTagName、属性など) を実行することもできます。

必要に応じて、クリックなどをシミュレートすることもできます。

于 2012-07-09T14:55:01.997 に答える
0

これを見ると、whileループの条件が悪いと思います。使用している構文に慣れていません。念のために言っておきますが、私はしばらくの間Javaを使用していません。しかし、私はそれが読むべきだと感じています...

String line = input.readLine();
while(line != null)
{
    html += line; //should use a StringBuilder here for optimization
    line = input.readLine();
}

StringBuilderの最適化に注意します。また、Scannerクラスを使用するとこれが簡単になると思います。

于 2012-07-09T16:13:49.500 に答える
0

別の文字セットで InputStreamReader を開くと役立つのではないでしょうか? あなたが言及したページを見ると、文字セットはISO-8859-1です:

BufferedReader input = 
    new BufferedReader(new InputStreamReader(inStream, "ISO-8859-1"));
于 2012-07-09T17:23:06.087 に答える
0

コードを実行したところ、HTML 終了タグを含むすべての HTML を取得しているようです。

詳細を表示するには、Web サイトにログインする必要がある可能性について考えましたか? その場合、ユーザー tsOverflow のようなライブラリが役立つ可能性があります。

于 2012-07-09T15:30:06.643 に答える